疑问
1.为什么一开始需要用 ioremap去生成一个虚拟地址
base_addr=ioremap(S3C2410_PA_ADC,0x20);
而在Led或者按键驱动中却没调用这个,而是直接使用的
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 0);
static unsigned long led_table [] = {
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
------------------------------------------------------------------------------------------------------------------------------------------
原因:
在linux中操作的是虚拟地址,全部物理寄存器地址都必须转换为虚拟地址。所以需要用ioremap转换。在GPIO操作中,s3c2410_gpio_cfgpin()函数内使用了
#define S3C24XX_GPIO_BASE(x) S3C2410_GPIO_BASE(x)
#define S3C2410_GPIO_BASE(pin) ((((pin) & ~31) >> 1) + S3C24XX_VA_GPIO)//已经使用了虚拟地址
2. clk_get 做何用途?
adc_clock = clk_get(NULL, "adc");
clk_enable(adc_clock);
-----------------------------------------------------------------------------------------------------------------------------------------
clk_get从一个时钟list链表中以字符id名称来查找一个时钟clk结构体并且返回,最后调用clk.enable(),来时能对应的外设时钟源。
阅读(942) | 评论(0) | 转发(0) |