1 概要
Linux内核中提供了pinctrl子系统,目的是为了统一各SoC厂商的pin脚管理,避免各SoC厂商各自实现相同的pin脚管理子系统,减少SoC厂商系统移植工作量。
1.1 主要功能
1. 管理系统中所有可以控制的pin。在系统初始化的时候,枚举所有可以控制的pin,并标识这些pin。
2. 管理这些pin的复用(Multiplexing)。对于SOC而言,其引脚除了配置成普通GPIO之外,若干个引脚还可以组成一个pin group,形成特定的功能。例如pin number是{ 0, 8, 16, 24 }这四个引脚组合形成一个pin group,提供SPI的功能。pin control subsystem要管理所有的pin group。
3. 配置这些pin的特性。例如配置该引脚上的pull-up/down电阻,配置drive strength等。
4. 与GPIO子系统的交互
5. 实现pin中断
1.2 核心驱动源码文件
1.3 总体框架
2源码分析
kernel配置文件: lichee/linux-3.4/arch/arm/configs/sun8iw7p1smp_android_defconfig
系统配置文件:lichee\tools\pack\chips\sun8iw7p1\configs\dolphin-p1\sys_config.fex
arch/arm/mach-sunxi/ sys_config.c //分析、处理sys_config.fex文件。
drivers/pinctrl/ core.c //创建debug fs,提供pinctrl_register等函数接口。
drivers/pinctrl/ pinctrl-sun8iw7.c //该平台下的pin脚数据
2.1 驱动加载时主流程代码
(1) drivers/pinctrl/ pinctrl-sunxi.c
1 sunxi_pinctrl_probe函数:
pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL); // devm_kzalloc基于slab分配在物理上连续的实际的内存, 并且带有释放内存的回调函数,当该设备与驱动分开时,自动释放内存。
pctl->desc = (struct sunxi_pinctrl_desc *)(&sunxi_pinctrl_data);
1.1 sunxi_pinctrl_build_state(pdev);//将pctl->desc的子项数据复制到pctl相应子项。