luozhao1984 发表于 2010-01-04 17:20

Godbach 发表于 2010-01-05 11:03

LZ说一下自己的基础先

T-Bagwell 发表于 2010-01-05 11:37

原帖由 luozhao1984 于 2010-1-4 17:20 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
]本人用的是扬创科技的S3C2440,想学习相关驱动,看内核源码看的很晕,
比如LED驱动里面用到的函数s3c2410_gpio_setpin(led_table, !cmd);经过查询后知道该函数是设置相应GPIO口的值,但是对该函数的具体 ...

看一下 2440的 DataSheet里面 的 ioports一章节,你会 豁然开朗的

dreamice 发表于 2010-01-05 12:44

回复 #1 luozhao1984 的帖子

结合数据手册来看驱动

luozhao1984 发表于 2010-01-06 10:25

readkernel 发表于 2010-01-06 14:07

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 编辑 ]

luozhao1984 发表于 2010-01-06 15:14

readkernel 发表于 2010-01-06 15:25

ioremap
脱离主题了。Google:lol:

lelee007 发表于 2010-01-10 16:32

那些宏看不明白?!

一层一层展开,展开完了你就明白了

很多宏为了增强通用性,套了很多层,虽然形式上搞的很复杂,但是功能一般都很简单,展开了一看就明白了

而且从最终的宏名上就能看出123来

看来LZ是太懒了,只对着源码过了一遍而已,就说看不明白

dreamice 发表于 2010-01-11 12:11

回复 #9 lelee007 的帖子

宏看不明白,是因为你没有理解IO对应的硬件操作特性
页: [1] 2
查看完整版本: linux内核驱动源码学习的困惑