msm8909添加/system/bin/r用于读取寄存器

底层支持
请检查 kernel 编译是否支持

Enable devmem/devkmem 
kernel\arch\arm64\configs\xxxxxxx_defconfig 
+ CONFIG_DEVMEM=y 
+ CONFIG_DEVKMEM=y 

由于平台上没有r.c
https://blog.csdn.net/mike8825/article/details/69790338
从这个老兄里copy了代码,集成到里面
制作bp文件,用于编译
在这里插入图片描述
Android.bp

// Copyright 2013 The Android Open Source Project

cc_binary {
    name: "r",
    srcs: ["r.c"],
    shared_libs: ["libcutils"],
    cflags: ["-Werror"],
}

r.c
在转载的文件中添加了
#define PAGE_SIZE 4096
r_main修改为main



#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
#endif
#define PAGE_SIZE 4096
static int usage()
{
	    fprintf(stderr,"r [-b|-s] <address> [<value>]\n");
	        return -1;
}
 
int 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;
}

./system/core/shell_and_utilities/Android.bp
添加进编译
在这里插入图片描述

编译成功后就可以发现/system/bin/r中使用命令了

msm8909:/system/bin # /system/bin/r 0x0005E07C
0005e07c: xxxxx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值