编写按键驱动的过程和编写LED灯的驱动类似。区别在于按键是在底板上的。要从底板的电路图开始看。
使用key为关键字查找电路图:
可以得知的信息:按键松开时候XEINT26为高电平。按下时候为底电平。所以要判断按键是否被按下,就要检测XEINT26的状态。
使用XEINT26为关键字,在核心板上查看其定义。找到下图:
XEINT26在核心板上链接到GPX3_2上。然后就是去datasheet中查找GPX3_2的说明了。
按键为检测,GPX3CON置0,GPX3DAT置1,表示按键被按下。代码如下:
1 int (*show)(char *,...) = 0xc3e114d8; 2 int (*udelay)(int) = 0xc3e25f90; 3 void key(void) 4 { 5 unsigned long *GPX3CON = 0x11000c60; 6 unsigned long *GPX3DAT = 0x11000c64; 7 8 *GPX3CON = 0x0; 9 while(1){ 10 if((*GPX3DAT & 0x04) == 0x0){ 11 show("good moring\n"); 12 udelay(1000000); 13 } 14 if((*GPX3DAT & 0x08) == 0x0){ 15 show("hello world\n"); 16 udelay(1000000); 17 } 18 if((*GPX3DAT & 0x10) == 0x0){ 19 show("hello bunfly\n"); 20 udelay(1000000); 21 } 22 if((*GPX3DAT & 0x20) == 0x0){ 23 break; 24 } 25 26 } 27 }
代码的功能是按KEY1,KEY2,KEY3输出字符串,KEY4退出。
蜂鸣器的驱动代码编写步骤类似,我这里就不描述具体过程了。直接贴代码:
1 void (*udelay)(int) = 0xc3e25f90; 2 void abc(void) 3 { 4 volatile unsigned long *GPD0CON = 0x114000a0; 5 volatile unsigned long *GPD0DAT = 0x114000a4; 6 7 *GPD0CON = 0x0001; 8 #if 1 9 while(1){ 10 *GPD0DAT = 0x1;// on 11 udelay(250000); 12 *GPD0DAT = 0x0; 13 udelay(250000);//off 14 } 15 #endif 16 17 }
没有对其它控制的位进行保护。差评!
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。(摘自百科)
内存映射代码如下:至今为止看到的最复杂的代码:
1 int (*printf)(char *, ...) = 0xc3e114d8; 2 3 void init_ttb(unsigned long *ttb); 4 5 int main() 6 { 7 //0x32300000 -> 0x52300000; 8 unsigned long *pp = 0x52300000; 9 *pp = 0x22222222; 10 printf("*pp is %x\n", *pp); 11 //step 1: set mmu table 12 unsigned long ttb = 0x70000000; 13 init_ttb(ttb); 14 //step 2: enable mmu table 15 unsigned long mmu = 0; 16 mmu = 1 | (1 << 3) | (1 << 8); 17 __asm__ __volatile__( 18 "mov r0, #3\n" 19 "mcr p15, 0, r0, c3, c0, 0\n" //manager 20 "mcr p15, 0, %0, c2, c0, 0\n" //ttb address 21 "mcr p15, 0, %1, c1, c0, 0\n" //enable mmu 22 : 23 : "r" (ttb), "r" (mmu) 24 ); 25 26 unsigned long *pv = 0x32300000; 27 printf("*pv is %x\n", *pv); 28 } 29 30 void init_ttb(unsigned long *ttb) 31 { 32 unsigned long va = 0; 33 unsigned long pa = 0; 34 for(va=0x00000000; va<0x14000000; va+=0x100000){ 35 pa = va; 36 ttb[va >> 20] = pa | 2; 37 } 38 39 for(va=0x40000000; va<0x80000000; va+=0x100000){ 40 pa = va; 41 ttb[va >> 20] = pa | 2; 42 } 43 44 for(va=0x30000000; va<0x40000000; va+=0x100000){ 45 pa = va + 0x20000000; 46 ttb[va >> 20] = pa | 2; 47 } 48 }
时间: 2024-10-05 05:07:30