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
- write gpio reg
- Reg
- reg
- reg
- gpio
- gpio
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- GPIO
- gpio
- GPIO
- gpio
- Qt入门(5)——用Qt控件创建一个电话本界面
- POJ2103 Jackpot(容斥+高精度)
- memorymanagerment
- SVN服务器搭建和使用(一)
- FreeRADIUS RADSQLRELAY说明
- write gpio reg
- 浅谈 C++ 中的 new/delete 和 new[]/delete[]
- Python 分布式计算模块 Parallel
- jdk8 Remove PermGen,Metaspace
- Oracle 修改表
- 将博客搬至CSDN
- CentOS 下安装Mplayer播放器(ubuntu同理)
- SVN服务器搭建和使用(二)
- 根据前序和中序遍历构造二叉树