write gpio reg

来源:互联网 发布:极进网络 编辑:程序博客网 时间:2024/06/03 22:56
FILENAME:setreg.c
--------------------------------------------------------------------------------
  1 /*
  2  * Configure GPIO 
  3  */
  4 
  5 #include <stdio.h>
  6 #include <sys/ioctl.h>
  7 #include <sys/types.h>
  8 #include <sys/stat.h>
  9 #include <sys/wait.h>
 10 #include <termios.h>
 11 #include <fcntl.h>
 12 #include <unistd.h>
 13 #include <string.h>
 14 #include <sys/mman.h>
 15 
 16 #define IO_REG_BASE             0xE0000000
 17 #define IO_REG_SIZE             0x100000    /* 1M bytes */
 18 #define GPDIR_OFFSET            0xC00
 19 #define GPODR_OFFSET            0xC04
 20 #define GPDAT_OFFSET            0xC08
 21 
 22 #define RETURN_FAILED               (-1)
 23 #define IO_REG32_READ(_reg)         (*((volatile unsigned int*) (_reg)))
 24 #define IO_REG32_WRITE(_reg, _val)  ((*((volatile unsigned int*) (_reg))) = (_val))
 25 
 26 static void *gpio_base_addr;
 27 static int mem_fd;
 28 
 29 /*
 30  * Map GPIO base address
 31  */
 32 int mmap_io(void)
 33 {
 34     // mmap CPU register's IO spaces
 35     mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
 36     if (mem_fd < 0) {
 37         printf("open /dev/mem error !\n\r");
 38         return RETURN_FAILED;
 39     }
 40 
 41     gpio_base_addr = mmap(0, IO_REG_SIZE, (PROT_READ | PROT_WRITE),
 42         MAP_SHARED, mem_fd, IO_REG_BASE);
 43 
 44     if (gpio_base_addr == NULL) {
 45         printf("mmap error ! \n\r");
 46         close(mem_fd);
 47         return RETURN_FAILED;
 48     }
 49 
 50     return (int) gpio_base_addr;
 51 }
 52 
 53 int munmap_io(void)
 54 {
 55     if(mem_fd < 0)
 56         return RETURN_FAILED;
 57 
 58     // unmap
 59     if(munmap(gpio_base_addr, IO_REG_SIZE) < 0) {
 60         return RETURN_FAILED;
 61     }
 62 
 63     if(close(mem_fd) < 0) {
 64         return RETURN_FAILED;
 65     }
 66 }
 67 
 68 void show_gpio_data(void)
 69 {
 70     printf("--- Readout value of GPIO registers ---\n");
 71     printf("GPDIR: %08x\n", IO_REG32_READ(gpio_base_addr + GPDIR_OFFSET));
 72     printf("GPODR: %08x\n", IO_REG32_READ(gpio_base_addr + GPODR_OFFSET));
 73     printf("GPDAT: %08x\n", IO_REG32_READ(gpio_base_addr + GPDAT_OFFSET));
 74     return;
 75 }
 76 
 77 int main(int argc,char **argv)
 78 {
 79     unsigned int roffset= 0;
 80     unsigned int val = 0;
 81 
 82     if (argc < 3) {
 83         printf("Usage:\n");
 84         printf(" %s register_offset value, like %s 0xC00 0x00C00000 to set GPIO DIR register value to 0x00C00000\n", argv[0], argv[0]);
 85         return -1;
 86     }
 87 
 88     /* Map IMMR register base */
 89     if(mmap_io() < 0 ) {
 90         return RETURN_FAILED;
 91     }
 92 
 93     roffset = strtoul(argv[1], NULL, 16);
 94     val = strtoul(argv[2], NULL, 16);
 95 
 96     /* Set register value */
 97     IO_REG32_WRITE( (gpio_base_addr+roffset), val);
 98 
 99     printf("After register set, register 0x%08X, value: 0x%08X\n", roffset, IO_REG32_READ(gpio_base_addr + roffset) );
100 
101     /* unmap */
102     munmap_io();
103     return(0);
104 }

 ===========================================================

GMAIL中的code_backup有詳細版


0 0
原创粉丝点击