用户层操作硬件寄存器等(通过/dev/mem)

直接贴代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#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;

你可能感兴趣的:(linux内核驱动)