mmap直接控制底层【转】
转自:http://blog.csdn.net/xyyangkun/article/details/7830149
版权声明:本文为博主原创文章,未经博主允许不得转载。
这是在mini6410上测试成功的,在没有驱动的情况下用程序直接控制了led灯test_mmap.c:
- /* Example how to access the value of the on-board DIP switches on
- * HiCO.SH7760. You can compile the program with command:
- *
- * sh4-linux-gcc -Wall dip_switch.c -o dip_switch
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <unistd.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <sys/mman.h>
- #define MAP_SIZE 4096UL
- #define MAP_MASK (MAP_SIZE - 1)
- int main(void) {
- int fd;
- void *map_base, *virt_addr;
- /* Physical address of the DIP switch GPIO register on HiCO.SH7760 (See
- * the HiCO.SH7760 hardware manual
- *
- * _NOTE_: the dipswitches also define how the system boots (i.e. the value
- * is used by the bootloader at startup), so oafter testting, leave the
- * switches in the same position as they were */
- off_t target = 0x7F008800; //GPKCON0 0x7F008800
- if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
- printf("/dev/mem could not be opened.\n");
- perror("open");
- exit(1);
- } else {
- printf("/dev/mem opened.\n");
- }
- /* Map one page */
- map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
- if(map_base == (void *) -1) {
- printf("Memory map failed.\n");
- perror("mmap");
- } else {
- printf("Memory mapped at address %p.\n", map_base);
- }
- virt_addr = map_base + (target & MAP_MASK);
- /* acess remapped region here */
- printf("Now try to change the value of the on-board DIP switche\n");
- *(unsigned int *)virt_addr=0x11110000;//0x1111<<16;//设定为输出状态
- int ab=*(unsigned int *)virt_addr;
- //*(unsigned int *)(virt_addr+8)=0xffffffff;
- printf("ab=%x\n",ab);
- #if 1
- while(1){
- *(volatile unsigned int *)(virt_addr+8)=0x00; //一定要是virt_addr不能是map_base//置0亮
- printf("1value is 0x%x\n",*(unsigned int *)(virt_addr+8));
- printf("2value is 0x%x\n",*(unsigned int *)virt_addr);
- sleep(1); //一定要有要不很快,人眼发现不了
- *(volatile unsigned int *)(virt_addr+8)=0xf0; //置1灭
- printf("3value is 0x%x\n",*(unsigned int *)(virt_addr+8));
- printf("4value is 0x%x\n",*(unsigned int *)virt_addr);
- sleep(1); //一定要有要不很快,人眼发现不了
- }
- #endif
- /* we'll never get here in this example, but here's how the region is
- * unmapped. */
- if(munmap(map_base, MAP_SIZE) == -1) {
- printf("Memory unmap failed.\n");
- }
- close(fd);
- }
以上程序证明了在linux下用mmap函数可以在没有驱动的情况下也可以直接控制底层。
网上说只能控制gpio设备,我还可以直接控制其它设备,有待验证。
mmap直接控制底层【转】的更多相关文章
- JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...
- 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
- C标准I/O库函数与Unbuffered I/O函数
一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...
- C/C++ Learning
目录 1. C/C++中的关键字2. C/C++中的标识符3. 编译选项MD(d).MT(d)编译选项的区别4. C++类模板.函数模板5. C++修饰符6. 调用约定7. 错误处理8. 环境表 9. ...
- FFmpeg详解
认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式.多媒体传输协议以及音视频编解码器.因此,对于从事多媒体技术开发的工程师来说,深入研究FFM ...
- 最新FFMPEG解码流程
FFMPEG解码流程: 1. 注册所有容器格式和CODEC: av_register_all() 2. 打开文件: av_open_input_file() 3 ...
- JVM源码分析之一个Java进程究竟能创建多少线程
JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...
- 摄像头bug查找工作总结
近期花了很长时间在libcamera中查找和解决一个bug.下面将这段时间中的工作过程,以及对camera的认识总结如下: 首先是问题的发生,在UM2801中,摄像头的代码已经基本实现,并且相应功能也 ...
- ffmpeg 详解
来源:http://blog.itpub.net/9399028/viewspace-1242300/ FFMPEG详解 认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几 ...
随机推荐
- Android Platform Guide
This guide shows how to set up your SDK environment to deploy Cordova apps for Android devices, and ...
- WordPress小工具开发教程(网站公告)
WordPress小工具开发教程(网站公告) BY TIANQIXIN · 2012 年 12 月 26 日 wordpress主题小工具,可以自由拖动到侧边栏,并在前台实现相应功能!一般自带的小 ...
- 如何查看自己的linux是32位还是64位
查看linux是多少位的几位方法:查看linux机器是32位还是64位的方法:方法一:file /sbin/init 或者 file /bin/ls结果如下:/sbin/init: ELF 64-bi ...
- [BS-18] 对OC中不可变类的理解
对OC中不可变类的理解 OC中存在很多不可变的类(如NSString,NSAttributedString,NSArray,NSDictionary,NSSet等),用它们创建的对象存在于堆内存中,但 ...
- [BS-13] 创建和注册UITableViewCell及Storyboard和Xib区别
创建和注册UITableViewCell及Storyboard和Xib区别 // 界面创建完成被调用 - (void)viewDidLoad { [super viewDidLoad]; /** 如果 ...
- 转:CDC,CPaintDC,CClientDC,CWindowDC区别
http://www.cnblogs.com/songsu/articles/1350014.html
- 异常处理原则--good
异常机制是现代主流语言的标配,但是异常处理问题虽然已经被讨论很多,也有很多经典书籍的论述,却一直都充满争议.很多人都觉得异常处理很难拿捏,同时也难以理解一些语言或库的异常处理设计.我使用Java近10 ...
- 针对某个数据库error做systemstate dump
如果想对某个具体error做systemstate dump收集,可以借助event来实现. 例如想在数据库遇到ora-00054时,收集数据systemstate dump信息: 开启: sqlpl ...
- WPF 基础面试题及答案(一)
一 · WPF由哪两部分组成? wpf 由两个主要部分 组成:引擎和编程框架. 1 引擎.wpf引擎是基于窗体的应用程序 图形 视频 音频和文档提供了一个单一的运行时库.重要的是WPF基于矢量的呈现引 ...
- linux:磁碟与档案系统管理
档案系统特性:为什么磁碟分割完需要格式化(format)才能使用吗? 答:因为每种作业系统所设定的档案属性和权限并不相同,为了存放这些档案所需的资料(所以需要格式化成作业系统能够利用的档案系统格式fi ...