转自:http://blog.csdn.net/xyyangkun/article/details/7830149

版权声明:本文为博主原创文章,未经博主允许不得转载。

这是在mini6410上测试成功的,在没有驱动的情况下用程序直接控制了led灯test_mmap.c:

  1. /* Example how to access the value of the on-board DIP switches on
  2. * HiCO.SH7760. You can compile the program with command:
  3. *
  4. *   sh4-linux-gcc -Wall dip_switch.c -o dip_switch
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <assert.h>
  9. #include <unistd.h>
  10. #include <errno.h>
  11. #include <fcntl.h>
  12. #include <sys/mman.h>
  13. #define MAP_SIZE 4096UL
  14. #define MAP_MASK (MAP_SIZE - 1)
  15. int main(void) {
  16. int fd;
  17. void *map_base, *virt_addr;
  18. /* Physical address of the DIP switch GPIO register on HiCO.SH7760 (See
  19. * the HiCO.SH7760 hardware manual
  20. *
  21. * _NOTE_: the dipswitches also define how the system boots (i.e. the value
  22. * is used by the bootloader at startup), so oafter testting, leave the
  23. * switches in the same position as they were */
  24. off_t target = 0x7F008800;  //GPKCON0 0x7F008800
  25. if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
  26. printf("/dev/mem could not be opened.\n");
  27. perror("open");
  28. exit(1);
  29. } else {
  30. printf("/dev/mem opened.\n");
  31. }
  32. /* Map one page */
  33. map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
  34. if(map_base == (void *) -1) {
  35. printf("Memory map failed.\n");
  36. perror("mmap");
  37. } else {
  38. printf("Memory mapped at address %p.\n", map_base);
  39. }
  40. virt_addr = map_base + (target & MAP_MASK);
  41. /* acess remapped region here */
  42. printf("Now try to change the value of the on-board DIP switche\n");
  43. *(unsigned int *)virt_addr=0x11110000;//0x1111<<16;//设定为输出状态
  44. int ab=*(unsigned int *)virt_addr;
  45. //*(unsigned int *)(virt_addr+8)=0xffffffff;
  46. printf("ab=%x\n",ab);
  47. #if 1
  48. while(1){
  49. *(volatile unsigned int *)(virt_addr+8)=0x00;   //一定要是virt_addr不能是map_base//置0亮
  50. printf("1value is 0x%x\n",*(unsigned int *)(virt_addr+8));
  51. printf("2value is 0x%x\n",*(unsigned int *)virt_addr);
  52. sleep(1);   //一定要有要不很快,人眼发现不了
  53. *(volatile unsigned int *)(virt_addr+8)=0xf0;                  //置1灭
  54. printf("3value is 0x%x\n",*(unsigned int *)(virt_addr+8));
  55. printf("4value is 0x%x\n",*(unsigned int *)virt_addr);
  56. sleep(1);   //一定要有要不很快,人眼发现不了
  57. }
  58. #endif
  59. /* we'll never get here in this example, but here's how the region is
  60. * unmapped. */
  61. if(munmap(map_base, MAP_SIZE) == -1) {
  62. printf("Memory unmap failed.\n");
  63. }
  64. close(fd);
  65. }

以上程序证明了在linux下用mmap函数可以在没有驱动的情况下也可以直接控制底层。

网上说只能控制gpio设备,我还可以直接控制其它设备,有待验证。

mmap直接控制底层【转】的更多相关文章

  1. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  2. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  3. C标准I/O库函数与Unbuffered I/O函数

    一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...

  4. C/C++ Learning

    目录 1. C/C++中的关键字2. C/C++中的标识符3. 编译选项MD(d).MT(d)编译选项的区别4. C++类模板.函数模板5. C++修饰符6. 调用约定7. 错误处理8. 环境表 9. ...

  5. FFmpeg详解

    认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式.多媒体传输协议以及音视频编解码器.因此,对于从事多媒体技术开发的工程师来说,深入研究FFM ...

  6. 最新FFMPEG解码流程

    FFMPEG解码流程: 1. 注册所有容器格式和CODEC:  av_register_all() 2. 打开文件:                    av_open_input_file() 3 ...

  7. JVM源码分析之一个Java进程究竟能创建多少线程

    JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...

  8. 摄像头bug查找工作总结

    近期花了很长时间在libcamera中查找和解决一个bug.下面将这段时间中的工作过程,以及对camera的认识总结如下: 首先是问题的发生,在UM2801中,摄像头的代码已经基本实现,并且相应功能也 ...

  9. ffmpeg 详解

    来源:http://blog.itpub.net/9399028/viewspace-1242300/ FFMPEG详解   认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几 ...

随机推荐

  1. saltstack之(四)远程执行及常用模块

    前几篇文章已经完成了saltstack的安装.认证,从这篇文章开始学习使用saltstack的远程执行. 1.salt远程执行命令详解Usage: salt [options] '<target ...

  2. Linux下获取公网IP地址

    curl http://members.3322.org/dyndns/getipcurl http://ip.6655.com/ip.aspx

  3. 详解OpenGL中的各种变换(投影变换,模型变换,视图变换)(完)——法线变换

    前面两节内容已经说完了所有的三种变换.也就是说我们现在程序里面既不需要glLookAt(),也不需要gluPerspective(),这些矩阵我们都可以自己写.然后,再用glMultMatrix()来 ...

  4. 30天,App创业从0到1【7.12西安站】

    活动概况 时间:2015年07月12日13:30-16:30 地点:汇天使咖啡(高新路36号智空间二楼) 主办:APICloud.UPYUN.万紫网络 网址:www.apicloud.com 费用:免 ...

  5. 用java给php写个万能接口

    package helloworld; import java.io.IOException; import javax.servlet.ServletException; import javax. ...

  6. PHP不到100行代码实现SSO单点登录

    1.点击登录跳转到SSO登录页面并带上当前应用的callback地址2.登录成功后生成COOKIE并将COOKIE传给callback地址3.callback地址接收SSO的COOKIE并设置在当前域 ...

  7. 如何在SQLServer中处理每天四亿三千万记录

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  8. Java 找到数组中两个元素相加等于指定数的所有组合

    思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...

  9. 无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件。您在安装 VMware Workstation 后是否进行了重新引导?

    解决方法宿主机中执行如下命令重新启动: net start vmci net start vmx86 net start VMnetuserif sc config vmci=auto sc conf ...

  10. 体验Java的封装性

    package com.cnblogs.java; //体验Java的封装性 /* * 如下的人类年龄赋值-300岁,显然很不合理,这种直接对类的属性赋值,有时候虽然不合理但却会编译通过. * 所以我 ...