5611|2

81

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

mini2440 LED及buttons驱动详解 [复制链接]

本文来自:http://imganquan.org/blog/?p=357
另有mini2440 buttons驱动详解:http://www.imganquan.org/code/modules/mini2440_buttons.c.html

从最简单的LED驱动入手,彻底细致的分析一遍mini2440的LED驱动。
官方手册上写,mini2440的四个LED与CPU的GPIO相连,LED1, LED2, LED3, LED4分别对应的
是GPB5, GPB6, GPB7, GPB8。那什么是GPIO呢?
GPIO是通用输入输出口的简称,只需要设置相应的CPU寄存器,就可以改变引脚的用途。
控制硬件,其实就是控制对应的寄存器。
四个LED的采用GPBCON寄存器上的4组2bit位来配置对应引脚的状态。4组2bit位的功能都
一样:00表示输入,01表示输出,10为特殊功能,11是保留的。
LED1对应的是GPB5, GPB5使用[11:10]位
LED2对应的是GPB6, GPB6使用[12:13]位
LED3对应的是GPB7, GPB7使用[14:15]位
LED4对应的是GPB8, GPB8使用[16:17]位
驱动需要先设置LED为输出状态,也就是要把对应的GPBX设置为01。
四个LED采用CPBDAT寄存器来对应4个LED的数值状态,GPBDAT5就对应GPB5,GPBDAT6就对
应GPB6,以此类推。手册上写低电平有效,就是说当GPBDAT寄存器位置为0时,LED就发光。
在三星官方的手册S3C2440.pdf中描述的寄存器状态如下:
GPB8 [17:16] 00 = Input 01 = Output
10 = nXDREQ1 11 = Reserved
GPB7 [15:14] 00 = Input 01 = Output
10 = nXDACK1 11 = Reserved
GPB6 [13:12] 00 = Input 01 = Output
10 = nXBREQ 11 = reserved
GPB5 [11:10] 00 = Input 01 = Output
10 = nXBACK 11 = reserved
GPBDAT Bit Description
GPB[10:0] [10:0] When the port is configured as input port, the corresponding
bit is the pin state. When the port is configured as output port, the pin state is the same
as the corresponding bit. When the port is configured as functional pin, the
undefined value will be read.
贴出添加注释后的代码,非常简单的驱动。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "leds" /* /dev目录下的设备名 */ /* GPBX */static unsigned long led_table [] = {        S3C2410_GPB5,        S3C2410_GPB6,        S3C2410_GPB7,        S3C2410_GPB8,};/* GPBX的输出状态 */static unsigned int led_cfg_table [] = {        S3C2410_GPB5_OUTP,        S3C2410_GPB6_OUTP,        S3C2410_GPB7_OUTP,        S3C2410_GPB8_OUTP,}; /* 驱动接口函数* ioctl的内核空间版本和用户控件的版本不同* 内核版为:* int (*ioctl)( struct inode *inode, struct file *file, unsigned int* cmd, unsigned long arg);* */static int sbc2440_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; /* Invalid argument,非法参数 */                }       /* 设置数据寄存器GPBDAT                * 低电平有效,用户程序传来的cmd取反                * */                s3c2410_gpio_setpin(led_table[arg], !cmd);                return 0;        default:                return -EINVAL;        }} /* 接口对象 */static struct file_operations dev_fops = {        .owner        =        THIS_MODULE,        .ioctl        =        sbc2440_leds_ioctl,}; /* 设备对象 */static struct miscdevice misc = {        .minor = MISC_DYNAMIC_MINOR, /* 动态设备号 */        .name = DEVICE_NAME, /* 将在/dev目录生成led设备 */        .fops = &dev_fops, /* 驱动接口 */}; static int __init dev_init(void){        int ret;         int i;         for (i = 0; i < 4; i++) {                /*设置GPIO对应的配置寄存器GPIOCON为输出状态*/                s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);                 /*设置GPIO对应的数据寄存器GPIODAT为低电平                 *在模块加载结束后,四个LED应该是全部都是发光状态*/                s3c2410_gpio_setpin(led_table[i], 0);        }         ret = misc_register(&misc); /* 注册设备 */         printk (DEVICE_NAME"\tinitialized\n"); /* dmesg */         return ret;} static void __exit dev_exit(void){        misc_deregister(&misc);                     /* 注销设备 */} module_init(dev_init); /* 声明加载模块初始化函数 */module_exit(dev_exit); /* 声明卸载模块清除函数 */MODULE_LICENSE("GPL"); /* 许可证声明 */MODULE_AUTHOR("FriendlyARM Inc."); /* 作者信息 */

[ 本帖最后由 xyz.eeworld 于 2009-9-24 10:14 编辑 ]

最新回复

学习学习!呵呵!  详情 回复 发表于 2012-5-5 14:53
点赞 关注

回复
举报

2131

帖子

0

TA的资源

至上芯片

沙发
 
好的学习一下!
 
个人签名处处留心皆学问!
 

回复

80

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 楼主 xyz.eeworld 的帖子

学习学习!呵呵!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表