Linux3.6.7在OK6410平臺的移植(十二)TS

觸摸屏驅動也是參考這篇文章:http://www.cnblogs.com/zuobaozhu/archive/2012/05/13/2498092.html#_Toc324535492 所以以下#####################內的文字純屬複製這位網友的,當然編譯時有些小錯誤,不過都是很容易解決的,本人打字慢,就不提了。 ##################################################

以下copy 是指需要飛凌提供的內核裏的驅動源碼, dev-ts.c ts 板載初始化和platform 資源初始化 文件。

arch/arm/mach-s3c64xx/mach-smdk6410.c

註銷掉頭文件 #include<plat/ts.h>
添加頭文件 #include<mach/ts.h>
copy arch/arm/mach-s3c64xx/include/mach/ts.h 到目標內核目錄

copy arch/arm/mach-s3c64xx/dev-ts.c 到目標內核目錄在 arch/arm/mach-s3c64xx/Makefile 中添加
obj-$(CONFIG_TOUCHSCREEN_S3C) += dev-ts.o

在裏面 添加宏定義arch/arm/mach-s3c64xx/dev-ts.c

#define SZ_256 0x00000100

添加頭文件#include <linux/slab.h>,這就有很多linux3.3和2.6不同的地方

添加 ts 設備初始化 ,在smdk6410_machine_init () 結構體中

//s3c24xx_ts_set_platdata(NULL);

s3c_ts_set_platdata(&s3c_ts_platform);



添加結構體s3c_ts_platform

static struct s3c_ts_mach_info s3c_ts_platform __initdata = {

.delay = 10000,

.presc = 49,

.oversampling_shift = 2,

.resol_bit = 12,

.s3c_adc_con = ADC_TYPE_2,



};

把飛凌官方的s3c-tc.c拷貝到drivers/input/touchscreen/這裏建議拷貝他3.0的系統的

修改 drivers/input/touchscreen/Makefile
添加 obj-$(CONFIG_TOUCHSCREEN_S3C) += s3c-ts.o

修改 drivers/input/tourch/screen/Kconfig
添加 config TOUCHSCREEN_S3C

config TOUCHSCREEN_S3C

tristate "S3C touchscreen driver"

depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5P64XX || ARCH_S5PC1XX

default y

help

Say Y here to enable the driver for the touchscreen on the

S3C SMDK board.

註釋掉arch/arm/plat-samsung/devs.c裏面大概1223到1277行的如下代碼:

/* Touchscreen */



//#ifdef CONFIG_PLAT_S3C24XX

/*static struct resource s3c_ts_resource[] = {

[0] = DEFINE_RES_MEM(S3C24XX_PA_ADC, S3C24XX_SZ_ADC),

[1] = DEFINE_RES_IRQ(IRQ_TC),

};



struct platform_device s3c_device_ts = {

.name = "s3c2410-ts",

.id = -1,

.dev.parent = &s3c_device_adc.dev,

.num_resources = ARRAY_SIZE(s3c_ts_resource),

.resource = s3c_ts_resource,

};



void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)

{

s3c_set_platdata(hard_s3c2410ts_info,

sizeof(struct s3c2410_ts_mach_info), &s3c_device_ts);

}

*/

//#endif /* CONFIG_PLAT_S3C24XX */



/*#ifdef CONFIG_SAMSUNG_DEV_TS

static struct resource s3c_ts_resource[] = {

[0] = DEFINE_RES_MEM(SAMSUNG_PA_ADC, SZ_256),

[1] = DEFINE_RES_IRQ(IRQ_TC),

};

*/

/*static struct s3c2410_ts_mach_info default_ts_data __initdata = {

.delay = 10000,

.presc = 49,

.oversampling_shift = 2,

};



struct platform_device s3c_device_ts = {

.name = "s3c64xx-ts",

.id = -1,

.num_resources = ARRAY_SIZE(s3c_ts_resource),

.resource = s3c_ts_resource,

};



void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)

{

if (!pd)

pd = &default_ts_data;



s3c_set_platdata(pd, sizeof(struct s3c2410_ts_mach_info),

&s3c_device_ts);

}

*/

//#endif /* CONFIG_SAMSUNG_DEV_TS */

在arch/arm/ plat-samsung/include/plat/regs-adc.h的後面添加以下代碼:

#define S3C_ADCREG(x) (x)



#define S3C_ADCCON S3C_ADCREG(0x00)

#define S3C_ADCTSC S3C_ADCREG(0x04)

#define S3C_ADCDLY S3C_ADCREG(0x08)

#define S3C_ADCDAT0 S3C_ADCREG(0x0C)

#define S3C_ADCDAT1 S3C_ADCREG(0x10)

#define S3C_ADCUPDN S3C_ADCREG(0x14)

#define S3C_ADCCLRINT S3C_ADCREG(0x18)

#define S3C_ADCMUX S3C_ADCREG(0x1C)

#define S3C_ADCCLRWK S3C_ADCREG(0x20)



/* ADCCON Register Bits */

#define S3C_ADCCON_RESSEL_10BIT (0x0<<16)

#define S3C_ADCCON_RESSEL_12BIT (0x1<<16)

#define S3C_ADCCON_ECFLG (1<<15)

#define S3C_ADCCON_PRSCEN (1<<14)

#define S3C_ADCCON_PRSCVL(x) (((x)&0xFF)<<6)

#define S3C_ADCCON_PRSCVLMASK (0xFF<<6)

#define S3C_ADCCON_SELMUX(x) (((x)&0x7)<<3)

#define S3C_ADCCON_SELMUX_1(x) (((x)&0xF)<<0)

#define S3C_ADCCON_MUXMASK (0x7<<3)

#define S3C_ADCCON_RESSEL_10BIT_1 (0x0<<3)

#define S3C_ADCCON_RESSEL_12BIT_1 (0x1<<3)

#define S3C_ADCCON_STDBM (1<<2)

#define S3C_ADCCON_READ_START (1<<1)

#define S3C_ADCCON_ENABLE_START (1<<0)

#define S3C_ADCCON_STARTMASK (0x3<<0)



/* ADCTSC Register Bits */

#define S3C_ADCTSC_UD_SEN (1<<8)

#define S3C_ADCTSC_YM_SEN (1<<7)

#define S3C_ADCTSC_YP_SEN (1<<6)

#define S3C_ADCTSC_XM_SEN (1<<5)

#define S3C_ADCTSC_XP_SEN (1<<4)

#define S3C_ADCTSC_PULL_UP_DISABLE (1<<3)

#define S3C_ADCTSC_AUTO_PST (1<<2)

#define S3C_ADCTSC_XY_PST(x) (((x)&0x3)<<0)



/* ADCDAT0 Bits */

#define S3C_ADCDAT0_UPDOWN (1<<15)

#define S3C_ADCDAT0_AUTO_PST (1<<14)

#define S3C_ADCDAT0_XY_PST (0x3<<12)

#define S3C_ADCDAT0_XPDATA_MASK (0x03FF)

#define S3C_ADCDAT0_XPDATA_MASK_12BIT (0x0FFF)



/* ADCDAT1 Bits */

#define S3C_ADCDAT1_UPDOWN (1<<15)

#define S3C_ADCDAT1_AUTO_PST (1<<14)

#define S3C_ADCDAT1_XY_PST (0x3<<12)

#define S3C_ADCDAT1_YPDATA_MASK (0x03FF)

#define S3C_ADCDAT1_YPDATA_MASK_12BIT (0x0FFF)

#endif /* __ASM_ARCH_REGS_ADC_H */







配置內核:



System Type --->

[*] ADC common driver support

Device Drivers --->

Input device support --->

[*] Touchscreens --->

<*> S3C touchscreen driver (只選這一個,其他的不要選)

<*> Event interface

如果觸摸屏驅動沒有問題的會就會出現以下驅動信息:

S3C Touchscreen driver, (c) 2008 Samsung Electronics

S3C TouchScreen got loaded successfully : 12 bits

input: S3C TouchScreen as /devices/virtual/input/input0

#################################################  

按照這位網友的操作移植後開機出現:

S3C Touchscreen driver, (c) 2008 Samsung Electronics

s3c-ts s3c-ts: s3c_ts.c: Could not allocate ts IRQ_ADC !

s3c-ts: probe of s3c-ts failed with error -5

TS申請不到IRQ,被adc資源佔用了。

於是,找到arch/arm/plat-samsung/adc.c

ret = request_irq(adc->irq, s3c_adc_irq, 0, dev_name(dev), adc);改爲:

ret = request_irq(adc->irq, s3c_adc_irq, IRQF_SHARED, dev_name(dev), adc);//zxd

重新編譯啓動後顯示:

S3C Touchscreen driver, (c) 2008 Samsung Electronics
S3C TouchScreen got loaded successfully : 12 bits
input: S3C TouchScreen as /devices/virtual/input/input0

但是點擊觸摸屏的時候又會出現:

s3c_adc:s3c64xx_adc_irq:s3c-adc-irq:no adc pending的問題。

重新改回ret = request_irq(adc->irq, s3c_adc_irq, 0, dev_name(dev), adc);

配置內核,取消

System Type --->
[ ] ADC common driver support

再編譯下載,解決上面的問題。

閱讀(5) | 評論(0) | 轉發(0) |
給主人留下些什麼吧!~~
評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章