历史上的今天
返回首页

历史上的今天

今天是:2025年10月13日(星期一)

正在发生

2022年10月13日 | mini2440 简单touch screen驱动程序

2022-10-13 来源:csdn

模块加载后打印出水平和垂直方向的ad转换结果,没有做坐标的转换,只为学习一下touch screen接口的编程方法,代码记录如下:


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#include

#include

 

static struct input_dev *ts_dev; //定时器用于处理长按和滑动

 

static struct ts_regs_t{

unsigned long adccon;

unsigned long adctsc;

unsigned long adcdly;

unsigned long adcdat0;

unsigned long adcdat1;

unsigned long adcupdn;

};

static volatile struct ts_regs_t *ts_regs;

static volatile unsigned long *clkcon;

static struct clk *adc_clk;

static struct timer_list ts_timer;

 

void enable_adc_clock(void){

(*clkcon) |= (1<<15);

}

 

void enter_wait4down_mode(void){

ts_regs->adctsc = 0xd3; //等待中断模式,检测触摸屏按下

}

 

void enter_wait4up_mode(void){

ts_regs->adctsc = 0x1d3; //等待中断模式,检测触摸屏松开

}

 

//进入测量xy坐标的工作模式

void enter_measure_xy_mode(void){

ts_regs->adctsc = (1<<3)|(1<<2);

}

 

//启动ac转换

void start_adc(void){

ts_regs->adccon |= (1<<0);

}

 

//adc中断处理函数

static irqreturn_t grh_handle_adc_irq(int irq, void *dev_id){

static int adc_count = 0;

static int xv=0, yv=0;

 

if(ts_regs->adcdat0 & (1<<15)){

enter_wait4down_mode();

adc_count = 0;

xv = yv = 0;

}

else{ //多次取值取平均值

if(adc_count == 4){

printk(KERN_EMERG"count=%d x=%d y=%dr", adc_count, xv>>2, yv>>2);

 

//上报事件

input_report_abs(ts_dev, ABS_X, xv>>2);

input_report_abs(ts_dev, ABS_Y, yv>>2);

input_report_abs(ts_dev, ABS_PRESSURE, 1);

input_report_key(ts_dev, BTN_TOUCH, 1);

input_sync(ts_dev);

adc_count = 0;

xv = yv = 0;

enter_wait4up_mode();

mod_timer(&ts_timer, jiffies+HZ/100); //10ms

}

else{

adc_count ++;

xv += (ts_regs->adcdat0)&0x3ff;

yv += (ts_regs->adcdat1)&0x3ff;

enter_measure_xy_mode();

start_adc();

}

}

return IRQ_HANDLED;

}

 

 

//tc中断处理函数

static irqreturn_t grh_handle_tc_irq(int irq, void *dev_id){

if(ts_regs->adcdat0 & (1<<15)){

//printk(KERN_EMERG"pen up!n");

enter_wait4down_mode();

}

else{

//printk(KERN_EMERG"pen downn");

//enter_wait4up_mode();

enter_measure_xy_mode();

start_adc();

}

return IRQ_HANDLED;

}

 

//定时器超时处理函数

static void grh_handle_timer_int(unsigned long num){

if(ts_regs->adcdat0 & (1<<15)){

//上报事件

input_report_abs(ts_dev, ABS_PRESSURE, 0);

input_report_key(ts_dev, BTN_TOUCH, 0);

input_sync(ts_dev);

 

enter_wait4down_mode();

}

else{

enter_measure_xy_mode();

start_adc();

}

}

 

 

static int ts_init(void){ 

ts_dev = input_allocate_device();

 

//设置能够产生哪些事件

set_bit(EV_KEY, ts_dev->evbit);

set_bit(EV_ABS, ts_dev->evbit);

set_bit(BTN_TOUCH, ts_dev->keybit); /*触摸屏按键事件*/

input_set_abs_params(ts_dev, ABS_X, 0, 0x3ff, 0, 0); /*设置绝对位移取值范围*/

input_set_abs_params(ts_dev, ABS_Y, 0, 0x3ff, 0, 0); /*设置绝对位移取值范围*/

input_set_abs_params(ts_dev, ABS_PRESSURE, 0, 1, 0, 0); /*设置压力的取值范围,只有0和1*/

/*注册*/

input_register_device(ts_dev);

 

//ioremap

ts_regs = ioremap(0x58000000, sizeof(struct ts_regs_t));

clkcon = ioremap(0x4C00000C, 4);

 

//使能时钟,使得adc可以正常工作

adc_clk = clk_get(NULL, "adc");

    if (!adc_clk) {  

        printk(KERN_ERR "failed to get adc clock sourcen");  

        return -ENOENT;  

    }  

    clk_enable(adc_clk);

 

/*

bit[14] PRESCEN=1 使能预分频

bit[13:6] PRESCVL=49 预分频数值为49(pclk=50.625M) adcclk = 50.625M/50=1.0125MHz

bit[2] STDBM=0 不进入等待模式

bit[1] READ_START=0

bit[0] ENABLE_START=0

*/

ts_regs->adccon = (1<<14)|(49<<6);

ts_regs->adcdly = 0xffff; //设定延时,保证数据的准确性

 

 

//注册中断

if( request_irq(IRQ_TC, grh_handle_tc_irq, IRQF_SAMPLE_RANDOM, "irq_tc", ts_dev) ){

printk(KERN_EMERG"allocate IRQ_TC error!n");

return -EIO;

}

 

if( request_irq(IRQ_ADC, grh_handle_adc_irq, IRQF_SHARED|IRQF_SAMPLE_RANDOM, "irq_adc", ts_dev) ){

printk(KERN_EMERG"allocate IRQ_ADC error!n");

return -EIO;

}

 

init_timer(&ts_timer);

ts_timer.function = grh_handle_timer_int;

add_timer(&ts_timer);

 

enter_wait4down_mode();//等待中断模式,检测触摸屏按下

return 0;

}

 

static void ts_exit(void){

iounmap(ts_regs);

iounmap(clkcon);

free_irq(IRQ_TC, ts_dev);

free_irq(IRQ_ADC, ts_dev);

input_unregister_device(ts_dev);

input_free_device(ts_dev);

del_timer(&ts_timer);

}

 

module_init(ts_init);

module_exit(ts_exit);

MODULE_AUTHOR("GRH");

MODULE_VERSION("1.0");

MODULE_DESCRIPTION("TOUCH SCREEN DRIVER");

MODULE_LICENSE("GPL");


推荐阅读

史海拾趣

Habia Cable公司的发展小趣事

在电子行业中,高博(GBG)公司的发展涉及多个领域和维度,以下是根据不同业务线整理出的五个相关发展故事,每个故事均基于事实描述:

1. 高博教育:私立高等教育与终身学习的引领者

高博教育作为全球教育管理集团(GEM)在中国的旗舰机构,由前摩托罗拉中国区总裁赖炳荣先生创立。公司坐落于苏州工业园区独墅湖高等教育区,致力于发展私立高等教育和终身学习。高博教育成功与香港大学及苏州科技学院合作,创办了苏州港大思培学院,成为江苏省首家香港与内陆合作的院校。此外,高博还与微软(中国)有限公司合资建设苏州高博软件技术学院,开展多层次的软件人才教育,成为江苏省软件人才培养的重要基地。高博教育通过整合全球优质教育资源,为学员提供国际化的课程和学习空间,培养了大量高素质、实用型和国际化的软件人才。

2. 高博(鞍山)半导体有限公司:LED技术的创新者

