昨天晚上终于把驱动搞定了。这次详细说一下。
其实要想驱动在内核跑起来,好像需要两个部分。
一、驱动代码支持
二、初始化部分
下面分开来讲:
一、驱动代码支持。
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.c
2、在drivers/input/touchscreen/Makefile中添加:
复制代码
- # Mine ts
- obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
- # Mine ts end
3、在drivers/input/touchscreen/Kconfig中添加:
在if INPUT_TOUCHSCREEN后加入:复制代码
- # Mine ts
- config TOUCHSCREEN_S3C2410
- tristate "Samsung S3C2410 touchscreen input driver"
- depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN
- select SERIO
- help
- 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_DEBUG
- boolean "Samsung S3C2410 touchscreen debug messages"
- depends on TOUCHSCREEN_S3C2410
- help
- 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 */
下部分则是三个函数:
第一个:这是一个初始化的表,所有要初化的数据都要写在里面。这里我们要加入的就是上面的&s3c_device_ts.复制代码
- 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 */
- };
第二个:这里是要填加一些内存映射的内容。我们要加入的是s3c24xx_init_touchscreen(&s3c2440_ts_cfg);复制代码
- 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();
- }
第三个:
复制代码
- 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类弄的数据结构。代表各类资源如:
这里面我们加入(要在文件尾,至少要在s3c_adc_resource定义之后,因为我们要用到他。我的文件里,在这段之后仅有一行:#endif // CONFIG_CPU_S32440。也就是说我加在了最后一行的上面):复制代码
- static struct resource s3c_dm9000_resource
- static struct resource s3c2410_uart0_resource
然后我们在文件头处加入:复制代码
- /* 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中加入:
触摸屏
最新推荐文章于 2024-11-28 09:51:18 发布