Makefile:<br />EXEC = leds.ko <br />OBJS = magic-leds.o <br />SRC = magic-leds.c <br /><br />INCLUDE = /zylinux/kernel/include<br />USEINC =.<br />CC = arm-linux-gcc<br />LD = arm-linux-ld<br />MODCFLAGS = -O2 -Wall -D__KERNEL__ -DMODULE -I$(INCLUDE) -I$(USEINC) -march=armv4t -c -o<br />LDFLAGS = -r<br /><br />all: $(EXEC)<br /><br />$(EXEC): $(OBJS)<br /> $(LD) $(LDFLAGS) -o $@ $(OBJS)<br /><br />%.o:%.c<br /> $(CC) $(MODCFLAGS) -mapcs -c $< -o $@<br /><br />clean:<br /> -rm -f $(EXEC) *.o *~ core<br /><br />cross_2.95.3.tar.bz2已经安装好:/usr/local/arm/下,环境变量已经设置好,编译其它的程序(不是驱动程序)都是可以用的。linux为redhat9.0,内核为:2.4.20-8<br /><br />magic-leds.c:<br /><br />#ifndef __KERNEL__<br /> #define __KERNEL__<br />#endif<br /><br />#ifndef MODULE<br /> #define MODULE<br />#endif<br /><br />#include <linux/config.h><br />#include <linux/module.h><br />#include <linux/kernel.h><br />#include <linux/init.h><br />#include <linux/sched.h><br /><br />#include <asm/hardware.h><br /><br />#define DEVICE_NAME "magic-leds"<br />//#define LED_MAJOR 231 //can be 231~239 or 240~254<br /><br />static unsigned long leds_table [] = <br />{<br /> GPIO_E11,<br /> GPIO_E12,<br /> GPIO_H4,<br /> GPIO_H6,<br /> GPIO_H10,<br />};<br /><br /><br />static int magic_leds_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)<br />{<br /> if (arg > 4) return -EINVAL;<br /><br /> switch(cmd) <br /> {<br /> case 0:<br /> case 1:<br /> write_gpio_bit(leds_table[arg], cmd);<br /> default:<br /> return -EINVAL;<br /> }<br />}<br /><br />static int magic_leds_open(struct inode *inode, struct file *filp)<br />{<br /> int i;<br /><br /> for (i = 0; i < 5; i++)<br /> {<br /> set_gpio_ctrl (leds_table | GPIO_PULLUP_EN | GPIO_MODE_OUT);<br /> write_gpio_bit(leds_table, 1);<br /> }<br /><br /> MOD_INC_USE_COUNT;<br /> printk(KERN_INFO DEVICE_NAME ": opened.
");<br /> return 0;<br />}<br /><br /><br />static int magic_leds_release(struct inode *inode, struct file *filp)<br />{<br /> MOD_DEC_USE_COUNT;<br /> printk(KERN_INFO DEVICE_NAME ": released.
");<br /> return 0;<br />}<br /><br />static struct file_operations magic_leds_fops = <br />{<br /> owner: THIS_MODULE,<br /> ioctl: magic_leds_ioctl,<br /> open: magic_leds_open,<br /> release: magic_leds_release,<br />};<br /><br /><br />static devfs_handle_t devfs_handle;<br />static int __init magic_leds_init(void)<br />{<br />// int result;<br /><br />// result = register_chrdev(0, DEVICE_NAME, &magic_leds_fops);<br />// if (result < 0) <br />// {<br />// printk(KERN_ERR DEVICE_NAME ": Failed to register major.
");<br />// return result;<br />// }<br /> devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_AUTO_DEVNUM,<br /> 0, 0, S_IFCHR | S_IRUSR | S_IWUSR, &magic_leds_fops, NULL);<br /><br /> printk(KERN_INFO DEVICE_NAME ": Initialize OK.
");<br /> return 0;<br />}<br /><br />static void __exit magic_leds_exit(void)<br />{<br /> devfs_unregister(devfs_handle);<br />// unregister_chrdev(0, DEVICE_NAME);<br />}<br /><br />module_init(magic_leds_init);<br />module_exit(magic_leds_exit);<br />
|