| 
		    
                    
   使用命令方式编译led 驱动模块: 
 
    
        
            #arm-linux-gcc -D__KERNEL__ -I/arm/kernel/include -DKBUILD_BASENAME=leds -DMODULE -c -o leds.o leds.c | 
         
    
 
  以上命令将生成leds.o 文件,把该文件复制到板子的/lib目录下,使用以下命令就可以安装leds驱动模块: 
 
  删除该模块的命令是: 
 
  4.块设备驱动
    块设备驱动程序的编写是一个浩繁的工程,其难度远超过字符设备,上千行的代码往往只能搞定一个简单的块设备,而数十行代码就可能搞定一个字符设备。因此,非得有相当的基本功才能完成此项工作。下面先给出一个实例,即 mtdblock块设备的驱动。我们通过分析此实例中的代码来说明块设备驱动程序的写法(由于篇幅的关系,大量的代码被省略,只保留了必要的主干): 
 
    
        
            #include <linux/config.h> #include <linux/devfs_fs_kernel.h> static void mtd_notify_add(struct mtd_info* mtd); static void mtd_notify_remove(struct mtd_info* mtd); static struct mtd_notifier notifier = {  mtd_notify_add,  mtd_notify_remove,  NULL }; static devfs_handle_t devfs_dir_handle = NULL; static devfs_handle_t devfs_rw_handle[MAX_MTD_DEVICES];
  static struct mtdblk_dev {  struct mtd_info *mtd; /* Locked */  int count;  struct semaphore cache_sem;  unsigned char *cache_data;  unsigned long cache_offset;  unsigned int cache_size;  enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state; } *mtdblks[MAX_MTD_DEVICES];
  static spinlock_t mtdblks_lock; /* this lock is used just in kernels >= 2.5.x */  static spinlock_t mtdblock_lock;
  static int mtd_sizes[MAX_MTD_DEVICES]; static int mtd_blksizes[MAX_MTD_DEVICES];
  static void erase_callback(struct erase_info *done) {  wait_queue_head_t *wait_q = (wait_queue_head_t *)done->priv;  wake_up(wait_q); }
  static int erase_write (struct mtd_info *mtd, unsigned long pos,  int len, const char *buf) {  struct erase_info erase;  DECLARE_WAITQUEUE(wait, current);  wait_queue_head_t wait_q;  size_t retlen;  int ret; | 
         
    
 
		    
                      
		      
		      
		   |