首页 > 代码库 > 第三十四天:按键驱动与蜂鸣器驱动以及MMU
第三十四天:按键驱动与蜂鸣器驱动以及MMU
编写按键驱动的过程和编写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;// on11 udelay(250000);12 *GPD0DAT = 0x0;13 udelay(250000);//off14 }15 #endif16 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 table12 unsigned long ttb = 0x70000000;13 init_ttb(ttb);14 //step 2: enable mmu table15 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" //manager20 "mcr p15, 0, %0, c2, c0, 0\n" //ttb address21 "mcr p15, 0, %1, c1, c0, 0\n" //enable mmu22 :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 }
第三十四天:按键驱动与蜂鸣器驱动以及MMU
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。