昨天晚上终于把驱动搞定了。这次详细说一下。其实要想驱动在内核跑起来,好像需要两个部分。一、驱动代码支持二、初始化部分下面分开来讲:一、驱动代码支持。
1.相关文件原光盘内核里的include/asm-arm/arch-s3c2410/regs-adc.h复制到新内核:arch/arm/plat-s3c/include/plat注:2.6.28内核中头文件不再全部放在一个include文件夹里,而是各自放在各板型的文件夹里。比如说:s3c2410系列的头文件全部放在arch/arm/mach-s3c2410/include/mach文件夹下。s3c24xx系列共用的,比如s3c24b0,这个板不属于s3c2410系列,但与s3c2410同属于s3c24xx系列,所以两者可以共用的文件放在arch/arm/plat-s3c24xx/include/plat文件夹下。同理在向上一层共同的就放在/arch/arm/plat-s3c/include/plat文件夹下。光盘内核中:include/asm-arm/arch-s3c2410/ts.h复制到新内核:arch/arm/mach-s3c2410/include/mach/ts.h光盘内核中:drivers/input/touchscreen/s3c2410_ts.c复制到新内核:drivers/input/touchscreen/s3c2440_ts.c2、在drivers/input/touchscreen/Makefile中添加:
# Mine tsobj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o# Mine ts end
复制代码
3、在drivers/input/touchscreen/Kconfig中添加:在if INPUT_TOUCHSCREEN后加入:
# Mine ts config TOUCHSCREEN_S3C2410tristate "Samsung S3C2410 touchscreen input driver"depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREENselect SERIOhelp Say Y here if you have the s3c2410 touchscreen. If unsure, say N. To compile this driver as a module, choose M here: the module will be called s3c2410_ts.config TOUCHSCREEN_S3C2410_DEBUGboolean "Samsung S3C2410 touchscreen debug messages"depends on TOUCHSCREEN_S3C2410help Select this if you want debug messages# Mine ts end
复制代码
二、初始化支持这一部分主要主那么几个文件,搞定了就没问题了。大家看这里的时候可以对照内核原代码。1、arch/arm/mach-s3c2440/mach-smdk2440.c这个文件夹的上部分写的全是各个设备的初始化数据。比如:
static struct s3c2410_hcd_info usb_sbc2410_info =static struct map_desc smdk2440_iodesc[] __initdata =static struct s3c2410_uartcfg smdk2440_uartcfgs[] __initdata =
复制代码
上面都是如此类的信息。这类信息多数是下面用得到的,比如我们要在这里加入:
/* Mine ts */struct s3c2410_ts_mach_info s3c2440_ts_cfg __initdata = { .delay =20000, .presc = 55, .oversampling_shift = 2, };/* Mine ts end */
复制代码
下部分则是三个函数:第一个:
static struct platform_device *smdk2440_devices[] __initdata = { &s3c_device_usb,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c,&s3c_device_iis,/* Mine dm9000 */&s3c_device_dm9000,/* Mine dm9000 end *//* Mine ts */&s3c_device_ts/* Mine ts end */};
复制代码
这是一个初始化的表,所有要初化的数据都要写在里面。这里我们要加入的就是上面的&s3c_device_ts.第二个:
static void __init smdk2440_map_io(void){s3c24xx_init_touchscreen(&s3c2440_ts_cfg); s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));s3c24xx_init_clocks(12000000);s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));usb_sbc2410_init();}
复制代码
这里是要填加一些内存映射的内容。我们要加入的是s3c24xx_init_touchscreen(&s3c2440_ts_cfg); 第三个:
static void __init smdk2440_machine_init(void){s3c24xx_fb_set_platdata(&smdk2440_fb_info);s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);s3c2410_gpio_setpin(S3C2410_GPG4, 1);platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));smdk_machine_init();}
复制代码
这个就是最初的初始化了。我们在lcd点亮背光时加入的是上面的s3c2410_gpio的两条。这里我们不用加入东西。其实后面两条执行的先后差不多,有些东西放在哪个里面都行。2、arch/arm/plat-s3c24xx/devs.c顾名思义:这里的devs->devices.里面全是设备信息。这里常出现的就是resource类弄的数据结构。代表各类资源如:
static struct resource s3c_dm9000_resourcestatic struct resource s3c2410_uart0_resource
复制代码
这里面我们加入(要在文件尾,至少要在s3c_adc_resource定义之后,因为我们要用到他。我的文件里,在这段之后仅有一行:#endif // CONFIG_CPU_S32440。也就是说我加在了最后一行的上面):
/* Mine ts */ /* Touchscreen */static struct s3c2410_ts_mach_info s3c2410_ts_info;void __init s3c24xx_init_touchscreen(struct s3c2410_ts_mach_info *hard_s3c2410_ts_info) { memcpy(&s3c2410_ts_info,hard_s3c2410_ts_info,sizeof(struct s3c2410_ts_mach_info)); } //EXPORT_SYMBOL(set_s3c2410ts_info);struct platform_device s3c_device_ts = { .name = "s3c2410-ts", .id = -1, .num_resources = ARRAY_SIZE(s3c_adc_resource), .resource = s3c_adc_resource, .dev = { .platform_data = &s3c2410_ts_info, } }; EXPORT_SYMBOL(s3c_device_ts);/* Mine ts end */
复制代码
然后我们在文件头处加入:/* Mine ts */#include <mach/ts.h>/* Mine ts end 1*/因为我们用到了ts.h里面的s3c2410_ts_mach_info结构。注意:我们引用mach/ts.h,这个文件是上面第一步里我们放进去的。它实际在arch/arm/mach-s3c2410/include/mach里面。注意2:我们上面讨论的是devs.c,它在arch/arm/plat-s3c24xx里面,它对应的头文件devs.h在arch/arch/plat-s3c24xx/include/plat下面。下面我们就要来讨论它。3、arch/arch/plat-s3c24xx/include/plat/devs.h当我们想用devs.c中的数据结构时,我们怎么办?#include <devs.c>?没见过有人这样写。实际上我们真在要在其它文件里用到devs.c中的东西,比如:s3c_device_ts我们想用它,就在devs.c中写EXPORT_SYMBOL(s3c_device_ts);注意:这句上面有了哦!然后呢?在devs.h中写extern struct platform_device s3c_device_ts;我们还要通过include <devs.h>方式使用的devs.c中的东西还有一个函数,所以我们最后的结果是在devs.h中加入: