触摸屏

来源:互联网 发布:网络交换机的通讯方式 编辑:程序博客网 时间:2024/06/11 06:25

昨天晚上终于把驱动搞定了。这次详细说一下。
其实要想驱动在内核跑起来,好像需要两个部分。
一、驱动代码支持
二、初始化部分
下面分开来讲:
一、驱动代码支持。
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中添加:
  1. # Mine ts
  2. obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
  3. # Mine ts end
复制代码

3、在drivers/input/touchscreen/Kconfig中添加:
在if INPUT_TOUCHSCREEN后加入:
  1. # Mine ts
  2. config TOUCHSCREEN_S3C2410
  3. tristate "Samsung S3C2410 touchscreen input driver"
  4. depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN
  5. select SERIO
  6. help
  7.    Say Y here if you have the s3c2410 touchscreen.
  8.    If unsure, say N.
  9.    To compile this driver as a module, choose M here: the
  10.    module will be called s3c2410_ts.
  11. config TOUCHSCREEN_S3C2410_DEBUG
  12. boolean "Samsung S3C2410 touchscreen debug messages"
  13. depends on TOUCHSCREEN_S3C2410
  14. help
  15.    Select this if you want debug messages
  16. # Mine ts end
复制代码

二、初始化支持
这一部分主要主那么几个文件,搞定了就没问题了。大家看这里的时候可以对照内核原代码。
1、arch/arm/mach-s3c2440/mach-smdk2440.c
这个文件夹的上部分写的全是各个设备的初始化数据。
比如:
  1. static struct s3c2410_hcd_info usb_sbc2410_info =
  2. static struct map_desc smdk2440_iodesc[] __initdata =
  3. static struct s3c2410_uartcfg smdk2440_uartcfgs[] __initdata =
复制代码

上面都是如此类的信息。
这类信息多数是下面用得到的,比如我们要在这里加入:
  1. /* Mine ts */
  2. struct s3c2410_ts_mach_info s3c2440_ts_cfg __initdata = {
  3.         .delay =20000,
  4.         .presc = 55,
  5.         .oversampling_shift = 2,
  6. };
  7. /* Mine ts end */
复制代码


下部分则是三个函数:
第一个:
  1. static struct platform_device *smdk2440_devices[] __initdata = {
  2. &s3c_device_usb,
  3. &s3c_device_lcd,
  4. &s3c_device_wdt,
  5. &s3c_device_i2c,
  6. &s3c_device_iis,
  7. /* Mine dm9000 */
  8. &s3c_device_dm9000,
  9. /* Mine dm9000 end */
  10. /* Mine ts */
  11. &s3c_device_ts
  12. /* Mine ts end */
  13. };
复制代码
这是一个初始化的表,所有要初化的数据都要写在里面。这里我们要加入的就是上面的&s3c_device_ts.
第二个:
  1. static void __init smdk2440_map_io(void)
  2. {
  3. s3c24xx_init_touchscreen(&s3c2440_ts_cfg);
  4. s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
  5. s3c24xx_init_clocks(12000000);
  6. s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
  7. usb_sbc2410_init();
  8. }
复制代码
这里是要填加一些内存映射的内容。我们要加入的是s3c24xx_init_touchscreen(&s3c2440_ts_cfg);
第三个:
  1. static void __init smdk2440_machine_init(void)
  2. {
  3. s3c24xx_fb_set_platdata(&smdk2440_fb_info);
  4. s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);
  5. s3c2410_gpio_setpin(S3C2410_GPG4, 1);
  6. platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
  7. smdk_machine_init();
  8. }
复制代码

这个就是最初的初始化了。我们在lcd点亮背光时加入的是上面的s3c2410_gpio的两条。
这里我们不用加入东西。其实后面两条执行的先后差不多,有些东西放在哪个里面都行。
2、arch/arm/plat-s3c24xx/devs.c
顾名思义:这里的devs->devices.
里面全是设备信息。这里常出现的就是resource类弄的数据结构。代表各类资源如:
  1. static struct resource s3c_dm9000_resource
  2. static struct resource s3c2410_uart0_resource
复制代码
这里面我们加入(要在文件尾,至少要在s3c_adc_resource定义之后,因为我们要用到他。我的文件里,在这段之后仅有一行:#endif // CONFIG_CPU_S32440。也就是说我加在了最后一行的上面):
  1. /* Mine ts */
  2.     /* Touchscreen */
  3. static struct s3c2410_ts_mach_info s3c2410_ts_info;
  4. void __init s3c24xx_init_touchscreen(struct s3c2410_ts_mach_info *hard_s3c2410_ts_info)
  5. {
  6.   memcpy(&s3c2410_ts_info,hard_s3c2410_ts_info,sizeof(struct s3c2410_ts_mach_info));
  7. }
  8. //EXPORT_SYMBOL(set_s3c2410ts_info);
  9. struct platform_device s3c_device_ts = {
  10.   .name = "s3c2410-ts",
  11.   .id = -1,
  12.   .num_resources   = ARRAY_SIZE(s3c_adc_resource),
  13.   .resource   = s3c_adc_resource,
  14.   .dev = {
  15.    .platform_data = &s3c2410_ts_info,
  16.   }
  17. };
  18. EXPORT_SYMBOL(s3c_device_ts);
  19. /* 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中加入:
原创粉丝点击