嵌入式学习笔记(十一)- GPIO的初始化

GPIO的初始化

调用GPIO 调用过程
  • 查看内核代码中gpio 的设备,ls drivers/gpio/*.o 可以看到被编译进内核的gpio 驱动
  • 找到编译的gpio 源码打开查看gpio-exynos4.c
  • core_initcall(exynos4_gpiolib_init) linux 初始化过程中会调用
  • 初始化函数是在源代码目录下include/linux/init.h 中定义的该头文件定义了一系列的初始化函数
//include/linux/init.h 
#defind core_init(fn) _define_initcall("0",fn,0);
//drivers/gpio/gpio-exynos4.c
core_init(exynos4_gpiolib_init)
...
static struct s3c_gpio_chip exynos4_gpio_common_4bit[] = {
	.base = (S5P_VA_GPIO2+0x100),//虚拟地址
	.eint_offset = 0x20,//中断相关
	.group = 22,//分组
	.chip = {
		.base = EXYNOS4_GPL2(0),
		.ngpio = EXYNOSE4_GPIO_L2_NR,
		.label = "GPL2",
	},
	...

};
static _int exynos4_gpiolib_init(void)
{
	...
	chip = exynos4_gpio_common_4bit;
	...

}

物理地址与虚拟地址的映射

  • 虚拟地址一般很好查找,一般在平台下个难关的文件中就可以找到宏定义,搜索S5P_VA_GPIO2 可在
    arch/match-exynose4/cpu_exynose4.c 中也使用了查看结构体
#defind EXYNOSE4_PA_GPIO2 0x11000000; 物理地址
static struct exynose4_iodesc[] _initdata = {
	{
	.virtual = (unsigned long)S5P_VA_GPIO2,// 虚拟地址
	.pfn 	 = _phys_to_pfn(EXYNOSE4_PA_GPIO2),// 物理地址
	.length  = SZ_4K,// 映射长度
	.type    = MT_DEVICE,//
	},
};

GPIO 初始化过程简单描述

  • 平台文件分别定义好物理地址和虚拟地址
  • 物理地址与虚拟地址之间的映射
  • 在初始化中,引入程序员需要使用的GPIO宏定义,并将宏定义装入chip 结构体中

查看LEG 灯 使用GPIOL2

// 源码位置 driver/char/itop4412_leds.c
static int led_gpio[] = {
	EXYNOS4_GPL2(0),//0 代表pin 脚
	EXYNOS4_GPK(1),
};

GPIO 的调用函数

配置GPIO 的源码
/arm/arm/plat-samsung/include/plat/gpio_cfg.h

你可能感兴趣的:(嵌入式)