linux驱动学习之LED篇(一)

来源:互联网 发布:织梦5.7自动内链失效 编辑:程序博客网 时间:2024/05/01 01:16

最近开始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分别连接到S3C2440GPB5GPB6GPB8GPB10这四个Pin脚,且为共阳极,当IO口输出为低时,对应的LED会点亮。

LED0为例,其对应的pin脚为GPB5GPB5/nXBACK被配置成GPIO,方向为output后,若输出低电平,则LED0会被点亮。

(板子不一样的话,连接会不一样自己可以根据自己板子的底板原理图查找)