在函数s3c_ts_probe中,对于下面的代码,我想弄清楚platform设备dev中的struct s3c_ts_mach_info 类型的变量是在哪定义并设置的:
s3c_ts_cfg = s3c_ts_get_platdata(&pdev->dev);
下面是s3c_ts_get_platdata的实现
static struct s3c_ts_mach_info *s3c_ts_get_platdata(struct device *dev)
{
if (dev->platform_data != NULL)
return (struct s3c_ts_mach_info *)dev->platform_data;
return &s3c_ts_default_cfg;
}
static int __init s3c_ts_probe(struct platform_device *pdev)中的参数就是在arch/arm/mach-s3c64xx/mach-mini6410.c 中定义的,如下:
#include <mach/map.h>
#include <mach/irqs.h>
#include <plat/devs.h>
#include <plat/cpu.h>
#include <mach/ts.h>
/* Touch srcreen */
static struct resource s3c_ts_resource[] = {
[0] = {
.start = SAMSUNG_PA_ADC,
.end = SAMSUNG_PA_ADC + SZ_256 - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_PENDN,
.end = IRQ_PENDN,
.flags = IORESOURCE_IRQ,
},
[2] = {
.start = IRQ_ADC,
.end = IRQ_ADC,
.flags = IORESOURCE_IRQ,
}
};
struct platform_device s3c_device_ts = {
.name = "s3c-ts",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_ts_resource),
.resource = s3c_ts_resource,
};
//我们会调用这个函数来设置平台数据
void __init s3c_ts_set_platdata(struct s3c_ts_mach_info *pd)
{
struct s3c_ts_mach_info *npd;
if (!pd) {
printk(KERN_ERR "%s: no platform data\n", __func__);
return;
}
npd = kmemdup(pd, sizeof(struct s3c_ts_mach_info), GFP_KERNEL);
if (!npd)
printk(KERN_ERR "%s: no memory for platform data\n", __func__);
s3c_device_ts.dev.platform_data = npd;
}
经过查看,发现函数s3c_ts_set_platdata是在mach-mini6410.c中被调用了:
在该文件中定义了s3c_ts_platform:
#ifdef CONFIG_TOUCHSCREEN_MINI6410
static struct s3c_ts_mach_info s3c_ts_platform __initdata = {
.delay = 0xFFFF,
.presc = 0xFF,
.oversampling_shift = 2,
.resol_bit = 12,
.s3c_adc_con = ADC_TYPE_2,
};
#endif
并且在此函数中static void __init mini6410_machine_init(void)将平台数据给设置到平台设备中:
#ifdef CONFIG_TOUCHSCREEN_MINI6410
s3c_ts_set_platdata(&s3c_ts_platform);
#endif
static void __init mini6410_machine_init(void) 会在内核启动时被调用,这样一来驱动就能在挂载时获得自己的平台数据