高博(鞍山)半导体有限公司成立于2019年,位于辽宁省鞍山市,是一家专注于研发、生产及销售LED发光二极管的企业。公司为客户提供多元化的产品,广泛应用于计算机、通讯、消费类电子、汽车电子、工业自动化及医疗等领域。高博(鞍山)半导体有限公司凭借其在LED技术领域的创新能力和完善的产品链,迅速在市场中占据一席之地。公司不仅拥有多项专利和著作权,还积极投资研发,推动LED技术的不断进步。

3. 高博起重设备:物料输送解决方案的提供者

高博公司(GORBEL)自1977年在美国纽约州成立以来,便以提供高效、安全、人性化的物料高架输送解决方案而闻名。公司在北美市场拥有极高的市场占有率,其组合式起重机和旋臂起重机等产品深受客户信赖。为了更好地服务亚洲市场,高博(天津)起重设备有限公司于2006年在天津滨海新区成立,成为美国Gorbel International Inc.在中国的首个生产基地。高博起重设备以其卓越的产品性能和优质的客户服务,在工程机械制造、汽车制造、铁路、风能、航空航天等多个领域赢得了广泛赞誉。

4. 高博医疗集团:血液病与肿瘤治疗的创新者

高博医疗集团是一家专注于血液病和肿瘤治疗的医疗机构集团。近年来,集团通过不断开拓创新,实现了地理版图的快速扩张。在北京、广东、上海等地设立了多家以血液病为专科特色的医疗机构,并成立了以肿瘤为特色的上海阿特蒙医院。高博医疗集团拥有一支由国内外权威专家组成的医疗团队,为患者提供个性化的治疗方案和高质量的医疗服务。同时,集团还积极投入科研创新,取得了一系列卓越的临床和科研成果,在国内外学术界产生了广泛影响。

5. 高博职场文化:激发人才潜能的典范

高博公司在职场文化建设方面也取得了显著成效。公司打破了传统的“论资排辈”体系,以技术、人才为导向,为优秀人才提供了广阔的发展空间。中高管通过高管进阶之旅提升综合能力,新生代员工则通过量身定制的管培生项目进行培养。高博还注重提升员工的职场体验,推出了“高博文化平台和福利平台”,打造数字化职场社交新体验。同时,公司倡导“悦生活·享工作be better@GHG”的健康理念,重视员工的身心健康和职业发展。这些举措不仅增强了员工的归属感和幸福感,也为企业的发展注入了源源不断的动力。

Faraday Electronics Inc公司的发展小趣事

在XXXX年,电子行业迎来了前所未有的变革。随着物联网、人工智能等技术的快速发展,传统的电子产品市场面临着巨大的挑战。Faraday Electronics Inc意识到,如果不进行战略转型,公司将难以在激烈的市场竞争中立足。于是,公司决定转型为一家专注于智能硬件和软件解决方案的提供商。通过这一战略转型,公司成功抓住了市场机遇,实现了快速发展。

CONEC公司的发展小趣事

作为一家有远见的企业,CONEC不仅关注自身的经济效益,还积极履行社会责任。公司致力于推动电子行业的可持续发展,通过采用环保材料、优化生产工艺等方式降低生产过程中的环境影响。同时,CONEC还积极参与社会公益事业,支持教育、环保等领域的发展。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事仅为基于公开信息的推测和构建,可能并不完全准确反映CONEC公司的实际发展历程。如果您需要更详细和准确的信息,建议查阅CONEC公司的官方资料或相关新闻报道。

DLP Design公司的发展小趣事

DLP绿色科技公司,积极响应国家环保政策,致力于研发和生产绿色环保的DLP技术产品。公司采用先进的生产工艺和材料,降低产品能耗和排放。同时,DLP绿色科技还积极推广节能环保的理念和技术,倡导消费者使用环保产品。通过不懈的努力和实践,DLP绿色科技在电子行业树立了绿色环保的典范形象,为行业的可持续发展做出了积极贡献。

