画了一个下午点灯,谢天谢地总算点完了,关于s5pv210的地址表一直没找到,这里写下备忘。
#ifndef _S5PV210_GPIO_H #define _S5PV210_GPIO_H #define S5PV210_GPIOBASE (0XE0200000) //基地址 struct s5pc210_gpio_bank { unsigned int con; unsigned int dat; unsigned int pud; unsigned int drv; unsigned int con_pdn; unsigned int pud_pdn; unsigned char res1[8]; }; struct s5pv210_gpio { struct s5pc210_gpio_bank gpio_a0; struct s5pc210_gpio_bank gpio_a1; struct s5pc210_gpio_bank gpio_b; struct s5pc210_gpio_bank gpio_c0; struct s5pc210_gpio_bank gpio_c1; struct s5pc210_gpio_bank gpio_d0; struct s5pc210_gpio_bank gpio_d1; struct s5pc210_gpio_bank gpio_e0; struct s5pc210_gpio_bank gpio_e1; struct s5pc210_gpio_bank gpio_f0; struct s5pc210_gpio_bank gpio_f1; struct s5pc210_gpio_bank gpio_f2; struct s5pc210_gpio_bank gpio_f3; struct s5pc210_gpio_bank gpio_g0; struct s5pc210_gpio_bank gpio_g1; struct s5pc210_gpio_bank gpio_g2; struct s5pc210_gpio_bank gpio_g3; struct s5pc210_gpio_bank gpio_i; struct s5pc210_gpio_bank gpio_j0; struct s5pc210_gpio_bank gpio_j1; struct s5pc210_gpio_bank gpio_j2; struct s5pc210_gpio_bank gpio_j3; struct s5pc210_gpio_bank gpio_j4; }; #endif几个常用的操作地址的宏
#define _REG(adr) (*(volatile unsigned int *)(adr)) #define readb(adr) (*(volatile unsigned char *)(adr)) #define readw(adr) (*(volatile unsigned short *)(adr)) #define readl(adr) (*(volatile unsigned int *)(adr)) #define writeb(value,adr) ((*(volatile unsigned char *)(adr))=(value)) #define writew(value,adr) ((*(volatile unsigned short *)(adr))=(value)) #define writel(value,adr) ((*(volatile unsigned int*)(adr))=(value))使用方法 比如设置PA0 最低一位输出高电平
volatile struct s5pv210_gpio *gpio_base = (volatile struct s5pv210_gpio *)S5PV210_GPIOBASE; unsigned int temp= _REG(&gpio_base->gpio_a0.con); temp&= ~0xf; temp|=0x1; writel(temp, &gpio_base->gpio_a0.con); temp=_REG(&gpio_base->gpio_j2.dat); temp |=0x01; writel(temp, &gpio_base->gpio_a0.dat);