微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux下访问GPIO端口

ARM Linux下访问GPIO端口

时间:11-22 来源:互联网 点击:
GPIO(GeneralPurpose Input/Output的缩写)就是芯片的引脚,引脚是可编程的可对引脚的工作模式进行设置:输入模式(检测输入信号),输出模式(输出0或1),高阻状态(常用于AD转换),还有禁止或允许上内部下拉电阻(上拉:管脚通过电阻接高电平,下拉:管脚通过电阻接地,也可以外部接上拉或下拉电阻),还有管脚复用等功能,即通过对内部寄存器的设置使引脚既可以工作在一般模式,作为普通的GPIO口使用,也可以工作在特殊模式,比如作为外部中断信号输入引脚等等。如果不设置GPIO引脚,CPU工作时有一个初始化模式,可以从datasheet(芯片手册)上了解。对GPIO的控制是编写驱动程序最常见和重要的一项工作内容。在Linux内核代码中,已经提供了针对三星S3C2410/S3C2440等芯片GPIO的控制。

*******************************************************************************

linux-2.6.30.4\arch\arm\plat-s3c\include\plat\ map-base.h

#defineS3C_ADDR_BASE (0xF4000000)

#ifndef __ASSEMBLY__

#define S3C_ADDR(x) ((void__iomem __force *)S3C_ADDR_BASE+ (x))

#else

#defineS3C_ADDR(x) (S3C_ADDR_BASE+ (x))

#endif

#define S3C_VA_IRQ S3C_ADDR(0x00000000) /* irq controller(s) */

#define S3C_VA_SYS S3C_ADDR(0x00100000) /* system control */

#define S3C_VA_MEM S3C_ADDR(0x00200000) /* system control */

#define S3C_VA_TIMER S3C_ADDR(0x00300000) /* timer block */

#define S3C_VA_WATCHDOG S3C_ADDR(0x00400000) /* watchdog */

#define S3C_VA_UART S3C_ADDR(0x01000000) /*UART */

linux-2.6.30.4\arch\arm\plat-s3c24xx\include\plat\ map.h

/* UARTs */

#defineS3C24XX_VA_UART S3C_VA_UART

#define S3C2410_PA_UART (0x50000000)

#define S3C24XX_SZ_UART SZ_1M

#define S3C_UART_OFFSET (0x4000)

UART映射后的虚拟地址是0xF4000000+0x01000000

linux-2.6.30.4\arch\arm\plat-s3c24xx\include\plat\ map.h

/* GPIO ports */

#define S3C2410_PA_GPIO (0x56000000)

#defineS3C24XX_VA_GPIO ((S3C24XX_PA_GPIO- S3C24XX_PA_UART) + S3C24XX_VA_UART)//GPIO的虚拟地址

#define S3C24XX_SZ_GPIO SZ_1M

GPIO的基地址为 0xfb000000

S3C24XX_VA_GPIO在不同的linux版本中可能不一样,2.6.30.4是按照上面的方式,下图是2.6.22.6的实现方法

linux/include/asm-arm/arch-s3c2410/map.h

#ifndef __ASSEMBLY__

#define S3C2410_ADDR(x) ((void __iomem *)0xF0000000 + (x))

#else

#define S3C2410_ADDR(x) (0xF0000000 + (x))

#endif

#define S3C2400_ADDR(x) S3C2410_ADDR(x)

/* GPIO ports */

#define S3C24XX_VA_GPIO S3C2410_ADDR(0x00E00000)

#define S3C2400_PA_GPIO (0x15600000)

#define S3C2410_PA_GPIO (0x56000000)

#define S3C24XX_SZ_GPIO SZ_1M

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

#defineS3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO)//在GPIO的虚拟地址上直接偏移

#define S3C24XX_GPIOREG2(x) ((x) + S3C24XX_VA_GPIO2)

linux-2.6.30.4/arch/arm/mach-s3c2410/include/mach/gpio-nrs.h

#defineS3C2410_GPIONO(bank,offset)((bank) + (offset))

#defineS3C2410_GPIO_BANKA (32*0)//每组最多32个端口

#define S3C2410_GPIO_BANKB(32*1)

#define S3C2410_GPIO_BANKC(32*2)

#define S3C2410_GPIO_BANKD(32*3)

#define S3C2410_GPIO_BANKE(32*4)

#define S3C2410_GPIO_BANKF(32*5)

#define S3C2410_GPIO_BANKG(32*6)

#define S3C2410_GPIO_BANKH (32*7)

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

#defineS3C2410_GPACON S3C2410_GPIOREG(0x00)//A组GPIO的控制寄存器

#define S3C2410_GPADAT S3C2410_GPIOREG(0x04)//A组GPIO的数据寄存器

#define S3C2400_GPACON S3C2410_GPIOREG(0x00)

#define S3C2400_GPADAT S3C2410_GPIOREG(0x04)

#defineS3C2410_GPA0 S3C2410_GPIONO(S3C2410_GPIO_BANKA, 0)//A组GPIO的第0个的pin数

#define S3C2410_GPA0_OUT(0<0)//设置A0为输出功能

#define S3C2410_GPA0_ADDR0(1<0)//设置A0作为地址线ADDR0

*******************************************************************************

#define S3C2410_GPBCON S3C2410_GPIOREG(0x10)

#define S3C2410_GPBDAT S3C2410_GPIOREG(0x14)

#define S3C2410_GPBUP S3C2410_GPIOREG(0x18)

#define S3C2410_GPB0S3C2410_GPIONO(S3C2410_GPIO_BANKB, 0)

#define S3C2410_GPB0_INP(0x00 < 0)

#define S3C2410_GPB0_OUTP(0x01 < 0)

#define S3C2410_GPB0_TOUT

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top