先介绍三星s3c24xx平台bsp中定义外设寄存器和gpio的相关头文件
以linux-3.4系统为例,linux2.6.37系统也类似,只是存放的目录有区别
平台的头文件存放在arch/arm/mach-s3c24xx/include/mach/目录下
memory map definitions
定义了三星平台8个bank的地址,各外设控制器的寄存器基地址和size,在创建platform_data的resource时经常用到
文件名:arch/arm/mach-s3c24xx/include/mach/map.h
如:
- #define s3c2410_cs4 (0x20000000)
- #define s3c2410_pa_lcd (0x4d000000)
- #define s3c24xx_sz_lcd sz_1m
irq definitions
定义了三星平台的中断号,在创建platform_data的resource时经常用到
arch/arm/mach-s3c24xx/include/mach/irqs.h
如:
- #define irq_eint0 s3c2410_irq(0)
- #define irq_rtc s3c2410_irq(30)
s3c2410 gpio register definitions
定义了三星平台gpio相关的寄存器基地址和各管脚的功能配置
arch/arm/mach-s3c24xx/include/mach/regs-gpio.h
如:
- #define s3c2410_gpgcon s3c2410_gpioreg(0x60)
- #define s3c2410_gpgdat s3c2410_gpioreg(0x64)
- #define s3c2410_gpb0_tout0 (0x02 << 0)
s3c2410 - gpio bank numbering
arch/arm/mach-s3c24xx/include/mach/gpio-nrs.h
如:
- #define s3c2410_gpf(_nr) (s3c2410_gpio_f_start (_nr))
s3c2440 gpio j register definitions
arch/arm/mach-s3c24xx/include/mach/regs-gpioj.h
如:
- #define s3c2413_gpjcon s3c2410_gpioreg(0x80)
- #define s3c2440_gpj5_outp (0x01 << 10)
- #define s3c2440_gpj5_camdata5 (0x02 << 10)
其他的头文件定义了irq、clk、lcd、mem、power、sdi等外设寄存器的宏
如regs-irq.h regs-lcd.h regs-mem.h等
下面开始介绍gpio的操作方法,可以使用通用的gpio库或使用三星提供的gpiio库
三星gpiolib的api: drivers/gpio/gpio-samsung.c
s3c platform - gpio pin configuration
arch/arm/plat-samsung/include/plat/gpio-cfg.h
声明gpio的api函数,如要使用三星的gpio api,需包含此文件
声明配置管脚输入输出,是否使能上拉的宏
如:
- #define s3c_gpio_input
- #define s3c_gpio_output
- #define s3c_gpio_pull_up
内核帮助文档:documentation/arm/samsung-s3c24xx/gpio.txt
配置管脚功能:
- int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
例:设置gpb1为tout1功能
s3c_gpio_cfgpin(s3c2410_gpb(1), s3c2410_gpb1_tout1);
其中s3c2410_gpb(1)在gpio-nrs.h中定义,s3c2410_gpb1_tout1在regs-gpio.h中定义
设置输出功能为:s3c_gpio_output
设置输入功能为:s3c_gpio_input
设置管脚上拉:
- int s3c_gpio_setpull(unsigned int pin, samsung_gpio_pull_t pull)
例:设置gpg5管脚为上拉
s3c_gpio_setpull(s3c2410_gpg(5), s3c_gpio_pull_up);
设置输出电平:
- void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
例:设置gpf1管脚输出高电平
s3c2410_gpio_setpin(s3c2410_gpf(1), 1);
检测输入电平:
- unsigned int s3c2410_gpio_getpin(unsigned int pin)
例:检测gpf7管脚的电平状态
value = s3c2410_gpio_getpin(s3c2410_gpf(7));
通用的gpiolib:drivers/gpio/gpiolib.c
使用时需要包含linux/gpio.h
申请gpio:
- int gpio_request(unsigned gpio, const char *label)
free gpio:
- void gpio_free(unsigned gpio)
设置为输出,并指定默认电平:
- int gpio_direction_output(unsigned gpio, int value)
设置为输入:
- int gpio_direction_input(unsigned gpio)
设置输出电平:
- void __gpio_set_value(unsigned gpio, int value)
检测输入电平:
- int __gpio_get_value(unsigned gpio)
阅读(11518) | 评论(0) | 转发(7) |