文档介绍:从上次hello world程序中,我们已经搭建好了驱动学****相关的环境搭建,为接下来的设备驱动做好了准备。同时通过最简单的hello world程序,学****了模块的初始化和退出,知道了如何编写***_init和***_exit函数,知道了如何通过内核打印函数printk输出相关信息。Linux中的设备驱动分三大类:字符设备、块设备、网络设备。本篇文章讨论字符型设备程序如何编写,通过简单的LED驱动程序介绍相关知识。下篇文章介绍杂项设备(misc)驱动程序的编写,这在实际项目中很常用,相当于字符设备的简化版。首先附上完整程序:[plain] viewplaincopy</pre><pre name="code" class="plain">/*********************************************************************************************  * File:   * Author:   Fawen Xu  * Desc: led driver code  * History:  May 9th 2015  *********************************************************************************************/  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <linux/>  #include <asm/>  #include <asm/>  #include <asm/>  #include <linux/>    MODULE_AUTHOR("Fawen Xu");  MODULE_LICENSE("Dual BSD/GPL");    static unsigned int led_major=0;  static unsigned int bcm2835_gpio_baseaddr;     module_param(led_major,int,0);    #define LED_MAGIC 'k'  #define LED_ON_CMD _IO(LED_MAGIC,1)  #define LED_OFF_CMD _IO(LED_MAGIC,2)    //#define BCM2835_PERI_BASE           0x  //#define BCM2835_PERI_BASE           0x7e  #define BCM2835_GPIO_BASE           0x  #define BCM2835_GPIOReg_GPFSEL0     0x  #define BCM2835_GPIOReg_GPSET0      0xc  #define BCM2835_GPIOReg_GPCLR0      0x  #define BCM2835_GPIO_FSEL_INP       0x  #define BCM2835_GPIO_FSEL_OUTP      0x  #define RPI_BPLUS_GPIO_J8_12        18    int bcm2835_gpio_fsel(int pin, int mode)  {         volatile int shift,value;      volatile int *bcm2835_gpio_fsel_addrp = bcm2835_gpio_baseaddr + (pin/10)*4;      //printk("In bcm2835_gpio_fsel function:\n");      //printk("  pin = %d, (pin/10)*4= %d",pin,(pin/10)*4);      //printk("  bcm2835_gpio_baseaddr = 0x%x\n", bcm2835_gpio_baseaddr);      //printk("  bcm