usb触摸屏驱动 单片机,usb触摸屏驱动怎么安装
源码在/驱动程序/输入/触摸屏/usbtouchscreen.c中
static int _ _ init USB touch _ init(void)//入口函数
返回USB _ register(USB touch _ driver);//注册通用串行总线触摸屏驱动
模块_初始化(USB触摸_初始化);
看usbtouch_driver的定义
静态结构usb_driver usbtouch_driver={。name=usbtouchscreen 。probe=usbtouch_probe,//usb触摸屏探测到。disconnect=usbtouch_disconnect。suspend=usbtouch_suspend。resume=usbtouch_resume。复位_恢复=USB触摸_复位_恢复。id_table=usbtouch_devices。supports_autosuspend=1,
};
当有设备匹配的时候会调用调查方法,也就是usbtouch_probe
在静态构造结构USB _ device _ id USB touch _ devices[]中定义了的通用串行总线设备插入就会匹配并触发调查
可以用宏USB _设备简化设置通用串行总线设备编号信息,如下:
{USB设备(0x3823,0x0001),driver_info=DEVTYPE_EGALAX},
驱动程序信息是驱动类型,有一下选择
枚举{
DEVTYPE_IGNORE=-1,
DEVTYPE_EGALAX,
DEVTYPE_PANJIT,
DEVTYPE_3M,
信息传递模数(Information Transfer Module)德夫特,
DEVTYPE_ETURBO,
DEVTYPE_GUNZE,
DEVTYPE_DMC_TSC10,
DEVTYPE_IRTOUCH,
DEVTYPE_IDEALTEK,
DEVTYPE_GENERAL_TOUCH,
DEVTYPE_GOTOP,
DEVTYPE_JASTEC,
E2I德夫特,
DEVTYPE_ZYTRONIC,
DEVTYPE_TC45USB,
DEVTYPE_NEXIO,
};
没有选择也可以自己添加一个在枚举体后面
(0x3823,0x0001)这两个分别是通用串行总线设备的厂商编号和产品编号
下面代码是我插拔通用串行总线触摸屏的打印信息
usb 1-1.1:使用musb-hdrc和地址9的新型全速通用串行总线设备
usb 1-1.1:发现新的通用串行总线设备,idVendor=0408,idProduct=3001
usb 1-1.1:新的通用串行总线设备字符串:制造商=1,产品=2,序列号=0
usb 1-1.1:产品:HCTouch
usb 1-1.1:制造商:HC
输入:HC HC touch as/devices/platform/omap/ti 81 xx-usbss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.0/输入/输入6
输入:HC HC touch as/devices/platform/omap/ti 81 xx-USB ss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.1/输入/输入7
作为我的设备,我就把idVendor=0408,idProduct=3001添加进USB _设备宏就行
{USB设备(0x0408,0x3001),driver_info=DEVTYPE_HCTOUCH},
好吧!插上设备就会匹配的
输入:HC HC touch as/devices/platform/omap/ti 81 xx-usbss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.0/输入/输入6
输入:HC HC touch as/devices/platform/omap/ti 81 xx-USB ss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.1/输入/输入7
这个就是匹配后的打印信息
接着就是调查方法了
静态int USB touch _ probe(struct USB _ interface * intf,const struct usb_device_id *id)
结构usbtouch _ usb * usbtouch
结构输入开发*输入开发;
结构USB _ endpoint _ descriptor * endpoint;
struct USB _ device * udev=interface _ to _ usbdev(intf);
结构USB touch _ device _ info * type
int err=-eno mem;
/*某些设备被忽略*/
if(id-driver _ info==DEVTYPE _ IGNORE)//忽略的设备类型
return-ENODEV;
endpoint=USB touch _ get _ input _ endpoint(intf-cur _ altsetting);//获取端点描述符数组指针
如果(!端点)
返回-en xio;
USB touch=kzalloc(sizeof(struct USB touch _ USB),GFP _ KERNEL);//分配usbtouch_usb结构体对象内存
输入_开发=输入_分配_设备();//分配输入设备对象内存
如果(!usbtouch !input_dev) //分配不成功退出
去外面_自由
type=USB touch _ dev _ info[id-driver _ info];//根据编号的驱动程序信息信息获取全局通用串行总线触摸_开发_信息数组项
USB touch-type=type//指定通用串行总线触摸_开发_信息
如果(!type- process_pkt) //若通用串行总线触摸_开发_信息不存在流程_pkt方法
type-process _ PKT=USB touch _ process _ PKT;//则默认设置为usbtouch_process_pkt
USB touch-data=USB _ alloc _ coherent(udev,type- rept_size,GFP_KERNEL,USB touch-data _ DMA);//分配缓冲区
如果(!usbtouch-数据)
去外面_自由
if (type- get_pkt_len) { //若通用串行总线触摸_开发_信息存在get_pkt_len方法
USB touch-buffer=kmalloc(type-rept _ size,GFP _ KERNEL);//则要根据报告大小分配usb_touch_usb对象缓冲区
如果(!通用串行总线触摸缓冲区)
转到out _ free _ buffers
usbtouch- irq=usb_alloc_urb(0,GFP _ KERNEL);//分配求块
如果(!usbtouch- irq) {
dbg(%s - usb_alloc_urb失败:usbtouch- irq ,_ _ func _ _);
转到out _ free _ buffers
USB触摸接口=intf//设置usb_touch_usb的通用串行总线接口
USB触摸输入=input _ dev//捆绑usb_touch_usb和输入设备
如果(udev-制造商)//存在工厂名则设置工厂名
strlcpy(usbtouch- name,udev- manufacturer,sizeof(USB touch-name));
if (udev- product) { //存在产品名则设置产品名
如果(udev-制造商)
strlcat(usbtouch- name, ,sizeof(USB touch-name));
strlcat(usbtouch- name,udev- product,sizeof(USB touch-name));
如果(!strlen(usbtouch- name)) //若不存在工厂名和产品名
snprintf(usbtouch- name,sizeof(usbtouch- name),
通用串行总线触摸屏x:x,
le16 _ to _ CPU(udev-descriptor。id供应商),
le16 _ to _ CPU(udev-descriptor。id产品));
usb_make_path(udev,usbtouch- phys,sizeof(USB touch-phys));//设置通用串行总线设备路径
strlcat(usbtouch- phys,/input0 ,sizeof(USB touch-phys));
input _ dev-name=USB触摸名称;//设置输入设备名
input _ dev-phys=USB touch-phys;//设置输入设备路径
通用串行总线输入id(udev,input_dev-
input_dev- dev.parent=intf- //设置通用串行总线设备为输入设备的父设备
input_set_drvdata(input_dev,USB touch);
input _ dev-open=USB touch _ open;//设置输入设备的打开方法
input _ dev-close=USB touch _ close;//设置输入设备的关闭方法
input _ dev-EV BIT[0]=BIT _ MASK(EV _ KEY) BIT _ MASK(EV _ ABS);//按键和绝对位移事件
input _ dev-key BIT[BIT _ WORD(BTN _触摸)]=位掩码(BTN)触摸);//触摸按键
input_set_abs_params(input_dev,ABS_X,type- min_xc,type- max_xc,0,0);//绝对x坐标位移
input_set_abs_params(input_dev,ABS_Y,type- min_yc,type- max_yc,0,0);//绝对y坐标位移
if (type- max_press)
input_set_abs_params(input_dev,ABS _ press,type- min_press,type- max_press,0,0);
如果(USB _端点_类型(端点)==USB _端点_XFER_INT) //中断传输方式
usb_fill_int_urb(usbtouch- irq,udev,
usb_rcvintpipe(udev,endpoint- bEndpointAddress),
usbtouch- data,type- rept_size,
usbtouch_irq,usbtouch,endpoint-bInterval);
否则//批量传输方式
usb_fill_bulk_urb(usbtouch- irq,udev,
usb_rcvbulkpipe(udev,endpoint- bEndpointAddress),
usbtouch- data,type- rept_size,
usbtouch_irq,USB touch);
USB touch-IRQ-dev=udev;//urb和通用串行总线设备捆绑
USB touch-IRQ-transfer _ DMA=USB touch-data _ DMA;//传输数据直接存储器存取地址缓冲区
USB touch-IRQ-TRANSFER _ flags =URB _ NO _ TRANSFER _ DMA _ MAP;//传输标志物直接存储器存取映射传输
/*设备特定分配*/
if(type-alloc){//USB touch _ dev _ info对象存在分配方法
err=type-alloc(USB touch);//则调用该方法
如果(错误){
dbg(%s - type- alloc()失败,错误:%d ,__func__,err);
前往out _ free _ urb
/*设备特定初始化*/
if(type-init){//USB touch _ dev _ info对象存在初始化方法
err=type-init(USB touch);//则调用该初始化方法
如果(错误){
dbg(%s - type- init()失败,错误:%d ,__func__,err);
goto out _ do _ exit
err=input _ register _ device(USB触摸输入);//注册输入设备
如果(错误){
dbg(%s -输入寄存器设备失败,错误:%d ,__func__,err);
goto out _ do _ exit
usb_set_intfdata(intf,USB touch);
if(USB touch-type-IRQ _ always){//USB touch _ dev _ info对象存在irq _始终方法
/*这不能失败*/
USB _ autopm _ get _ interface(intf);//电源唤醒
err=USB _ submit _ urb(USB touch-IRQ,GFP _ KERNEL);//提交求块
如果(错误){
USB _ autopm _ put _ interface(intf);//电源挂起
错误( %s - usb_submit_urb失败,结果为:%d ,
__func__,err);
goto out _ unregister _ input
返回0;
out _ unregister _ input:
输入注销设备(输入_开发);
输入_开发=空;
out_do_exit:
如果(键入退出)
type-exit(USB触摸);
外出_自由_城市:
USB _ free _ urb(USB touch-IRQ);
输出可用缓冲区:
usbtouch_free_buffers(udev,USB touch);
out_free:
输入自由设备(输入_开发);
kfree(USB touch);
返回犯罪
}
错中复杂的关系不用管,关键是
1 .type=USB touch _ dev _ info[id-driver _ info];//根据编号的驱动程序信息信息获取全局通用串行总线触摸_开发_信息数组项
2.if(!type- process_pkt)//若通用串行总线触摸_开发_信息不存在流程_pkt方法
type _ process _ PKT=USB touch _ process _ PKT://则默认设置为usbtouch_process_pkt包含
3.申请的乌尔巴的回调函数是usbtouch_irq
4 .if(type-init){//USB touch _ dev _ info对象存在初始化方法
err=type- init(usbtouch)://则调用该初始化方法
USB触摸_开发_信息是全局USB触摸设备信息数组
静态结构USB touch _ device _ info USB touch _ dev _ info[]=>
#ifdef配置_触摸屏_USB_EGALAX
[devtype _ egalax]=]。min_xc=0x0。最大_xc=0x07ff。min_yc=0x0。max_yc=0x07ff。rept_size=16。process _ PKT=USB touch _ process _ multi。get_pkt_len=egalax_get_pkt_len。read_data=egalax_read_data,
#endif
#ifdef配置_触摸屏_USB_PANJIT
[devtype _ panjit]=]。min_xc=0x0。最大_xc=0x0fff。min_yc=0x0。max_yc=0x0fff。rept_size=8。read_data=panjit_read_data,
#endif
#ifdef配置_触摸屏_USB_3M
[DEVTYPE_3M]=>。min_xc=0x0。max_xc=0x4000。min_yc=0x0。max_yc=0x4000。rept_size=11。read_data=mtouch_read_data。init=mtouch_init,
#endif
#ifdef配置_触摸屏_USB_ITM
[DEVTYPE_ITM]=>。min_xc=0x0。最大_xc=0x0fff。min_yc=0x0。max_yc=0x0fff。max_press=0xff。rept_size=8。读取数据=itm读取数据,
#endif
#ifdef配置_触摸屏_ usb _ eturbo
[devtype _ stud rbo]=>。min_xc=0x0。最大_xc=0x07ff。min_yc=0x0。max_yc=0x07ff。rept_size=8。process _ PKT=USB touch _ process _ multi。get _ PKT _ len=studo _ get _ PKT _ len。读取数据=研究读取数据,
#endif
#ifdef配置_触摸屏_USB_GUNZE
[DEVTYPE_GUNZE]=>。min_xc=0x0。最大_xc=0x0fff。min_yc=0x0。max_yc=0x0fff。rept_size=4。read_data=gunze_read_data,
#endif
#ifdef配置_触摸屏_USB_DMC_TSC10
[devtype _ DMC _ TSC 10]=]。min_xc=0x0。最大_xc=0x03ff。min_yc=0x0。max_yc=0x03ff。rept_size=5。init=dmc_tsc10_init。read_data=dmc_tsc10_read_data
#endif
#ifdef配置_触摸屏_USB_IRTOUCH
[devtype _ irtouch]=]。min_xc=0x0。最大_xc=0x0fff。min_yc=0x0。max_yc=0x0fff。rept_size=8。read_data=irtouch_read_data,
#endif
#ifdef配置_触摸屏_USB_IDEALTEK
[DEVTYPE_IDEALTEK]=>。min_xc=0x0。最大_xc=0x0fff。min_yc=0x0。max_yc=0x0fff。rept_size=8。process _ PKT=USB touch _ process _ multi。get _ PKT _ len=理想tek _ get _ PKT _ len。read_data=idealtek_read_data,
#endif
#ifdef配置_触摸屏_ USB _通用_触控
[devtype _ general _ touch]=]。min_xc=0x0。最大_xc=0x7fff。min_yc=0x0。最大_yc=0x7fff。rept_size=7。read_data=一般_touch_read_data
#endif
#ifdef配置_触摸屏_ usb _ gotop
[devtype _ goto语句]=>。min_xc=0x0。最大_xc=0x03ff。min_yc=0x0。max_yc=0x03ff。rept_size=4。read _ data=gotop _ read _ data,
#endif
#ifdef配置_触摸屏_USB_JASTEC
[devtype _ jastec]=]。min_xc=0x0。最大_xc=0x0fff。min_yc=0x0。max_yc=0x0fff。rept_size=4。read_data=jastec_read_data,
#endif
#ifdef配置_触摸屏_USB_E2I
[devtype _ e2i]=]。min_xc=0x0。最大_xc=0x7fff。min_yc=0x0。最大_yc=0x7fff。rept_size=6。init=e2i_init。读取数据=e2i读取数据,
#endif
#ifdef配置_触摸屏_ usb _ zytronic
[devtype _ zyntronic]=]。min_xc=0x0。最大_xc=0x03ff。min_yc=0x0。max_yc=0x03ff。rept_size=5。read_data=zytronic_read_data。irq_always=true,
#endif
#ifdef配置_触摸屏_USB_ETT_TC45USB
[DEVTYPE_TC45USB]=>。min_xc=0x0。最大_xc=0x0fff。min_yc=0x0。max_yc=0x0fff。rept_size=5。read_data=tc45usb_read_data,
#endif
#ifdef配置_触摸屏_USB_NEXIO
S7-1200可编程控制器。rept_size=1024。irq_always=true。read _ data=nexio _ read _ data。alloc=alloc _ link。init=init _ nexo。exit=nexio_exit,
#endif
由于我我说了了一个,所以后面要添加
[devtype _ hctouch]=]。min_xc=0x0,//最小x个坐标。最大_xc=0x7fff,//最大x个坐标。min_yc=0x0,//最小然后呢坐标。max_yc=0x7fff,//最大然后呢坐标。rept_size=7,//还不知道是干嘛用的。read _ data=HC _ touch _ read _ data//关键的读数据方法
},
当触摸屏幕的时候,usb会通过求块传递数据,紧接着肯定会调用usbtouch_irq啦
静态void usbtouch_irq(struct urb *urb)
struct USB touch _ USB * USB touch=ur b-context;
返回值
开关(城市状态){
案例0: //正常流程跳出转换语句
/*成功*/
打破;
案例时间:
/*此求块超时*/
dbg(%s - urb超时-设备是否被拔掉?
_ _ func _ _);
返回;
案例经济研究:
案例注释:
案例-关闭:
案例附录:
/*此求块已终止,清理*/
dbg(%s - urb正在关闭,状态为:%d ,
__func__,ur b-status);
返回;
默认值:
dbg(%s -收到的非零求块状态:%d ,
__func__,ur b-status);
转到退出;
//执行通用串行总线触摸设备信息对象的流程_pkt方法
USB touch-type-process _ PKT(USB touch,usbtouch- data,urb-actual _ length);
退出:
USB _ mark _ last _ busy(interface _ to _ USB dev(USB touch-interface));
retval=usb_submit_urb(urb,GFP _ ATOMIC);
如果(返回)
错误( %s - usb_submit_urb失败,结果为:%d ,
__func__,retval);
}
这里的关键是会调用流程_pkt方法也就是默认的usbtouch_process_pkt函数
静态void USB touch _ process _ PKT(struct USB touch _ USB * USB touch,无符号char *pkt,int len) //默认的通用串行总线触摸数据包处理函数
struct USB touch _ device _ info * type=USB touch-type;//获取通用串行总线触摸设备信息对象
如果(!type- read_data(usbtouch,pkt)) //调用通用串行总线触摸设备信息对象的读取数据方法
返回;
input _ report _ key(USB TOUCH-input,BTN_TOUCH,USB TOUCH-TOUCH);//上报触摸事件
if (swap_xy) { //竖屏模式
输入_报告_abs(usbtouch-输入,ABS_X,usbtouch-
输入_报告_abs(usbtouch-输入,ABS_Y,usbtouch-
}否则{
input _ report _ ABS(USB触摸输入,ABS_X,usbtouch- //上报绝对坐标X事件
input _ report _ ABS(USB触摸输入,ABS_Y,usbtouch- //上报绝对坐标Y事件
if (type- max_press)
input _ report _ ABS(USB触摸输入,ABS _ PRESSURE,USB触摸按压);
input _ sync(USB触摸输入);//同步输入事件
}
这个函数主要是调用了通用串行总线触摸设备信息对象的读取数据方法也就是上面提到的数组的读取数据方法(hc_touch_read_data)
数据读取完毕后上报触摸事件,绝对正常男性染色体组型坐标事件,然后同步交由输入子系统去处理坐标等具体事项
hc_touch_read_data函数读取通用串行总线接口传递过来的数据,该数据就包含了坐标和触摸信息,函数主要是对这些信息做下运算处理
static int HC _ touch _ read _ data(struct USB touch _ USB * dev,unsigned char *pkt)
dev-x=(PKT[2]8) PKT[1];
dev-y=(PKT[4]8) PKT[3];
dev-press=PKT[5]0x ff;
dev-touch=PKT[0]0x 01;
返回1;
}
这些处理的细节跟具体硬件厂商或者协议有关,调试可以将开发x和开发表示“有…的”打印出来
可能你加了打印之后触摸屏幕压根就没有打印信息
那是因为要打开设备,所以应用层也要有测试软件,有界面的测试软件最好
没有也可以用下面这段代码去简单测试一下(来着网络)
#包含标准视频
#包含linux/input.h
静态int event 0 _ FD=-1;
结构输入_事件ev0[64];
静态int handle_event0()
int button=0,realx=0,realy=0,I,rd;
rd=read(event0_fd,ev0,sizeof(struct input _ event)* 64);
if(rd sizeof(结构输入事件))返回0;
for(I=0;i rd/sizeof(结构输入_事件);我)
if(EV_ABS==ev0[i].类型)
if(ev0[i]).code==0) {
realx=ev0[i].价值;
} else if(ev0[i].code==1) {
realy=ev0[i].价值;
printf( realx:=;realy:=n ,realx,realy);
//printf(event(%d):类型:% d;代码:=;值:=;realx:=;realy:=n ,I,ev0[i].类型,ev0[i].代码,ev0[i].value,realx,realy);
返回1;
}
这段代码打开的设备修改成你的设备路径,插拔触摸屏判断哪个是你触摸屏的设备
或者ls -l /sys/class/input看信息结合插入设备的打印信息也可以判断你的设备是哪个
lrwxrwxrwx 1根根0月23日17:20事件0-http://www。。com/devices/platform/omap/ti 81 xx-usbss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.0/输入/输入6/事件0
lrwxrwxrwx 1 root root 0 Mar 23 17:20 event 1-http://www .cn博客。com/devices/platform/omap/ti 81 xx-usbss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.1/输入/输入7/事件1
lrwxrwxrwx 1 root root 0 Mar 23 17:20 event 2-http://www .cn博客。com/devices/platform/omap/ti 81 xx-usbss/mus b-hdrc。0/USB 1/1-1/1-1.3/1-1.3:1.0/输入/输入8/事件2
再或者卡特彼勒/处理器/总线/输入/设备也可以
我:总线=0003供应商=0408产品=3001版本=0200
N: Name=HC HCTouch
p:Phys=USB-mus b-hdrc。0-1.1/输入0
s:sys fs=/devices/platform/omap/ti 81 xx-USB ss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.0/输入/输入6
U: Uniq=
h:处理程序=鼠标0事件0
乙:EV=乙
b:KEY=400 00 00 00 00 00 00 00 00
乙:ABS=3
我:总线=0003供应商=0408产品=3001版本=0200
N: Name=HC HCTouch
p:Phys=USB-mus b-hdrc。0-1.1/输入0
s:sys fs=/devices/platform/omap/ti 81 xx-USB ss/mus b-hdrc。0/USB 1/1-1/1-1.1/1-1.1:1.1/输入/输入7
U: Uniq=
h:处理程序=鼠标1事件一
乙:EV=乙
b:KEY=400 00 00 00 00 00 00 00 00
乙:ABS=3
这里我的设备有两个投入是因为我是2点的屏
还有一点要补充就是关于内核编译选项的
设备驱动程序-输入设备支持-
[*]触摸屏-
* USB触摸屏驱动程序这个要选择
[*] HID设备- * USB人机接口设备(完全HID)支持选中