- 論壇徽章:
- 0
|
在學(xué)習(xí)ARM驅(qū)動程序的時候碰到一個IO操作函數(shù)s3c2410_gpio_cfgpin(),打開linux內(nèi)核源代碼(版本linux-2.6.29.4),想把它看明白,具體代碼如下:
s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP);
參數(shù)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
參數(shù)S3C2410_GPB5_OUTP 宏展開:
S3C2410_GPB5_OUTP = (0x01 << 10)
參數(shù)簡化后的函數(shù):
s3c2410_gpio_cfgpin(S3C2410_GPB5,S3C2410_GPB5_OUTP)=
s3c2410_gpio_cfgpin( (32*1)+5,(0x01 << 10) )
進入函數(shù):s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function) ,
碰到的第一個子函數(shù)是:
S3C24XX_GPIO_BASE(pin),宏展開:
S3C24XX_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
所以展開后的子函數(shù):
S3C24XX_GPIO_BASE(pin)=( ( ( (pin) & ~31 ) >> 1 ) + 0xFB000000
這個地方看不懂,從子函數(shù)名字看是要根據(jù)輸入的參數(shù)pin,得到這個引腳的基地址,為什么是這樣的一個結(jié)果?
請高手幫忙解答,謝謝! |
|