本文共 1862 字,大约阅读时间需要 6 分钟。
LED驱动
这个简单,因为是直接接在I/O上,所以就是写寄存器控制输出1或0。因为电路图上是这样做的,I/O->LED->Resistor->GND。所以I/O输入1点亮,输出0熄灭。
管脚对应如下
C5 KEY_COL0 ARM_LED1 ALT1 GPIO4_GPIO[6]
B3 KEY_ROW0 ARM_LED2 ALT1 GPIO4_GPIO[7]
E7 KEY_COL1 ARM_LED3 ALT 1 GPIO4_GPIO[8]
D6 KEY_ROW1 ARM_LED4 ALT1 GPIO4_GPIO[9]
C4 KEY_COL2 ARM_LED5 ALT1 GPIO4_GPIO[10]
F6 KEY_COL3 ARM_LED6 ALT1 GPIO4_GPIO[12]
因为i.mx53的PIN可以接到内部不同的功能模块上通过多路选择器IOMUX,所以必须要使用配置IOMUXC使I/O接到普通的GPIO模块上。
官方手册GPIO写模式
1. 配置IOMUXC寄存器选择引脚为GPIO模式
2. 配置GPIO_GDR方向寄存器为输出
3. 写GPIO_DR数据寄存器,控制输出0或1
一、I/O模式设置
ARM_LED1:
IOMUXC_KEY_COL0,Address 0x53FA_8000 base + 0x24offset=0x53FA_8024
当该寄存器[2:0]=001时,ALT1该引脚被配置成GPIO4功能模块的GPIO[6]引脚,即GPIO4_GPIO[6]。
ARM_LED2:
IOMUXC_KEY_ROW0,Address 0x53FA_8000 base + 0x28offset=0x53FA_8028
当该寄存器[2:0]=001时,ALT1该引脚被配置成GPIO4功能模块的GPIO[7]引脚,即GPIO4_GPIO[7]。
ARM_LED3:
IOMUXC_KEY_COL1,Address 0x53FA_8000 base +0x2c offset= 0x53FA_802c
当该寄存器[2:0]=001时,ALT1该引脚被配置成GPIO4功能模块的GPIO[8]引脚,即GPIO4_GPIO[8]。
ARM_LED4:
IOMUXC_KEY_ROW1, Address 0x53FA_8000 base +0x30 offset=0x53FA_8030
当该寄存器[2:0]=001时,ALT1该引脚被配置成GPIO4功能模块的GPIO[9]引脚,即GPIO4_GPIO[9]。
ARM_LED5:
IOMUXC_KEY_COL2,Address 0x53FA_8000 base +0x34 offset=0x53FA_8034
当该寄存器[2:0]=001时,ALT1该引脚被配置成GPIO4功能模块的GPIO[10]引脚,即GPIO4_GPIO[10]。
ARM_LED6:
IOMUXC_KEY_COL3,Address 0x53FA_8000 base+0x3coffset=0x53FA_803c
当该寄存器[2:0]=001时,ALT1该引脚被配置成GPIO4功能模块的GPIO[12]引脚,即GPIO4_GPIO[12]。
二、I/O方向设置
GPIO-4_GDIR is 0x53F9_0000 base + 0x4offset = 0x53F9_0004
这个寄存器是32-bit的,决定了引脚的方向。写0配置成输入,写1配置成输出。此处明显可见需要将GPIO4_GDIR[6,7,8,9,10,12]位写1。
三、I/O输出设置
GPIO-4_DR is 0x53F9_0000 base +0x0offset=0x53F9_0000
这个寄存器是32-bit的,决定了引脚的电压。写1输出高电平,写0输出低电平。此时为使6个LED都亮,故应该将GPIO4_DR[6,7,8,9,10,12]位写1。
到此,硬件分析已经完成了。下面就是套用linux下的驱动框架了,为了在内核空间访问硬件地址,就必须将物理地址映射成虚拟地址才能访问。本来我想直接使用ioremap映射一下读写寄存器就完事了。可这个Freescale提供的BSP直接将整个SOC的资源采用静态映射了。这样如果我再映射的话,内核就会失败。这块资源已经被占用了。所以我就不能使用ioremap,我必须要飞思提供的BSP中找到映射后的虚拟地址,直接读写这个虚拟地址。
必须要找到!!!!
转载地址:http://tjzji.baihongyu.com/