Tiny6410移植tslib

发布者:technology78最新更新时间:2024-09-20 来源: cnblogs关键字:Tiny6410  移植 手机看文章 扫描二维码
随时随地手机看文章

一、将Tiny6410一线触摸程序改成输入设备(input device)


由于友善一线触摸下位机不开源,所以只能在官方提供的内核模块上进行修改。


官方源代码:http://pan.baidu.com/s/1bog4rZD


1、修改模块加载函数


 1 static int __init dev_init(void)

 2 {

 3     int ret;

 4 #ifdef TS_INPUT_DRIVER

 5     /* alloc input system device */

 6     ts.input = input_allocate_device();

 7     

 8     ts.input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);

 9     ts.input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);

10     

11     input_set_abs_params(ts.input, ABS_X, 0, 0xFFFF, 0, 0);

12     input_set_abs_params(ts.input, ABS_Y, 0, 0xFFFF, 0, 0);

13 

14     ts.input->name = 'Tiny6410 TouchScreen';

15     ts.input->id.bustype = BUS_HOST;

16     ts.input->id.vendor = 0xDEAD;

17     ts.input->id.product = 0xBEEF;

18     ts.input->id.version = 0x0102;

19 

20 

21     set_pin_up();

22     set_pin_value(1);

23     set_pin_as_output();

24     setup_irq(IRQ_TIMER3, &timer_for_1wire_irq);

25     ret = init_timer_for_1wire();

26     if(ret < 0)

27     {

28         printk(TOUCH_DEVICE_NAME'timer init failedn');

29         goto timer_err;

30     }

31     init_timer(&one_wire_timer);

32     one_wire_timer_proc(0);

33     create_proc_read_entry('driver/one-wire-info', 0, NULL, read_proc, NULL);

34 

35     /* register to the input system */

36     ret = input_register_device(ts.input);

37     if(ret < 0)

38     {

39         printk(TOUCH_DEVICE_NAME'failed to register input devicen');

40         goto timer_err;

41     }

42     

43     return 0;

44 timer_err:

45     free_irq(IRQ_TIMER3, &timer_for_1wire_irq);

46 

47 #else

48 

49     ret = misc_register(&ts_misc) | misc_register(&bl_misc) ;

50     set_pin_up();

51     set_pin_value(1);

52     set_pin_as_output();

53 

54     if (ret == 0) {

55         setup_irq(IRQ_TIMER3, &timer_for_1wire_irq);

56         ret = init_timer_for_1wire();

57         init_timer(&one_wire_timer);

58         one_wire_timer_proc(0);

59         create_proc_read_entry('driver/one-wire-info', 0, NULL, read_proc, NULL);

60     }

61     

62     if (ret == 0) {

63         printk (TOUCH_DEVICE_NAME'tinitializedn');

64         printk (BACKLIGHT_DEVICE_NAME'tinitializedn');

65     }

66 #endif

67 

68     return ret;

69 }


在这个函数中提交输入的事件EV_KEY、EV_ABS、BTN_TOUCH,并注册输入设备到系统。


2、向输入子系统报告输入事件


修改源代码notify_ts_data()函数:


 1 static inline void notify_ts_data(unsigned x, unsigned y, unsigned down)

 2 {

 3     if (!down && !(ts_status &(1U << 31))) {

 4         // up repeat, give it up

 5 #ifdef TS_INPUT_DRIVER

 6         input_report_key(ts.input, BTN_TOUCH, 0);

 7         input_sync(ts.input);

 8 #endif

 9         return;

10     }

11 #ifdef TS_INPUT_DRIVER

12     ts.xp = x;

13     ts.yp = y;

14     //printk('ts.xp = %ld,ts.yp = %ldn',ts.xp,ts.yp);

15     input_report_abs(ts.input, ABS_X, ts.xp);

16     input_report_abs(ts.input, ABS_Y, ts.yp);

17 

18     input_report_key(ts.input, BTN_TOUCH, 1);

19     input_sync(ts.input);

20 #else

21     ts_status = ((x << 16) | (y)) | (down << 31);

22     ts_ready = 1;

23     wake_up_interruptible(&ts_waitq);

24 #endif

25 }


这个函数在按键按下时向输入子系统报告X/Y轴坐标的AD值和按键按下标志,在按键释放时报告按键释放标志。


3、修改模块卸载函数


 1 static void __exit dev_exit(void)

 2 {

 3     exitting = 1;

 4 #ifdef TS_INPUT_DRIVER

 5     input_unregister_device(ts.input);

 6 #endif

 7     remove_proc_entry('driver/one-wire-info', NULL);

 8     del_timer_sync(&one_wire_timer);

 9     free_irq(IRQ_TIMER3, &timer_for_1wire_irq);

10 #ifndef TS_INPUT_DRIVER

11     misc_deregister(&ts_misc);

12     misc_deregister(&bl_misc);

13 #endif

14 }


