这是我进入嵌入式行业进公司做的第一个驱动,
平台:Ti dm6441 linu2.6.18
GPIO是嵌入式系统最简单、最常用的资源了,比如点亮LED,控制蜂鸣器,输出高低电平,检测按键,等等。
由于硬件资源的原因,DM6441并不是GPIO管脚就是纯粹的GPIO脚,GPIO管脚和其他一些标准接口复用相同的引脚,
比如SPI和GPIO复用,I2C和GPIO复用等,到底是使用GPIO还是其他接口,在初始化的时候,都需要对PINMUX0和PINMUX1
两个寄存器进行设置(见DM6441的芯片p72),而软件设置则在Montavista linux-2.6.18_pro500/arch/arm/mach-davinci
目录下mux_cfg.c和对应的include/asm/arch-davinci/mux.h里。由数据手册知道gpio5,6,7默认是gpio功能。
对mux_cfg.c的分析
对MUX_CFG()的参数解释
第一个是描述(和数据手册p72上要对应),第二个是pinmux0还是1,第三个是寄存器偏移。最后一个和调试有关的,
倒数第二个就是你需要给pinmux寄存器相应位设置的值,倒数第三个就是pinmux相应位全为1的值(掩码值),
倒数第四个就是pinmux相应位偏移值。如果你要改变引脚的模式,把对应引脚设置成0,再把其他功能设为1。
(这是我的理解,参考下面的I2C和GPIO43_44设置)。
#include <linux/module.h>
#include <linux/init.h>
#include <asm/hardware.h>
#include <asm/arch/cpu.h>
#include <asm/arch/mux.h>
#ifdef CONFIG_DAVINCI_MUX
struct pin_config __initdata_or_module davinci_dm644x_pins[] = {
/*
* description mux mode mode mux dbg
* reg offset mask mode
*/
MUX_CFG("HDIREN", 0, 16, 1, 1, 1)
MUX_CFG("ATAEN", 0, 17, 1, 1, 1)
MUX_CFG("MSTK", 1, 9, 1, 0, 0)
MUX_CFG("I2C", 1, 7, 1, 1, 0)
MUX_CFG("MCBSP", 1, 10, 1, 1, 0)
MUX_CFG("PWM0", 1, 4, 1, 1, 0)
MUX_CFG("PWM1", 1, 5, 1, 1, 0)
MUX_CFG("PWM2", 1, 6, 1, 1, 0)
MUX_CFG("VLINQEN", 0, 15, 1, 1, 0)