讨论一个问题:
学习ARM驱动程序的时候碰到一个IO操作函数s3c2410_gpio_cfgpin(),打开linux内核源代码(版本linux-2.6.29.4),想把它看明白,具体代码如下:
s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP);
参数S3C2410_GPB5 宏展开:为方便描述,展开后用等号表示
S3C2410_GPB5 = S3C2410_GPIONO(S3C2410_GPIO_BANKB, 5)
S3C2410_GPIONO(bank,offset) = ((bank) + (offset))
S3C2410_GPIO_BANKB=(32*1)
S3C2410_GPB5 = (32*1)+5
参数S3C2410_GPB5_OUTP 宏展开:
S3C2410_GPB5_OUTP = (0x01 << 10)
参数简化后的函数:
s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP)=
s3c2410_gpio_cfgpin( (32*1)+5,(0x01 << 10) )
进入函数:s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function) ,
碰到的第一个子函数是:
S3C24XX_GPIO_BASE(pin),宏展开:
S3C24XX_GPIO_BASE(pin) = S3C2410_GPIO_BASE(pin)
S3C2410_GPIO_BASE(pin) = ( ( ( (pin) & ~31 ) >> 1 ) + S3C24XX_VA_GPIO )
S3C24XX_VA_GPIO = ( (S3C24XX_PA_GPIO-S3C24XX_PA_UART) + S3C24XX_VA_UART )
S3C24XX_PA_GPIO = S3C2410_PA_GPIO = (0x56000000)
S3C24XX_PA_UART = S3C2410_PA_UART = (0x50000000)
S3C24XX_VA_UART = S3C_VA_UART = S3C_ADDR(0x01000000)
S3C_ADDR(x)=(S3C_ADDR_BASE + (x)) S3C_ADDR_BASE=(0xF4000000)
S3C24XX_VA_GPIO =(0x56000000)-(0x50000000)+(0xF5000000)
=0xFB000000
所以展开后的子函数:
S3C24XX_GPIO_BASE(pin)=( ( ( (pin) & ~31 ) >> 1 ) + 0xFB000000
这个地方看不懂,从子函数名字看是要根据输入的参数pin,得到这个引脚的基地址,为什么是这样的一个结果? |