在模块卸载函数中卸载输入设备。


二、移植tslib到开发板


tslib源码下载:http://pan.baidu.com/s/1qXuqPdU


编译工具:arm-linux-gcc


1、下载源码并解压


tar xzbf tslib-1.4.tar.gz

 

2、修改源码


打开源码tslib/plugins/input-raw.c文件


首先修改check_fd()函数,由于设备驱动没有用到ioctl,所以这个检测函数直接返回0。但是设备驱动用到了同步所以要把using_syn = 1:


 1 static int check_fd(struct tslib_input *i)

 2 {

 3     struct tsdev *ts = i->module.dev;

 4     int version;

 5     u_int32_t bit;

 6     u_int64_t absbit;

 7 /*

 8     if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&

 9         (version == EV_VERSION) &&

10         (ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&

11         (bit & (1 << EV_ABS)) &&

12         (ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&

13         (absbit & (1 << ABS_X)) &&

14         (absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {

15         fprintf(stderr, 'selected device is not a touchscreen I understandn');

16         return -1;

17     }

18 */

19     printf('selected device!n');

20     //if (bit & (1 << EV_SYN))

21         i->using_syn = 1;

22 

23     return 0;

24 }


修改ts_input_read()函数,根据设备驱动程序可以知道,设备驱动提交BTN_TOUCH表示触摸屏有无按下,且设备驱动没有提交ABS_PRESSURE


 1 static int ts_input_read(struct tslib_module_info *inf,

 2              struct ts_sample *samp, int nr)

 3 {

 4     struct tslib_input *i = (struct tslib_input *)inf;

 5     struct tsdev *ts = inf->dev;

 6     struct input_event ev;

 7     int ret = nr;

 8     int total = 0;

 9 

10     if (i->sane_fd == 0)

11         i->sane_fd = check_fd(i);

12 

13     if (i->sane_fd == -1)

14         return 0;

15 

16     if (i->using_syn) {

17         while (total < nr) 

18         {

19             ret = read(ts->fd, &ev, sizeof(struct input_event));

20             if (ret < (int)sizeof(struct input_event)) {

21                 total = -1;

22                 break;

23             }

24             switch (ev.type) 

25             {

26             case EV_KEY:

27                 switch (ev.code) 

28                 {

29                 case BTN_TOUCH:

30                     if (ev.value == 0) 

31                     {

32                         /* pen up */

33                         samp->x = 0;

34                         samp->y = 0;

35                         //samp->pressure = 0;

36                         i->current_p = 0;

37                         samp->tv = ev.time;

38                         //samp++;

39                         //total++;

40                         printf('key_upn');

41                     }

42                     else if(ev.value == 1)

43                     {

44                         i->current_p = 1;

45                         printf('key_downn');

46                     }

47                     break;

[1] [2]
关键字:Tiny6410  移植 引用地址:Tiny6410移植tslib

上一篇:Linux-2.6.39在Tiny6410上的移植
下一篇:Linux设备驱动开发 - LCD设备驱动分析

推荐阅读最新更新时间:2024-11-07 12:18

μC/OS-III在Cortex-M3处理器上的移植
引言 μC/OS-III是一款基于优先级调度的抢占式实时内核,Micrium公司于2011年8月公开了μC/OS-III的源码,其源码遵循ANSIC标准,因而具有良好的移植性,相信其将会被移植到越来越多的处理器体系上。本文主要完成基于Cortex-M3处理器的μC/OS-III移植,通过本次移植,加深对嵌入式操作系统原理的理解。此外,在μC/OS-III移植成功的基础上进行嵌入式应用程序开发,可以把主要精力集中到应用程序上,而硬件资源交由μC/OS-III管理,从而使得嵌入式应用程序更易开发和维护,在嵌入式软硬件结构变得越来越复杂的今天具有现实意义。 1 μC/OS-III和Cortex-M3特点 相对以前的版本,μC/O
[单片机]
μC/OS-III在Cortex-M3处理器上的<font color='red'>移植</font>
ffmpeg 移植到 arm s3c2410
首先需要说明的是,由于我只需要在arm上做视屏采集,就没有移植其他的编码和解码库。 这个做好了,那些库加载上来编译也是很容易的! arm-linux-gcc版本:arm-linux-gcc-3.3.2.tar.bz2 我上传了一个,网上也很多: 下载地址: http://d.namipan.com/d/00808da27701ace3a1a0abdd179e23b699c7f64442197504 ffmpeg版本:ffmpeg-0.4.9-p20051120.tar.bz2 下载地址: http://d.namipan.com/d/2c36d68693ee061b0806f7a32d45c22af5bb177ab
[单片机]
uCOS-Ⅱ C51移植笔记
(1)实时系统和前/后台系统; 前/后台系统:一个大循环,循环查询各种标志位。如果标志位置位,就执行相应的服务程序。标志位就是标志事件的发生,事件响应延时处于不可预测状态。最坏的情况是循环中所有其他的事件服务程序执行完,才响应当前事件。中断服务虽然能即时/优先响应,但是它们和主循环的通讯,也是通过置主循环中相应的标志位来完成的。 实时系统(uCOS):整个程序分成一个个看起来好象是并行的任务,每个任务都在等待事件的发生。除了最低优先级任务(在uCOS中是IDLE任务)是死循环以外,其他的任务都不能死循环,只能在驱动事件驱动下工作。任何驱动事件的产生,都使优先级最高的就绪任务运行。任务和任务/任务和中断的通讯,是通过相应事件驱动来完
[单片机]
linux-2.6.38到tiny6410移植手册(连载1)__nand flash
2440的linux移植手册满天飞,到了6410怎么就没有了呢? 既然源码都给了,为什么不把移植步骤写出来,好让大家学习呢? 今日,小弟自搞奋勇,想自己移植一遍linux-2.6.38,参考友善给的源码,觉得既然源码都有了,想发掘移植步骤应该不难吧,嘿嘿 环境 VirtualBox+ubuntu 10.04 编译器,友善自带arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz 硬件,tiny6410,核心板号1107 linux-2.6.38到tiny6410的移植手册(连载2)__网卡&NF http://www.arm9home.net/read.php?tid-14211.html linux
[单片机]
Contiki移植到STM32F103VC
Contiki官网下载V2.5源码http://www.contiki-os.org/ contiki-2.5源码中,stm32移植的相关内容分散在两个文件夹中,第一, cpu\arm\stm32f103,这个文件夹存放的stm32移植的相关文件;第二,platform\stm32test,这个文件夹中有一个不是那么完整的例子。 在Contiki-2.5源码文件夹下用到的有:\core\sys\下面所有文件,\cpu\arm\stm32f103\clock.c文件主要修改,\platform\stm32test\contiki-conf.h文件。 STM32工程下主要用到的文件:core_cm3.c,system_stm3
[单片机]
ucOS_II移植:Stm32启动代码分析
用的编译工具是keil,在用keil建立stm32工程时,一般会产生一个启动文件,STM32F10x.s,在st提供的库函数里,用cortexm3_macro.s和stm32f10x_vector.s来代替这个文件。不过内容都大同小异。 我在csdn上搜到了一个在stm32上移植好的ucos,打算在这个代码的基础上,添加注释,先学别人的,然后再自己移植。 我获得的这份例程,使用了startup_stm32f10x_md.s作为启动文件,其中,删去了部分采用扩展SRAM的代码。 其文件内容为 startup_stm32f10x_md.s ;******** (C) COPYRIGHT2010 STMicroelectronics
[单片机]
在嵌入式实时操作系统uC/0SII上移植实现LwIP这套TCP/IP协议栈
内容摘要:结合ez80和ARM7两种系统上的具体实现,说明了如何在嵌入式实时操作系统uC/0SII上移植实现LwIP这套TCP/IP协议栈,使uC/0S II成为支持网络的RTOS。 1 引言 随着嵌入式系统与网络的日益结合,在嵌入式实时操作系统中引入TCP/IP协议栈,以支持嵌入式设备接入网络,成为嵌入式领域重要的研究方向。uC/0S II是近年来发展迅速的一个开放源码实时操作系统,但它只是一个实时的任务调度及通信内核,缺少对外围设备和接口的支持,如没有文件系统、网络协议、图形界面。笔者在多个嵌入式项目的开发过程中,以开源TCP/IP协议栈LwIP为基础,给uC/0S II加上了网络支持。下面就以uC/0S II +
[单片机]
linux-2.6.32在mini2440开发板上移植 移植看门狗驱动
1 在内核中配置看门狗驱动 Linux-2.6.32.2 内核具有完善的S3C2440 的看梦狗驱动,我们只需配置一下就可以使用 了。在内核源代码目录执行:make menuconfig,进入内核配置主菜单,依次选择进入如 下子菜单: Device Drivers --- Watchdog Timer Support --- 打开看门狗配置菜单,在这里可以选择对S2C2410/2440 中看门狗的配置选项。 以上配置所对应的驱动源代码为:linux-2.6.32.2/drivers/watchdog/s3c2410_wdt.c 2 测试看门狗 虽然友善之臂提供了一个漂亮的图形界面的看门狗测
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved