Chinaunix首页 | 论坛 | 博客
  • 博客访问: 412763
  • 博文数量: 36
  • 博客积分: 960
  • 博客等级: 准尉
  • 技术积分: 1368
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-13 19:26
文章分类
文章存档

2018年(3)

2012年(6)

2011年(27)

分类: LINUX

2011-08-08 19:13:16

===========================================
本文系作者原创, 欢迎大家转载!
转载请注明出处:netwalker.blog.chinaunix.net
===========================================
 
硬件平台:
MainBoard:OK6410
CPU: S3C6410
RAM: 256M
FLASH:1G K9GAG08U0D
Kernel:Linux2.6.28
BootLoader:Uboot1.1.6
 
9.LED灯驱动
 
这几天研究USB驱动,不想板子的USB坏了,所以闲着没事就看了看LED灯驱动.OK6410没有使用内核提供的LED驱动模板,而是直接通过寄存器虚拟地址进行操作,比起USB驱动来说要简单得多。
 
首先还是从电路图开始:
 

 

User LED电路图

 

 

User LED CPU管脚接线图

 

从电路图文档中可以看出,LED是通过GPIOM端口实现的,其中分别用到了GPM0/1/2/3管脚。根据LED的接线图可以看出只有在NLED0/1/2/3为低电平时,才会导通点亮。M端口有6个管脚,三个对应的寄存器:

 

GPMCON是控制寄存器,控制管脚的功能:用作输入,输出等。

GPMDAT是数据寄存器,内容与管脚电平相一致,也即GPM0为高电平那么对应的0b11.

GPMPUD是用来控制功率输出的,通常在电平输出不符合要求是,实现电平的上拉和下拉。

 

                     相关寄存器文档(芯片手册300 pg.)

 

Bootloader中对应GPM初始化的代码位于board/samsung/smdk6410/lowlevel_init.S

  1. /* LED on only #8 */
  2. ldr r0, =ELFIN_GPIO_BASE
  3. ldr r1, =0x00111111
  4. str r1, [r0, #GPMCON_OFFSET]

  5. ldr r1, =0x00000555
  6. str r1, [r0, #GPMPUD_OFFSET]

  7. ldr r1, =0x002a
  8. str r1, [r0, #GPMDAT_OFFSET]

 

相关寄存器定义在include/s3c6410.h

 

  1. #define ELFIN_GPIO_BASE 0x7f008000
  2. #define GPMCON_OFFSET 0x820
  3. #define GPMDAT_OFFSET 0x824
  4. #define GPMPUD_OFFSET 0x828

ldr指令用来将立即数装载如寄存器,strr1中的值写入间址GPMDAT_OFFSET+r0ELFIN_GPIO_BASE定义的就是实际的物理地址,不难看出bootloader是实地址寻址的。

 

3行写入0x00111111GPMCON寄存器,也即配置GPM0-5为输出。

接着2行写入0x00000555GPMPUD寄存器,配置GPM0-5内部电阻下拉使能。这是因为如果要点亮LED,那么需要低电平,下拉可以保证下拉电阻接地产生低电平。

最后2行写入0x002aGPMDATA寄存器,也即0b101010,所以对应的GPM0/2/4是低电平,GPM1/3/5是高电平,与此相连的LED1/3点亮,LED2/4熄灭,这也就是为何开发板上电后LED1/3点亮的原因。

 

阅读(2148) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~