




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TP移植lionking0809发表于 2012-11-26 10:13:19 浏览(132200)1、修改alps/mediatek/config/$Project/ProjectConfig.mk中的CUSTOM_KERNEL_TOUCHPANEL值为gb818b2、用DCT软件配置硬件接口:EINT3改为TOUCHPANEL,GPIO43的VarName1值改为GPIO_CTP_EN_PIN,GPIO190的Def Mode值改为EINT3,VarName1值改为GPIO_CTP_EINT_PIN3、修改头文件alps/mediatek/custom/cenon13_gb/kernel/touchpanel/gt818b/tpd_custom_gt818b.h(若没有则新建,可仿照cy8ctma300的tpd_custom_cy8ctma300.h)将TPD_CALIBRATION_MATRIX值改为-384,0,1966080,0,426,0,0,0,增加如下代码:static u8 cfg_data =#ifdef CUSTOM_KERNEL_ALSPS 0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00, 0x10,0x12,0x01,0x11,0x11,0x11,0x21,0x11, 0x31,0x11,0x41,0x11,0x51,0x11,0x61,0x11, 0x71,0x11,0x81,0x11,0x91,0x11,0xA1,0x11, 0xB1,0x11,0xC1,0x11,0xD1,0x11,0xE1,0x11, 0xF1,0x11,0x17,0x03,0xE8,0xE8,0xE8,0x2A, 0x2A,0x2A,0x0C,0x0C,0x08,0x40,0x30,0x1d, 0x03,0x00,0x05,0x40,0x01,0xE0,0x01,0x00, 0x00,0x53,0x53,0x4E,0x4E,0x00,0x00,0x1B, 0x14,0x05,0x0A,0x00,0x21,0x33,0x3F,0x04, 0x14,0x10,0x00,0x00,0x04,0x00,0x00,0x00, 0x00,0x08,0x00,0x00,0x00,0x00,0x0B,0x55, 0x40,0x3C,0x28,0x00,0x00,0x00,0x00,0x00, 0x10,0x01#else 0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04, 0x02,0x00,0xE0,0x00,0x60,0x00,0xD0,0x00, 0x50,0x00,0xC0,0x00,0x40,0x00,0xB0,0x00, 0x30,0x00,0xA0,0x00,0x20,0x00,0x90,0x00, 0x10,0x00,0x80,0x00,0x00,0x00,0x70,0x00, 0xF0,0x00,0x1D,0x03,0x10,0x10,0x10,0x2A, 0x2A,0x2A,0x0F,0x0F,0x0A,0x40,0x30,0x3B, 0x03,0x00,0x05,0x40,0x01,0xF7,0x01,0x00, 0x00,0x5A,0x59,0x5E,0x5D,0x00,0x00,0x34, 0x14,0x03,0x08,0xEF,0x7D,0xFB,0x77,0xFF, 0x14,0x10,0xE4,0x03,0xFF,0x00,0x00,0x00, 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xF7,0xED,0xFF,0xDB,0x00, 0x00,0x01#endif4、alps/mediatek/custom/common/kernel/touchpanel/gt818b/gt818b_driver.c 文件参考代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef CONFIG_HAS_EARLYSUSPEND#include #endif#include #include #include #include #include #include tpd.h#include #include #ifndef TPD_NO_GPIO#include cust_gpio_usage.h#endif#include tpd_custom_gt818b.hextern struct tpd_device *tpd;static int tpd_flag = 0;static int tpd_halt=0;static int i2c_clock = 400;static struct task_struct *thread = NULL;static DECLARE_WAIT_QUEUE_HEAD(waiter);#if (defined(TPD_WARP_START) & defined(TPD_WARP_END)static int tpd_wb_start_localTPD_WARP_CNT = TPD_WARP_START;static int tpd_wb_end_localTPD_WARP_CNT = TPD_WARP_END;#endif#if (defined(TPD_HAVE_CALIBRATION) & !defined(TPD_CUSTOM_CALIBRATION)static int tpd_calmat_local8 = TPD_CALIBRATION_MATRIX;static int tpd_def_calmat_local8 = TPD_CALIBRATION_MATRIX;#endifstatic void tpd_eint_interrupt_handler(void);static int touch_event_handler(void *unused);static int tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);static int tpd_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info);static int tpd_i2c_remove(struct i2c_client *client);extern void mt65xx_eint_unmask(unsigned int line);extern void mt65xx_eint_mask(unsigned int line);extern void mt65xx_eint_set_hw_debounce(kal_uint8 eintno, kal_uint32 ms);extern kal_uint32 mt65xx_eint_set_sens(kal_uint8 eintno, kal_bool sens);extern void mt65xx_eint_registration(kal_uint8 eintno, kal_bool Dbounce_En, kal_bool ACT_Polarity, void (EINT_FUNC_PTR)(void), kal_bool auto_umask);extern intgt818_downloader( struct i2c_client *client, unsigned short ver, unsigned char * data );#define TPD_DITO_SENSOR#define TPD_RESET_ISSUE_WORKAROUND#define TPD_MAX_RESET_COUNT 3#define TPD_FREQ_HOPPING#define TPD_OK 0#define TPD_CONFIG_REG_BASE 0x6A2#define TPD_FREQ_CAL_RESULT 0x70F#define TPD_TOUCH_INFO_REG_BASE 0x712#define TPD_KEY_INFO_REG_BASE 0x721#define TPD_POINT_INFO_REG_BASE 0x722#define TPD_VERSION_INFO_REG 0x713#define TPD_POWER_MODE_REG 0x692#define TPD_HANDSHAKING_START_REG 0xFFF#define TPD_HANDSHAKING_END_REG 0x8000#define TPD_FREQ_REG 0x1522#define TPD_SOFT_RESET_MODE 0x01#define TPD_POINT_INFO_LEN 8#define TPD_MAX_POINTS 5#define TPD_MAX_KEYS 4#define MAX_TRANSACTION_LENGTH 8#define I2C_DEVICE_ADDRESS_LEN 2#define I2C_MASTER_CLOCK 400#define TPD_CONFIG_SIZE 106#define CHR_CON0 (0xF7000000+0x2FA00)#define MAX_I2C_TRANSFER_SIZE (MAX_TRANSACTION_LENGTH - I2C_DEVICE_ADDRESS_LEN)#define GT818_CONFIG_PROC_FILE gt818_config#define GT818_CONFIG_I2C_PROC_FILE gt818_config_i2cstruct tpd_info_t u8 vendor_id_1; u8 vendor_id_2; u8 product_id_1; u8 product_id_2; u8 version_1; u8 version_2;static struct i2c_client *i2c_client = NULL;static const struct i2c_device_id tpd_i2c_id = gt818_tpd,0,;static unsigned short force = TPD_I2C_NUMBER, 0xBA, I2C_CLIENT_END,I2C_CLIENT_END;static const unsigned short * const forces = force, NULL ;static struct i2c_client_address_data addr_data = .forces = forces,;static struct i2c_driver tpd_i2c_driver = .probe = tpd_i2c_probe, .remove = tpd_i2c_remove, .detect = tpd_i2c_detect, . = gt818_tpd, .id_table = tpd_i2c_id, .address_data = &addr_data, ;struct tpd_info_t tpd_info;#ifdef TPD_FREQ_HOPPINGstatic u8 freq_base_value = 0;#endifstatic int i2c_write_bytes( struct i2c_client *client, u16 addr, u8 *txbuf, int len );static int i2c_write_dummy( struct i2c_client *client, u16 addr );static struct proc_dir_entry *gt818_config_proc = NULL;static int gt818_config_read_proc(char *page, char *start, off_t off, int count, int *eof, void *data) char *ptr = page; int i; ptr += sprintf( ptr, = GT818 normal config =n ); for ( i = 0 ; i 0 & value addr, .flags = 0, .buf = buffer, .len = I2C_DEVICE_ADDRESS_LEN, .timing = I2C_MASTER_CLOCK , .addr = client-addr, .flags = I2C_M_RD, .timing = I2C_MASTER_CLOCK , ; if ( rxbuf = NULL ) return -1; TPD_DEBUG(i2c_read_bytes to device X address X len %dn, client-addr, addr, len ); while ( left 0 ) buffer0 = ( ( addr+offset ) 8 ) & 0xFF; buffer1 = ( addr+offset ) & 0xFF; msg1.buf = &rxbufoffset; if ( left MAX_TRANSACTION_LENGTH ) msg1.len = MAX_TRANSACTION_LENGTH; left -= MAX_TRANSACTION_LENGTH; offset += MAX_TRANSACTION_LENGTH; else msg1.len = left; left = 0; retry = 0; while ( i2c_transfer( client-adapter, &msg0, 2 ) != 2 ) retry+; if ( retry = 20 ) TPD_DEBUG(I2C read 0x%X length=%d failedn, addr + offset, len); return -1; return 0;static int i2c_write_bytes( struct i2c_client *client, u16 addr, u8 *txbuf, int len ) u8 bufferMAX_TRANSACTION_LENGTH; u16 left = len; u16 offset = 0; u8 retry = 0; struct i2c_msg msg = .addr = client-addr, .flags = 0, .buf = buffer, .timing = I2C_MASTER_CLOCK ; if ( txbuf = NULL ) return -1; TPD_DEBUG(i2c_write_bytes to device X address X len %dn, client-addr, addr, len ); while ( left 0 ) retry = 0; buffer0 = ( (addr+offset) 8 ) & 0xFF; buffer1 = ( addr+offset ) & 0xFF; if ( left MAX_I2C_TRANSFER_SIZE ) memcpy( &bufferI2C_DEVICE_ADDRESS_LEN, &txbufoffset, MAX_I2C_TRANSFER_SIZE ); msg.len = MAX_TRANSACTION_LENGTH; left -= MAX_I2C_TRANSFER_SIZE; offset += MAX_I2C_TRANSFER_SIZE; else memcpy( &bufferI2C_DEVICE_ADDRESS_LEN, &txbufoffset, left ); msg.len = left + I2C_DEVICE_ADDRESS_LEN; left = 0; TPD_DEBUG(byte left %d offset %dn, left, offset ); while ( i2c_transfer( client-adapter, &msg, 1 ) != 1 ) retry+; if ( retry = 20 ) TPD_DEBUG(I2C write 0x%X%X length=%d failedn, buffer0, buffer1, len); return -1; else TPD_DEBUG(I2C write retry %d addr 0x%X%Xn, retry, buffer0, buffer1); return 0;static int i2c_write_dummy( struct i2c_client *client, u16 addr ) u8 bufferMAX_TRANSACTION_LENGTH; struct i2c_msg msg = .addr = client-addr, .flags = 0, .buf = buffer, .timing = I2C_MASTER_CLOCK, .len = 2 ; TPD_DEBUG(i2c_write_dummy to device X address Xn, client-addr, addr ); buffer0 = (addr 8) & 0xFF; buffer1 = (addr) & 0xFF; i2c_transfer( client-adapter, &msg, 1 ); return 0;static int tpd_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info) strcpy(info-type, gt818_tpd); return 0;/bk for touchpannel proximity.extern intset_tpd_proximity_enable(unsigned char enable);static int tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) int err = 0; char *crash = 0; printk(bk trace: gt818 tpd_i2c_probe n); if(TPD_POWER_SOURCE != MT65XX_POWER_NONE) hwPowerDown(TPD_POWER_SOURCE,TP); hwPowerOn(TPD_POWER_SOURCE,VOL_2800,TP); msleep(50); #ifdef TPD_RESET_ISSUE_WORKAROUND int reset_count = 0;reset_proc: / power on CTP mt_set_gpio_mode(GPIO_CTP_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO); mt_set_gpio_dir(GPIO_CTP_EN_PIN, GPIO_DIR_OUT); mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ONE); / set INT mode mt_set_gpio_mode(GPIO_CTP_EINT_PIN, GPIO_CTP_EINT_PIN_M_GPIO); mt_set_gpio_dir(GPIO_CTP_EINT_PIN, GPIO_DIR_IN); mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN, GPIO_PULL_DISABLE); / reset mt_set_gpio_mode(GPIO_CTP_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO); mt_set_gpio_dir(GPIO_CTP_EN_PIN, GPIO_DIR_OUT); mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ZERO); msleep(1); mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ONE); msleep(20);#elseprintk(yangting Not define TPD_RESET_ISSUE_WORKAROUNDn); / set deep sleep off mt_set_gpio_mode(GPIO_CTP_RST_PIN, GPIO_CTP_RST_PIN_M_GPIO); mt_set_gpio_dir(GPIO_CTP_RST_PIN, GPIO_DIR_OUT); mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE); msleep(10); / power down CTP mt_set_gpio_mode(GPIO_CTP_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO); mt_set_gpio_dir(GPIO_CTP_EN_PIN, GPIO_DIR_OUT); mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ZERO); msleep(10); / power on CTP mt_set_gpio_mode(GPIO_CTP_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO); mt_set_gpio_dir(GPIO_CTP_EN_PIN, GPIO_DIR_OUT); mt_set_gpio_out(GPIO_CTP_EN_PIN, GPIO_OUT_ONE); msleep(10); #endif memset( &tpd_info, 0, sizeof( struct tpd_info_t ) ); i2c_write_dummy( client, TPD_HANDSHAKING_START_REG ); err = i2c_read_bytes( client, TPD_VERSION_INFO_REG, (u8 *)&tpd_info, sizeof( struct tpd_info_t ) ); if ( err ) TPD_DMESG(TPD_DEVICE fail to get tpd info %dn, err ); return err; else #ifdef TPD_FREQ_HOPPING err = i2c_read_bytes( client, TPD_FREQ_REG, &freq_base_value, 1 ); TPD_DMESG( TPD FREQ BASE Xn, freq_base_value);#endif TPD_DMESG( TPD infon); TPD_DMESG( vendor X Xn, tpd_info.vendor_id_1, tpd_info.vendor_id_2 ); TPD_DMESG( product X Xn, tpd_duct_id_1, tpd_duct_id_2 ); TPD_DMESG( version X Xn, tpd_info.version_1, tpd_info.version_2 ); / check if upgradable /gt818_downloader( client, tpd_info.version_2*256 + tpd_info.version_1, goodix_gt818_firmware ); #ifdef TPD_RESET_ISSUE_WORKAROUND if ( err ) if ( reset_count read_proc = gt818_config_read_proc; gt818_config_proc-write_proc = gt818_config_write_proc; gt818_config_i2c_proc = create_proc_entry( GT818_CONFIG_I2C_PROC_FILE, 0666, NULL); if ( gt818_config_i2c_proc = NULL ) TPD_DEBUG(create_proc_entry %s failedn, GT818_CONFIG_I2C_PROC_FILE ); else gt818_config_i2c_proc-read_proc = gt818_config_i2c_read_proc; gt818_config_i2c_proc-write_proc = gt818_config_i2c_write_proc; /kuuga modify end/ / setting resolution, RES_X, RES_Y cfg_data59 = TPD_RES_X&0xff; cfg_data60 = (TPD_RES_X8)&0xff; cfg_data61 = TPD_RES_Y&0xff; cfg_data62 = (TPD_RES_Y8)&0xff; err = i2c_write_bytes( client, TPD_CONFIG_REG_BASE, cfg_data, TPD_CONFIG_SIZE ); if ( err ) TPD_DMESG(TPD_DEVICE fail to write tpd cfg %dn, err ); *crash = 0; return err; i2c_write_dummy( client, TPD_HANDSHAKING_END_REG ); thread = kthread_run(touch_event_handler, 0, TPD_DEVICE); if (IS_ERR(thread) err = PTR_ERR(thread); TPD_DMESG(TPD_DEVICE failed to create kernel thread: %dn, err); *crash = 0; return err; #ifndef TPD_RESET_ISSUE_WORKAROUND mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ZERO); msleep(10);#endif / set INT mode mt_set_gpio_mode(GPIO_CTP_EINT_PIN, GPIO_CTP_EINT_PIN_M_EINT); mt_set_gpio_dir(GPIO_CTP_EINT_PIN, GPIO_DIR_IN); mt_set_gpio_pull_enable(GPIO_CTP_EINT_PIN, GPIO_PULL_DISABLE); /mt_set_gpio_pull_select(GPIO_CTP_EINT_PIN, GPIO_PULL_UP); msleep(50); mt65xx_eint_set_sens(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_SENSITIVE); mt65xx_eint_set_hw_debounce(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN); /mt65xx_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN, CUST_EINT_TOUCH_PANEL_POLARITY, tpd_eint_interrupt_handler, 1); mt65xx_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN, CUST_EINT_POLARITY_HIGH, tpd_eint_interrupt_handler, 1); mt65xx_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);#ifndef TPD_RESET_ISSUE_WORKAROUND mt_set_gpio_out(GPIO_CTP_RST_PIN, GPIO_OUT_ONE);#endif tpd_load_status = 1; /set_tpd_proximity_enable(1); return 0;static void tpd_eint_interrupt_handler(void) printk(yangting tpd_eint_interrupt_handlern); TPD_DEBUG_PRINT_INT; tpd_flag=1; wake_up_interruptible(&waiter
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制冷剂能效标准解读报告
- 轮渡安全法规执行成效分析报告
- 宁德小学生数学试卷
- 2025年射频同轴电缆组件项目发展计划
- 类型多的数学试卷
- 六安小学数学试卷
- 期中考试四年级数学试卷
- 历史政治英语数学试卷
- 兽药库存信息化改造分析报告
- 亲自做数学试卷
- 检车站员工管理制度
- 信息安全的法律法规试题及答案
- 安徽省天一大联考2025年高三最后一卷英语试题及答案
- T/CACEC 0007-2023陶瓷纤维模块筑炉技术规程
- 被迫签署离职协议书
- 内蒙古华电正能圣圆伊金霍洛旗风光制氢一体化项目(风电部分)-环境影响报告书
- 学习解读《水利水电建设工程验收规程》SLT223-2025课件
- 感冒急性鼻炎护理
- 2024年村秘书述职报告
- 私房摄影保密协议书
- 天麻买卖合同协议
评论
0/150
提交评论