最近开始linux的字符设备驱动的学习,对于我这种菜鸟,还是从LED的驱动开始吧!
学习一个驱动,我们首先要知道其工作原理和基础的硬件控制。
我的开发板是FL2440:
在s3c2440的cpu中有130多个多功能的输入输出引脚,分为8个端口:
— Port A(GPA): 25-output port
— Port B(GPB): 11-input/out port
— Port C(GPC): 16-input/output port
— Port D(GPD): 16-input/output port
— Port E(GPE): 16-input/output port
— Port F(GPF): 8-input/output port
— Port G(GPG): 16-input/output port
— Port H(GPH): 9-input/output port
— Port J(GPJ): 13-input/output port
这些端口都可以很容易的通过软件配置,他们的寄存器是相似的:(x为B、...、 H/J,没有GPAUP寄存器)
即为GPxCON用于选择引脚功能,GPxCON中每两位控制一根引脚:00表示输入、01表示输出、10表示特殊功能、11保留不用。GPxCON是用来设置输入输出属性的,也就是说,你不是要控制LED吗?现在你知道了LED的引脚有GPB0,GPB1,而GPBCON又是控制这些引脚的属性,那么现在我们要控制它闪烁就要设置这些引脚的属性为输出。
GPxDAT用于读/写引脚数据,当引脚被设为输入时,读此寄存器可知相应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可以令此引脚输出高电平或是低电平。
另外,GPxUP用于确定是否使用内部上拉电阻。某位为1时,相应引脚无内部上拉电阻;为0时,相应引脚使用内部上拉电阻。上拉电阻的作用在于:当GPIO引脚处于第三态(即不是输出高电平,也不是输出低电平,而是呈高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻、下拉电阻确定。
我们用到的寄存器的地址和位定义如下:
我们可以通过配置这些来控制我们的LED灯。因为:
从图中可以看出LED0、1、2、3分别连接到S3C2440的GPB5、GPB6、GPB8、GPB10这四个Pin脚,且为共阳极,当IO口输出为低时,对应的LED会点亮。
以LED0为例,其对应的pin脚为GPB5,当GPB5/nXBACK被配置成GPIO,方向为output后,若输出低电平,则LED0会被点亮。
(板子不一样的话,连接会不一样自己可以根据自己板子的底板原理图查找)