]本人用的是扬创科技的S3C2440,想学习相关驱动,看内核源码看的很晕,
比如LED驱动里面用到的函数s3c2410_gpio_setpin(led_table, !cmd);经过查询后知道该函数是设置相应GPIO口的值,但是对该函数的具体 ...
看一下 2440的 DataSheet里面 的 ioports一章节,你会 豁然开朗的
回复 #1 luozhao1984 的帖子
结合数据手册来看驱动 1.GPIO一般嵌入式处理器物理硬件上给出了很多引脚,有部分称为GPIO(一般目标的输入输出)
每个GPIO引脚要么用作输出0或1, 要么用作输入0或1, 代表了一个二进制信息位.
从功能上来说,如果只关注GPIO引脚的高低电平变化,那就是GPIO的一般功能。
但是有些GPIO引脚可以用作集成在处理器片内的外设控制器的信号输入输出(用于控制特定的外设),这就是GPIO的特殊功能。
就是说GPIO引脚要么用作输入输出0或1信号(控制非处理指定的外设),要么用于控制处理器指定的外设,这是可以配置的。
2.GPIO引脚的配置
就拿s3c2440的GPBCON和GPBDAT寄存器来说
端口B有11个GPIO引脚
(1)GPBCON是端口B的配置寄存器,用于配置这11个引脚的功能
比如配置GPB10引脚, GPBCON寄存器的位可以配置成
00 = Input 01 = Output
10 = nXDREQ0 11 = reserved
如果配置成10就是这个引脚的特殊功能
如果配置成01就是GPB10引脚用于输出
(2)GPBDAT是端口B的数据寄存器
如果上述(1)中我们配置了GPB10引脚为输出(01), 那么只要向GPBDAT的第10个数据位写1, 物理硬件上就会在GPB10引脚输出高电平(信号1)
3.GPIO寄存器的物理地址
就上面的GPBCON和GPBDAT寄存器
datasheet上明确有
GPBCON 0x56000010
GPBDAT 0x56000014
4.GPIO寄存器的物理地址在arm虚拟地址空间的映射
如果linux打开了arm的mmu, 驱动程序中就不能直接访问上述的GPBCON或GPBDAT的物理地址, 必须先映射到虚拟地址
[ 本帖最后由 readkernel 于 2010-1-6 14:54 编辑 ] ioremap
脱离主题了。Google:lol: 那些宏看不明白?!
一层一层展开,展开完了你就明白了
很多宏为了增强通用性,套了很多层,虽然形式上搞的很复杂,但是功能一般都很简单,展开了一看就明白了
而且从最终的宏名上就能看出123来
看来LZ是太懒了,只对着源码过了一遍而已,就说看不明白
回复 #9 lelee007 的帖子
宏看不明白,是因为你没有理解IO对应的硬件操作特性
页:
[1]
2