请注意,以上故事均为虚构,旨在展示DLP Design公司在电子行业中的可能发展路径和成就。实际情况可能因公司背景、市场环境等因素而有所不同。

Flamar公司的发展小趣事

在追求经济效益的同时,Flamar公司始终不忘履行企业社会责任。公司积极响应全球绿色可持续发展号召,将环保理念融入产品研发、生产和销售的各个环节。通过采用环保材料、优化生产工艺、推广节能产品等措施,Flamar公司有效降低了产品生命周期中的环境影响。此外,公司还积极参与公益事业和社会活动,为推动电子行业的绿色可持续发展贡献自己的力量。

Dowosemi公司的发展小趣事

在电子保护器件领域,Dowosemi公司以其创新的TVS二极管技术崭露头角。该公司研发团队经过数年的努力,成功开发出具有PS级响应速度、大瞬态功率和低漏电流的TVS二极管。这一技术突破大大提高了产品的性能,满足了市场对高效能过电压保护元件的需求。Dowosemi公司凭借这一优势,迅速在市场上确立了领先地位。

问答坊 | AI 解惑

射频识别PK无线互联 哪个更“泛在“?

“泛在”即“无所不在” ,也有人称之为“普适”即“普遍适用” 。20世纪80年代8位台式电脑开始普及,但有些办公设备的厂商认为计算不应只限于电脑,而是存在于社会的所有方面,也就是说任何电子设备里都应该包含计算技术。本世纪初日本东京工业大 ...…

查看全部问答>

时钟设计程序问题

利用10M的时钟,设计一个周期为50微秒单周期的输出时钟,其中波峰为10微秒…

查看全部问答>

LPC1114 PWM 测试效果!!!!!更交流

好几天没有发帖子啦,干别的啦   2010.5.14 测试PWM 功能 , 现发些图片!!使用方面 可以自行按照相关的参数自行设置占空比之类的 , 现在没有用上,制作测试 图片供交流,  …

查看全部问答>

LED

有没有关于1W到10WLED的简单驱动电路图,和简单开关电源…

查看全部问答>

关于ROM 和 RAM 编址问题

系统上电的时候,cs:ip 指向0xffff0,这个位置应该为ROM地址,这时RAM是不可用的,当ROM bios检测到RAM时,是否执行了代码拷贝?将ROM bios拷到1M高端的64k,如果bios大于64k怎么办呢?或者根本没有什么代码拷贝,只是进行了内存映射? video bios ...…

查看全部问答>

怎么在tcpmp里注册一种新类型的视频格式

我现在想使tcpmp能够播放一种新的视频文件(.avs格式),想请教高手怎么才能在里面注册这种格式,使tcpmp能够认识.avs格式呢??…

查看全部问答>

写了INF,但是安装失败,帮忙看一下

我的INF是为Realtek 8139网卡写的 我在设备管理器中,用更新驱动的方式想把驱动加载上网卡,但是每次都提示“向导无法为您的硬件找到比您现在已经安装的软件更匹配的软件”,请问这是什么原因啊? 我的INF是用DDK下的GenINF的WIZARD写了一个框架 ...…

查看全部问答>

关于12864的LCD屏(半屏)做指针式时钟的问题

完全没有思路。。。。限定是用51系列芯片,手头上只有AT89S52,半屏显示指针如果把所有可能都存在片内ROM 那么64(行数)*8(列字节数)*8bit=512(字节)一屏,需要保存的数据有60时*60分*60秒=216000,即108000KB=108MB。。。晕 所以只能用实时 ...…

查看全部问答>

高频电压跟随器问题

小弟用AD8011(电流反馈型)做了个电压跟随器,电压信号为小信号正弦波,希望在80MHz的带宽以内能有较好的跟随效果, 电路是参考AD8011数据手册上面的电路图跟元件参数,在万能板上焊的。反馈电阻1K,输入端接50欧姆电阻到地。 示波器用的是Agile ...…

查看全部问答>