这是在devmem 源码的基础上改的

#include <cstdint>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \__LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \__LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)template<class T>
struct mem {T *virt_addr;int32_t fd;
};template<class T>
T *phy_mem_alloc(int32_t& fd,int32_t phyaddr, int32_t& size) {void *map_base, *virt_addr;char dev_name[] = "/dev/mem";unsigned page_size, mapped_size, offset_in_page;off_t target = phyaddr;fd = open(dev_name, O_RDWR | O_SYNC);if (fd < 0) FATAL;mapped_size = page_size = sysconf(_SC_PAGESIZE);mapped_size += size;offset_in_page = (unsigned) target & (page_size - 1);if ((offset_in_page + 32) > page_size) {mapped_size *= 2;}size = mapped_size;map_base = mmap(NULL, mapped_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~(off_t) (page_size - 1));virt_addr = (char *) map_base + offset_in_page;if (virt_addr == (void *) -1) FATAL;return (T*)virt_addr;
}template<class T>
void phy_mem_free(T *mem, int32_t size,int fd) {if (munmap(mem, size) == -1)printf("phy mem alloc error: %s\n", strerror(errno));close(fd);
}int main() {printf("New Mem Read && Write into fpga \n");
#ifdef DMAint32_t fd;uint32_t *mem = phy_mem_alloc<uint32_t>(fd,0x800000, 4096*1024); //字节数和字节位宽对齐,之后就是获取一整块的内存进行使用int32_t globa[1024*1024]={0};memcpy(globa,mem,1024*4*1024);for(int i = 0 ; i < 1024*1024; i++){printf("%#x ",globa[i]);if(i%40 == 0 && i != 0)printf("\n");}printf("\n");phy_mem_free<uint32_t>(mem,1024,fd);
#endifint32_t Fd;uint32_t offset = 0x100;uint32_t *Fpga = phy_mem_alloc<uint32_t>(Fd,0x43c10000,1024);*(volatile uint32_t*)(Fpga+offset) = 0x98765432;phy_mem_free<uint32_t>(Fpga,1024,Fd);
}

32bit 寻址专用

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <cstring>
#include <errno.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <vector>
#include <cstdint>
#include <string>
#include <iostream>
#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \__LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)template<class T>
void _mem_write(T address,T value){void *map_base,*virt_addr;char dev_name[] = "/dev/mem";int fd;unsigned page_size,mapped_size,offset_in_page;off_t target = address;fd  =  open(dev_name,O_RDWR|O_SYNC);if(fd < 0) FATAL;mapped_size = page_size = sysconf(_SC_PAGESIZE);offset_in_page = (unsigned)target & (page_size -1);if((offset_in_page + 32) > page_size){mapped_size *=2;}map_base = mmap(NULL,mapped_size,PROT_READ|PROT_WRITE, MAP_SHARED,fd,target &~(off_t)(page_size-1));virt_addr = (char*)map_base + offset_in_page; //map base 位宽调整if(virt_addr == (void*)-1) FATAL;*(volatile T*)virt_addr = value; //适应于不同的位宽if(munmap(map_base,mapped_size) == -1) FATAL;close(fd);
}template<class T>
void _mem_read(T address,T& value){void *map_base,*virt_addr;char dev_name[] = "/dev/mem";int fd;unsigned page_size,mapped_size,offset_in_page;off_t target = address;fd  =  open(dev_name,O_RDWR|O_SYNC);if(fd < 0) FATAL;mapped_size = page_size = sysconf(_SC_PAGESIZE);offset_in_page = (unsigned)target & (page_size -1);if((offset_in_page + 32) > page_size){mapped_size *=2;}map_base = mmap(NULL,mapped_size,PROT_READ|PROT_WRITE, MAP_SHARED,fd,target &~(off_t)(page_size-1));virt_addr = (char*)map_base + offset_in_page; // 8bit的寻址位宽if(virt_addr == (void*)-1) FATAL;value = *(volatile T*)virt_addr;if(munmap(map_base,mapped_size) == -1) FATAL;close(fd);
}template<class T>
void mem_write(std::vector<std::pair<T,T>> w){for(int i = 0 ; i < w.size(); i++){printf("write value %#x = %#x\n",w[i].first,w[i].second);_mem_write<T>(w[i].first,w[i].second);}
}template<class T>
void mem_read(std::vector<std::pair<T,T&>> r){for(int i = 0 ; i < r.size(); i++){mem_read<T>(r[i].first,r[i].second);}
}using namespace std;
int main(int argc,char* argv[]){if(argc == 3 || argc == 4){if(std::string(argv[1]) == std::string("-r")){uint32_t value;_mem_read<uint32_t>(strtol(argv[2],NULL,16),value);cout << "mem read " << argv[2] << " " << "0x" << hex << value << endl;}else if(std::string("-w") == std::string(argv[1])){cout << "mem write " << argv[2] << " " << argv[3] << endl;_mem_write<uint32_t>(strtol(argv[2],NULL,16),strtol(argv[3],NULL,16));}}else{cout << "Useage: mem [option: -r / -w] [address] [value]" << endl;}return 0;
}

