Linux下基于python的USB通信程序开发

时间:2022-10-22 12:07:49

Linux下基于python的USB通信程序开发

摘要:Linux操作系统通过libusb库完成各种和USB设备的通信,但其开发过程过于繁杂,以python语法简洁的特性调用libusb,可以极大减少对USB设备通信开发难度且无须编写特殊驱动。以CY7C68013芯片为例,在Linux下通过python调用libusb对Cypress Fx2LP系列芯片通信方法,并介绍了上传数据到芯片内RAM具体应用的方法。

关键词:Linux;USB设备通信;libusb;python;CY7C68013芯片

中图分类号:TP311.52 文献标识码:A文章编号:1007-9599 (2010) 11-0000-01

The Development of USB Communication Program Base on Python under Linux

Meng Zhuo

(College of Mechanical Engineering,Shanghai University of Engineering Science,Shanghai201620,China)

Abstract:Linux operating system through the libusb library to complete a variety of USB communications,but the development process is too complicated,to call python syntax features simple libusb,USB devices can greatly reduce the difficulty of communication and the development of special drive without having to write.The CY7C68013 chip,for example,through the python call in the Linux libusb on Cypress Fx2LP series chip communication methods,and introduced the upload data to the RAM chip application-specific methods

Keywords:Linux;USB Communication;libusb;python;CY7C68013 chip

Python语言是一种面向对象、内置高级数据结构、语法简洁严谨、可读性高、易于扩展的解释型脚本语言。

libusb是Linux操作系统的硬件支持库,主要负责操作系统与USB设备进行通信,使得开发者简化系统底层的依赖和减少重复编程,开发的强度下降、大大缩短开发周期。

Fx2LP系列芯片是Cypress公司推出的USB2.0集成微处理芯片,USB收发器、增强型8051单片机及一个16KB片上RAM、一个4KB FIFO存储器和一个通用可编程接口(GPIF)外部接口封装于单一芯片中且使用USB接口进行数据交换,固件的开发简化。

Python中的usb模块用C语言格式封装了libusb函数接口,鉴于Python开发上的高效性和Fx2LP系列芯片固件简单的特性,利用Python开发基于libusb的Fx2LP系列芯片的通信程序,可以缩短开发周期。

一、实现原理和背景

(一)Linux下的USB系统体系结构简介

USB是一种分层总线结构,USB设备和主机之间的信号传输通过USB控制器实现。

Linux操作系统是通过libusb来完成各种与USB设备之间的信号传输,libusb向用户提供应用程序接口(API)控制各种USB信号传输,包括四种数据传输类型:控制传输,等时传输,中断传输,数据块传输四大类接口;两种传输模式:同步传输模式,异步传输模式。其中控制传输采用特定的方式使用控制数据来对设备进行设置,数据传输是无损性的。

(二)Fx2LP系列USB接口简介

通过Cypress公司提供特定的USB控制指令,Fx2LP内核能够直接编辑内16KB RAM和内部512字节便笺式RAM的数据内容,使用此类指令进行程序的数据上传与下载。

(三)基于Python的USB通信

使用Linux-python组件中的usb模块,该模块以ctype格式调用libusb库中的动态接口链接函数,并提供了python化的接口。通过import指令调用此模块完成与libusb接口的通信从而到达与USB设备通信的目的。usb模块文件位于

/usr/lib/pymodules/python2.6/usb.so。

二、程序实现

(一)搜索芯片并加载

加载usb模块后,python已可访问所有USB设备,所以需要程序通信目标设备加载至python的函数对象中。具体程序如下:

#初始化函数及模块 import usb

#加载CY7C68013 VID、PID

vendor_id=0x04b4 product_id=0x8613

#搜索并加载 busses = usb.busses()

dev = "" #强制指定dev的类型为字符

for bus in busses: #历遍所有USB组

devices = bus.devices

for d in devices: #历遍所有此组上的设备

if d.idVendor==vendor_id and d.idProduct==product_id:dev = d

#若VID、PID均符合将此设备交dev供以后调用

Break

handle = dev.open() #打开设备

(二)控制传输模式

usb模块中的DeviceHandle类中包含controlMsg这一函数,为偏移量、数据长度赋值或者填充缓冲数据后直接调用即可。

1.导出RAM函数

因返回的data值类型为元组,如需将数据传输至Linux终端(tty),则需要调用print函数。

def dump_ram(offset,lenth):

data=handle.controlMsg(requestType=0xc0,request=0xa0,value=offset,index=0x00,buffer=lenth,timeout=100)print data

2.写入RAM函数

填充缓冲的程序原始数据后,调用函数就可直接向此偏移量下的RAM上传数据。具体函数如下:

def write_ram(offset,buf):

handle.controlMsg(requestType=0x40,request=0xa0,value=offset,index=0x00,buffer=buf,timeout=100)

3.批量传输模式

usb模块中的DeviceHandle类已经提供了bulkRead、bulkWrite函数,使用时调用即可,由于设备重枚举后,大部分PID或VID发生了变化,需要通过程序重新寻找并设定的新设备的PID和VID,然后使用 configurations类获得此设备的配置信息和端点信息,进行进一步的设定。导出和写入批量传输程序如下:

def bulk(dendp,lenthl,wendp,buf): #*endp为端点号实数 #初始化USB配置

handle.detachKernelDriver(0) #获得Linux底层的设备控制权

if dendp !=””: #为导出模式时

data=handle.bulkRead(dendp,lenthl,100)

if wendp !=””: #为写入模式时

handle.bulkWrite(wendp,buf,1000)

四、结束会话

对设备的各种操作完成后,应释放资源和结束会话,具体程序如下:

handle.releaseInterface() #释放接口

dev.close() #关闭设备

python对动态链接库的调用简洁高效,usb模块省去了重复开发USB驱动的时间,而且python的跨平台特性使得程序能适应各种平台环境。

参考文献:

[1]杨伟,刘强,顾新.Linux下USB设备驱动研究与开发[J].计算机工程,2006,32

[2]钱峰.EZ-USB FX2单片机原理、编程及应用[M].北京:北京航天航空大学出版社,2006

作者简介:蒙卓(1988.12-),广西桂平人,汉族,在读学士,上海工程技术大学机械工程学院机械自动化专业

上一篇:浅谈图书馆随书光盘的管理和利用 下一篇:高校《电脑组装与维修》适应性教学改革实践