码迷,mamicode.com
首页 > 其他好文 > 详细

第三十四天:按键驱动与蜂鸣器驱动以及MMU

时间:2014-11-21 21:48:14      阅读:341      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   color   使用   sp   for   on   

  编写按键驱动的过程和编写LED灯的驱动类似。区别在于按键是在底板上的。要从底板的电路图开始看。

   使用key为关键字查找电路图:

  bubuko.com,布布扣

 可以得知的信息:按键松开时候XEINT26为高电平。按下时候为底电平。所以要判断按键是否被按下,就要检测XEINT26的状态。

 使用XEINT26为关键字,在核心板上查看其定义。找到下图:

 bubuko.com,布布扣  

  XEINT26在核心板上链接到GPX3_2上。然后就是去datasheet中查找GPX3_2的说明了。

  bubuko.com,布布扣

 bubuko.com,布布扣

   按键为检测,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 }

 

  

 

第三十四天:按键驱动与蜂鸣器驱动以及MMU

标签:style   blog   http   ar   color   使用   sp   for   on   

原文地址:http://www.cnblogs.com/linrong/p/4113659.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!