视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
解析mini2440的LED驱动
2025-10-01 12:49:02 责编:小OO
文档

解析mini2440的LED驱动

//定义LED设备的名称,这里是leds,这个模块加载后,会自动在/dev目录里创建该名字的设备文件。

#define DEVICE_NAME "leds"

//mini2440开发板上有4个LED(发光二极管);

//这4个LED分别与S3C2440A的4个GPIO(通用可编程输入输出端口)的PIN(引脚)相连接;

//这4个GPIO应该被配置为输出模式,当GPIO设为0时,PIN输出低电平,LED将被点亮,

//而当GPIO设为1时,PIN输出高电平,LED将被熄灭。

//这里定义静态的全局的长整型数组,用于储存与这4个LED相连接的GPIO号。

static unsigned long led_table [] = {

    S3C2410_GPB5,

    S3C2410_GPB6,

    S3C2410_GPB7,

    S3C2410_GPB8,

};

//这里定义静态的全局的整型数组,用于储存这4个GPIO的配置,这里为输出模式。

static unsigned int led_cfg_table [] = {

    S3C2410_GPB5_OUTP,

    S3C2410_GPB6_OUTP,

    S3C2410_GPB7_OUTP,

    S3C2410_GPB8_OUTP,

};

//当应用层的ioctl(fd, cmd, arg)被调用时,系统将处理它能识别的命令;

//如果系统不能识别该命令,那么驱动层的ioctl将会被调用;

//如果驱动层的ioctl也不能识别该命令,应该返回-EINVAL。

static int sbc2440_leds_ioctl(

    struct inode *inode, 

    struct file *file, 

    unsigned int cmd,    //命令号

    unsigned long arg)  //参数

{

    switch(cmd) { //通过switch(分支选择)对cmd(命令)进行识别

    case 0:            //熄灭LED命令

    case 1:            //点亮LED命令

        if (arg > 4) {         //这里的arg(参数)是LED号,因为mini2440开发板上只有4个LED,所以arg只能取0、1、2、3

            return -EINVAL; //输入不合法,返回-EINVAL

        }

        s3c2410_gpio_setpin(          //s3c2410_gpio_setpin()函数用于设置GPIO的PIN的电平

                            led_table[arg], //把LED号转换为GPIO号

                            !cmd                //0是熄灭LED命令,PIN输出高电平,LED将被熄灭

                            );                      //1是点亮LED命令,PIN输出低电平,LED将被点亮

        return 0;                              //成功操作,应该返回0

    default:

        return -EINVAL;                    //不能识别该命令,应该返回-EINVAL

    }

}

//struct file_operations是文件操作结构体,

//用于存放设备能进行的各种操作的函数指针。

static struct file_operations dev_fops = {

    .owner    =    THIS_MODULE,            //为了防止设备在使用的过程中,模块被缷载掉,owner应该设置为THIS_MODULE

    .ioctl    =    sbc2440_leds_ioctl,         //ioctl函数指针指向上面的sbc2440_leds_ioctl()函数

};

//struct miscdevice是混杂设备结构体

static struct miscdevice misc = {

    .minor = MISC_DYNAMIC_MINOR,    //动态分配LED设备的次设备号

    .name = DEVICE_NAME,                  //name是设备名,在上面定义了DEVICE_NAME

    .fops = &dev_fops,                           //文件操作结构体指针fops指向上面的dev_fops

};

//设备初始化函数,加上__init,模块加载时,dev_init()函数将被调用

static int __init dev_init(void)

{

    int ret;

    int i;

    

    for (i = 0; i < 4; i++) {                   //4个LED

        s3c2410_gpio_cfgpin(                //s3c2410_gpio_cfgpin()函数用于配置GPIO的功能   

        led_table[i],                                //把LED号转换为GPIO号  

        led_cfg_table[i]                          //输出模式

        );

        

        s3c2410_gpio_setpin(                //s3c2410_gpio_setpin()函数用于设置GPIO的PIN的电平

                            led_table[i],            //把LED号转换为GPIO号  

                            0);                          //PIN输出低电平,LED将被点亮

    }

    //注册混杂设备misc

    ret = misc_register(&misc);

    //输出LED设备初始化完成

    printk (DEVICE_NAME"\initialized\\n");

    return ret;

}

//设备移除函数,加上__exit,模块缷载时,dev_exit()函数将被调用

static void __exit dev_exit(void)

{

    //取消注册混杂设备misc

    misc_deregister(&misc);

}

module_init(dev_init);                             //模块加载时,dev_init()函数将被调用

module_exit(dev_exit);                           //模块缷载时,dev_exit()函数将被调用

MODULE_LICENSE("GPL");                      //模块的许可权限,这里是GPL协议

MODULE_AUTHOR("FriendlyARM Inc."); //模块的作者--友善之臂公司

下载本文
显示全文
专题