用戶層操作硬件寄存器等(通過/dev/mem)

直接貼代碼:

#include <sys/types.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <memory.h>
#include <cutils/log.h>

#define AMLOGIC_NORMAL_BOOT 0x0
#define AMLOGIC_FACTORY_RESET_REBOOT 0x01010101
#define AMLOGIC_UPDATE_REBOOT 0x02020202
#define AMLOGIC_CHARGING_REBOOT 0x03030303
#define AMLOGIC_CRASH_REBOOT 0x04040404
#define AMLOGIC_FACTORY_TEST_REBOOT 0x05050505
#define AMLOGIC_SYSTEM_SWITCH_REBOOT 0x06060606
#define AMLOGIC_SAFE_REBOOT 0x07070707
#define AMLOGIC_LOCK_REBOOT 0x08080808
#define MESON_USB_BURNER_REBOOT 0x09090909

#define SRAM_SIZE       127*1024 + 512
#define SRAM_GRANULARITY    512

#define REBOOT_MODE_OFFSET (SRAM_SIZE + SRAM_GRANULARITY - 4)

#define BOOT_MODE_SRAM_BASE (0xC9000000)

int main(int argc,char *argv[])
{
    int fd=-1;
    if((fd=open("/dev/mem",O_RDWR|O_SYNC)) < 0)
    {
        return -1;
    }

    unsigned char *map_base=(unsigned char * )mmap(NULL,REBOOT_MODE_OFFSET+4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,BOOT_MODE_SRAM_BASE);
    if(map_base==NULL || map_base == -1)
    {
        perror("mmap");
        return -1;
    }

    *((unsigned char *)(map_base + REBOOT_MODE_OFFSET)) = AMLOGIC_FACTORY_RESET_REBOOT>>24;
    *((unsigned char *)(map_base + REBOOT_MODE_OFFSET + 1)) = AMLOGIC_FACTORY_RESET_REBOOT>>16&0xFF;
    *((unsigned char *)(map_base + REBOOT_MODE_OFFSET + 2)) = AMLOGIC_FACTORY_RESET_REBOOT>>8&0xFF;
    *((unsigned char *)(map_base + REBOOT_MODE_OFFSET + 3)) = AMLOGIC_FACTORY_RESET_REBOOT&0xFF;


    close(fd);
    munmap(map_base,REBOOT_MODE_OFFSET+4);//解除映射關係

    return 0;
}

這裏注意一點,與對齊有關,不然mmap可能操作失敗。另外是這一部分

*((unsigned char *)(map_base + REBOOT_MODE_OFFSET)) = AMLOGIC_FACTORY_RESET_REBOOT>>24;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章