| 
		    
                    
   看看第一章电路板硬件原理图,板上包含四个用户可编程的发光二极管(LED),这些LED连接在ARM处理器的可编程I/O口(GPIO)上,现在来编写这些LED的驱动: 
 
    
        
            #include <linux/config.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/miscdevice.h> #include <linux/sched.h> #include <linux/delay.h> #include <asm/hardware.h> #define DEVICE_NAME "leds" /*定义led 设备的名字*/ #define LED_MAJOR 231 /*定义led 设备的主设备号*/ static unsigned long led_table[] = {  /*I/O 方式led 设备对应的硬件资源*/  GPIO_B10, GPIO_B8, GPIO_B5, GPIO_B6, }; /*使用ioctl 控制led*/ static int leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) {  switch (cmd)  {   case 0:   case 1:    if (arg > 4)    {     return -EINVAL;    }    write_gpio_bit(led_table[arg], !cmd);   default:    return -EINVAL;  } }  static struct file_operations leds_fops = {  owner: THIS_MODULE, ioctl: leds_ioctl, }; static devfs_handle_t devfs_handle; static int __init leds_init(void) {  int ret;  int i;  /*在内核中注册设备*/  ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &leds_fops);  if (ret < 0)  {   printk(DEVICE_NAME " can't register major number\n");   return ret;  }  devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, LED_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &leds_fops, NULL);  /*使用宏进行端口初始化,set_gpio_ctrl 和write_gpio_bit 均为宏定义*/  for (i = 0; i < 8; i++)  {   set_gpio_ctrl(led_table[i] | GPIO_PULLUP_EN | GPIO_MODE_OUT);   write_gpio_bit(led_table[i], 1);  }  printk(DEVICE_NAME " initialized\n");  return 0; }
  static void __exit leds_exit(void) {  devfs_unregister(devfs_handle);  unregister_chrdev(LED_MAJOR, DEVICE_NAME); }
  module_init(leds_init); module_exit(leds_exit); | 
         
    
 
		    
                      
		      
		      
		   |