第三十四天:按键驱动与蜂鸣器驱动以及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;// 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

第三十四天:按键驱动与蜂鸣器驱动以及MMU的相关文章

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package

centos 监控cacti/nagios/zabbix 第三十四节课

centos   监控cacti/nagios/zabbix   第三十四节课 上半节课 下半节课 f

Python进阶(三十四)-Python3多线程解读

Python进阶(三十四)-Python3多线程解读 线程讲解 ??多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度. 程序的运行速度可能加快. 在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下我们可以释放一些珍贵的资源如内存占用等等. ??线程在执行过程中与进程还是有区别的.每个独立

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接,可以看到什么样的效果 package com.lgl.socket; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; publ

【Unity 3D】学习笔记三十四:游戏元素——常用编辑器组件

常用编辑器组件 unity的特色之一就是编辑器可视化,很多常用的功能都可以在编辑器中完成.常用的编辑器可分为两种:原有组件和拓展组件.原有组件是编辑器原生的一些功能,拓展组件是编辑器智商通过脚本拓展的新功能. 摄像机 摄像机是unity最为核心组件之一,游戏界面中显示的一切内容都得需要摄像机来照射才能显示.摄像机组件的参数如下: clear flags:背景显示内容,默认的是skybox.前提是必须在render settings 中设置天空盒子材质. background:背景显示颜色,如果没

三十四、git rm简介

本文翻译整理自:http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-rm.html 在git中我们可以通过git rm命令把一个文件删除,并把它从git的仓库管理系统中移除.但是注意最后要执行git commit才真正提交到git仓库 示例1 git rm 1.txt 删除1.txt文件,并把它从git的仓库管理系统中移除. 示例2 git rm -r myFolder 删除文件夹myFold

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

中国三十四城市的货郎担回路15199千米

在网上找到中国三十四个城市的经纬度,计算出各个城市之间的球面距离,做一个就近连通图,使用触摸空洞回溯法计算出了最短的几个哈密顿圈,最短的一个就是中国三四个城市的货郎担回路了.需要说明的是三十四个城市之间的距离与原来三十一个城市之间的老距离不一样. 下面这个图形就是中国三十四个城市的货郎担回路了

微信小程序把玩(三十四)Audio API

原文:微信小程序把玩(三十四)Audio API 没啥可值得太注意的地方 重要属性: 1. wx.getBackgroundAudioPlayerState(object) 获取播放状态 2.wx.playBackgroundAudio(object)播放音乐 3.wx.pauseBackgroundAudio()暂停音乐 4.wx.seekBackgroundAudio(object) 设置播放进度 5.wx.stopBackgroundAudio()停止播放音乐 三个监听器: wxml <b

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL