高通平台的寄存器读工具
来源:互联网 发布:天猫淘宝网商城午蹈鞋 编辑:程序博客网 时间:2024/05/21 05:55
高通平台自带寄存器的读工具/system/bin/r,使用时只需
第一次用的时候报无法打开/dev/mem节点(没有该节点),这时只需在内核配置中选上CONFIG_DEVMEM,重新编译内核重烧即可。
/system/bin/r+寄存器就可获取寄存器的值。这两个工具的源码位于/system/core目录下r.c。
#include <fcntl.h>#include <inttypes.h>#include <stdbool.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/mman.h>#if __LP64__#define strtoptr strtoull#else#define strtoptr strtoul#endifstatic int usage(){ fprintf(stderr,"r [-b|-s] <address> [<value>]\n"); return -1;}int r_main(int argc, char *argv[]){ if(argc < 2) return usage(); int width = 4; if(!strcmp(argv[1], "-b")) { width = 1; argc--; argv++; } else if(!strcmp(argv[1], "-s")) { width = 2; argc--; argv++; } if(argc < 2) return usage(); uintptr_t addr = strtoptr(argv[1], 0, 16); uintptr_t endaddr = 0; char* end = strchr(argv[1], '-'); if (end) endaddr = strtoptr(end + 1, 0, 16); if (!endaddr) endaddr = addr + width - 1; if (endaddr <= addr) { fprintf(stderr, "end address <= start address\n"); return -1; } bool set = false; uint32_t value = 0; if(argc > 2) { set = true; value = strtoul(argv[2], 0, 16); } int fd = open("/dev/mem", O_RDWR | O_SYNC); if(fd < 0) { fprintf(stderr,"cannot open /dev/mem\n"); return -1; } off64_t mmap_start = addr & ~(PAGE_SIZE - 1); size_t mmap_size = endaddr - mmap_start + 1; mmap_size = (mmap_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); void* page = mmap64(0, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, mmap_start); if(page == MAP_FAILED){ fprintf(stderr,"cannot mmap region\n"); return -1; } while (addr <= endaddr) { switch(width){ case 4: { uint32_t* x = (uint32_t*) (((uintptr_t) page) + (addr & 4095)); if(set) *x = value; fprintf(stderr,"%08"PRIxPTR": %08x\n", addr, *x); break; } case 2: { uint16_t* x = (uint16_t*) (((uintptr_t) page) + (addr & 4095)); if(set) *x = value; fprintf(stderr,"%08"PRIxPTR": %04x\n", addr, *x); break; } case 1: { uint8_t* x = (uint8_t*) (((uintptr_t) page) + (addr & 4095)); if(set) *x = value; fprintf(stderr,"%08"PRIxPTR": %02x\n", addr, *x); break; } } addr += width; } return 0;}
第一次用的时候报无法打开/dev/mem节点(没有该节点),这时只需在内核配置中选上CONFIG_DEVMEM,重新编译内核重烧即可。
1 0
- 高通平台的寄存器读工具
- 高通平台工具使用
- 高通平台的常用的编译IDE工具RVDS,MDK, ADS介绍
- 高通8x12平台开机画面制作工具
- 高通8x12平台开机画面制作工具
- 高通8x12平台开机画面制作工具
- 高通MSM平台上的AMSS
- 高通MSM平台上的AMSS
- 高通平台的音频Topology
- 高通平台 8074 spi 的配置
- 高通平台手机的power概览
- 高通平台memory信息的获取
- 高通平台开机logo的修改
- 高通平台的耳机检测(msm8909)
- 高通平台EFS的制作
- 高通平台BootLoader的流程
- 高通平台 efs.img_B的制作方法
- 高通QSC61X5平台
- 用 Python 脚本实现对 Linux 服务器的监控
- mac下bash的基本命令
- 动态规划求最长回文子序列
- /*简单猜数字游戏*/
- ActiveMQ消息队列
- 高通平台的寄存器读工具
- JAVA中main函数参数args,以及如何给args传参
- shell基础-bash变量-位置参数变量
- 'artifactId' with value 'java' does not match a valid id pattern
- 排序算法的稳定性
- JAVA之反射
- 1225
- Java进阶--final关键字
- java多线程:1、Thread实现