X64 X32 ARM32 AARCH64 测试没得问题

devmem 实际应用到 驱动中 通用接口相关推荐

  1. linux complete函数,Linux驱动中completion接口浅析(wait_for_complete例子,很好)

    completion是一种轻量级的机制,它容许一个线程告诉另外一个线程工做已经完成.能够利用下面的宏静态建立completion:                          DECLARE_C ...

  2. Linux驱动学习--WPA扫描相关流程及WIFI通用接口NL80211/WEXT分析

    目录 1.引言 2.WIFI通用接口介绍 3.wifi协议接口层 4.Android wpa_supplicant源码分析–扫描scan过程 4.1 wpa_supplicant.conf配置文件的分 ...

  3. Linux SPI总线和设备驱动架构之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

  4. [转载]Linux驱动-SPI驱动 之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

  5. platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架

    platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...

  6. 27. OP-TEE驱动篇----libteec接口在驱动中的实现

    历经一年多时间的系统整理合补充,<手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 >一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件, ...

  7. Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用

    关与设备树的概念,我们在Exynos4412 内核移植(六)-- 设备树解析 里面已经学习过,下面看一下设备树在设备驱动开发中起到的作用 Device Tree是一种描述硬件的数据结构,设备树源(De ...

  8. Linux文件系统概述:硬盘驱动>通用块设备层>文件系统>虚拟文件系统(VFS)

    目录 一.概述 1. 硬盘驱动 2. 通用块设备层 General Block Device Layer 3. 文件系统 4. 虚拟文件系统(VFS) 二.存储介质 闪存(Flash Memory) ...

  9. 机器视觉:嵌入式视觉系统中的接口

    机器视觉:嵌入式视觉系统中的接口 现在我们要构建一个自动割草机,割草机的空间定位需要通过相机扫描环境来获得,这个场景下传统的机器视觉系统满足不了,但嵌入式系统可以满足.为什么?因为割草机是用电池供电的 ...

最新文章

  1. Python Qt GUI设计:QSpinBox计数器类(基础篇—15)
  2. Linux 服务器基本防护
  3. aspnet网站开发实例_新手用户如何根据网站类型或应用场景选择云服务器?
  4. hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告
  5. PAT乙:1022 D进制的A+B
  6. matlab线性回归s和2,数据回归分析和拟合的matlab实现2.doc
  7. C4D R26 安装教程
  8. My Neighbor Alice新一轮土地销售分析
  9. mybatis.org/dtd/mybatis-generator-config_1_0.dtd标红
  10. excel 基础笔记整理
  11. Package javax.naming
  12. 5. 文件上传下载 与 db数据库
  13. Python安装三方包
  14. SAP如何将物料账期跨年月一次性开到当前
  15. 【3数据可视化】基于vue的动态数据低代码可视化实现
  16. matlab单根检验,关于单位根检验输出结果问题?
  17. 高德地图api(javascript)只显示某一行政区域的地图,其他周边地区的都不显示
  18. 影视四端同步APIcloud混合原生APP源码
  19. C语言更改控制台字体颜色
  20. 基于多智能体强化学习的出租车调度框架

热门文章

  1. Linux设置程序开机启动-tomcat开机启动
  2. iOS7修改UISearchBar的Cancel按钮的颜色和文字
  3. 抓包工具tcpdump及分析工具wireshark
  4. eclipse安装反编译插件jd-eclipse
  5. web客户端 http error 413
  6. Cisco Catalyst 2960系列交换机资料
  7. 制造业采购审批流程设计示例
  8. NIX***检测方法
  9. python的selenium模块博客园_Python学习--Selenium模块学习(2)
  10. 简述bios在计算机系统中的作用,BIOS的主要作用