注意arch/arm/plat-samsung/devs.c里的条件编译,对于tiny4412来说,CONFIG_PLAT_S3C24XX是没有定义的,定义的是CONFIG_SAMSUNG_DEV_ADC。所以,和s3c_device_adc匹配resource的是下面红色部分的代码。
/* ADC */
#ifdef CONFIG_PLAT_S3C24XX
static struct resource s3c_adc_resource[] = {
[0] = DEFINE_RES_MEM(S3C24XX_PA_ADC, S3C24XX_SZ_ADC),
[1] = DEFINE_RES_IRQ(IRQ_TC),
[2] = DEFINE_RES_IRQ_NAMED(IRQ_ADC, "samsung-adc"),
};
struct platform_device s3c_device_adc = {
.name = "s3c24xx-adc",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_adc_resource),
.resource = s3c_adc_resource,
};
#endif /* CONFIG_PLAT_S3C24XX */
#if defined(CONFIG_SAMSUNG_DEV_ADC)
static struct resource s3c_adc_resource[] = {
[0] = DEFINE_RES_MEM(SAMSUNG_PA_ADC, SZ_256),
#ifdef IRQ_TC
[1] = DEFINE_RES_IRQ(IRQ_TC),
#endif
[2] = DEFINE_RES_IRQ_NAMED(IRQ_ADC, "samsung-adc"),
};struct platform_device s3c_device_adc = {
.name = "samsung-adc",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_adc_resource),
.resource = s3c_adc_resource,
};
void __init s3c_adc_set_platdata(struct s3c_adc_platdata *pd)
{
s3c_set_platdata(pd, sizeof(struct s3c_adc_platdata),
&s3c_device_adc);
}
#endif /* CONFIG_SAMSUNG_DEV_ADC */
其中,SAMSUNG_PA_ADC定义在arch/arm/mach-exynos/include/mach/map.h中:
复制代码- #if defined(CONFIG_SOC_EXYNOS4412)
- #define SAMSUNG_PA_ADC EXYNOS4412_PA_ADC
- #else
- #define SAMSUNG_PA_ADC EXYNOS4210_PA_ADC
|
对于tiny4412来说,用的是EXYNOS4412_PA_ADC
至于tiny4412_adc, 这个是友善之臂自己写的一个基于s3c_adc驱动之上的“客户”驱动,把应用程序对于ADC的访问转到ADC的Channnel 0并通过s3c_adc驱动访问硬件。它的源代码在drivers/char/tiny4412_adc.c