概念了三星(Samsung)平台七个BANK的地点,控制寄存器可安装GPIO口的办事办法为输入或输出

转:http://blog.chinaunix.net/uid-22030783-id-3391515.html

  
LED是由CPU的GPIO(通用可编制程序IO口)控制的。GPIO一般由两组寄存器控制,即一组决定寄存器和一组数据寄存器。控制寄存器可安装GPIO口的行事章程为输入或输出。当引脚为出口时,向数据寄存器的应和位写入1和0会分别在引脚上发生高低电平,对led,bell的支配正是那般的;当引脚设置为输入时,读取数据寄存器的呼应位可获得引脚上响应电平信号,按键操作就是这么,做LED驱动程序重借使做对led对应的GPIO口进行操作的函数,还包罗定义的设施操作的结构体,驱动编写请下载源代码(下载地址:http://files.cnblogs.com/unreal/2410led.rar).

 

    驱动代码相当粗略,在大旨的字符驱动框架基础上,添加了对GPIO的操作:

先介绍SamsungS3C24XX平台BSP中定义外设寄存器和GPIO的相关头文件

(1)添加数组

以linux-3.4系统为例,linux2.6.37种类也类似,只是存放的目录有分别

static unsigned long led_table [] = {
    S3C2410_GPB7,
    S3C2410_GPB8,
    S3C2410_GPB9,
    S3C2410_GPB10,
};

static unsigned int led_cfg_table [] = {
    S3C2410_GPB7_OUTP,
    S3C2410_GPB8_OUTP,
    S3C2410_GPB9_OUTP,
    S3C2410_GPB10_OUTP,
};

 

查阅你开发板(mini2410)的法则图(如下图),发现采纳了GPB柒 、GPB八 、GPB玖 、GPB10那多个GPIO口来支配LED灯

平台的头文件存放在arch/arm/mach-s3c24xx/include/mach/目录下

公海赌船网址 1

 

 

Memory map
definitions

有关宏定义,在基本文件:arch/arm/mach-s3c2410/include/mach/regs-gpio.h

概念了三星(Samsung)平台八个BANK的地方,各外设控制器的寄存器营地址和SIZE,在开立platform_data的resource时常常利用

#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))

文件名:arch/arm/mach-s3c24xx/include/mach/map.h

#define S3C2410_GPIO_BANKB   (32*1)
#define S3C2410_GPB7         S3C2410_GPIONO(S3C2410_GPIO_BANKB, 7)

如:

#define S3C2410_GPB7_OUTP    (0x01 << 14)

  1.    
    #define S3C2410_CS4        (0x20000000)

  2.     #define S3C2410_PA_LCD     (0x4D000000)

  3.     #define S3C24XX_SZ_LCD    
    SZ_1M

 

 

(2)在使得加载时,

IRQ
definitions

 

概念了Samsung平台的中断号,在创制platform_data的resource时平日应用

    for (i = 0; i < 4; i++) {
    /*设置GPIO控制寄存器,这里GPIO设置为输出*/
    s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

arch/arm/mach-s3c24xx/include/mach/irqs.h

 
s3c2410_gpio_setpin(led_table[i], 1);
/*私下认可拉低*/
}

如:

根本文件:arch/arm/plat-s3c24xx/gpio.c中定义了函数

  1.    
    #define IRQ_EINT0   S3C2410_IRQ(0)

  2.     #define IRQ_RTC    
    S3C2410_IRQ(30)

36 void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)

 

138 void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)

S3C2410 GPIO
register definitions

(3)在ioctl函数中调用函数s3c2410_gpio_setpin(led_table[arg],
!cmd);来控制led等的亮、灭。

概念了三星(Samsung)平台GPIO相关的寄存器集散地址和各管脚的机能布局

arch/arm/mach-s3c24xx/include/mach/regs-gpio.h

如:

  1.    
    #define S3C2410_GPGCON     S3C2410_GPIOREG(0x60)

  2.     #define S3C2410_GPGDAT    
    S3C2410_GPIOREG(0x64)

  3.     #define S3C2410_GPB0_TOUT0 (0x02 << 0)

 

S3C2410 –
GPIO bank numbering

arch/arm/mach-s3c24xx/include/mach/gpio-nrs.h

如:

  1. #define
    S3C2410_GPF(_nr)    (S3C2410_GPIO_F_START + (_nr))

 

S3C2440 GPIO
J register definitions

arch/arm/mach-s3c24xx/include/mach/regs-gpioj.h

如:

  1.    
    #define S3C2413_GPJCON        S3C2410_GPIOREG(0x80)

  2.     #define S3C2440_GPJ5_OUTP  
      (0x01 << 10)

  3.     #define
    S3C2440_GPJ5_CAMDATA5 (0x02 << 10)

 

其他的头文件定义了ICR-VQ、CLK、LCD、MEM、POWELX570、SDI等外设寄存器的宏

如regs-irq.h
regs-lcd.h regs-mem.h等

 

上边伊始介绍GPIO的操作方法,能够选取通用的GPIO库或使用Samsung提供的GPIIO库

 

三星GPIOLIB的API: drivers/gpio/gpio-samsung.c

 

**S3C Platform

  • GPIO pin configuration**

arch/arm/plat-samsung/include/plat/gpio-cfg.h

宣称GPIO的API函数,如要使用三星(Samsung)的GPIO
API,需蕴含此文件

申明配置管脚输入输出,是不是使能上拉的宏

如:

  1.    
    #define S3C_GPIO_INPUT

  2.     #define S3C_GPIO_OUTPUT

  3.     #define S3C_GPIO_PULL_UP

 

基本扶助文书档案:Documentation/arm/samsung-s3c24xx/gpio.txt

 

布署管脚效用:

  1. 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

 

设置管脚上拉:

  1. int s3c_gpio_setpull(unsigned int pin, samsung_gpio_pull_t pull)

例:设置GPG5管脚为上拉

s3c_gpio_setpull(S3C2410_GPG(5),
S3C_GPIO_PULL_UP);

 

设置输出电平:

  1. void
    s3c2410_gpio_setpin(unsigned int pin, unsigned int to)

例:设置GPF1管脚输出高电平

s3c2410_gpio_setpin(S3C2410_GPF(1),
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:

  1. int gpio_request(unsigned gpio, const char *label)

 

FREE GPIO:

  1. void
    gpio_free(unsigned gpio)

 

设置为出口,并钦赐私下认可电平:

  1. int gpio_direction_output(unsigned gpio, int value)

 

设置为输入:

  1. int gpio_direction_input(unsigned gpio)

 

设置输出电平:

  1. void
    __gpio_set_公海赌船网址,value(unsigned
    gpio, int value)

 

检查和测试输入电平:

  1. int __gpio_get_value(unsigned gpio)

相关文章