imx6ul使用记录之----lsusb命令在arm上的移植

本文详细介绍了在 Linux 下编译 USB 设备驱动并使用相关工具的全过程,包括下载源码、解压、设置环境变量、编译、解决编译错误以及将编译好的工具复制到开发板等步骤。同时,文中分享了解决高版本编译问题的方法,以及配置 CC 编译器以适应 ARM 架构的具体操作。

链接接编译过程转载如下 http://blog.csdn.net/mcy_cool/article/details/10178841

下面的过程仅供参考,会有一些问题,具体看后续的说明。

1、下载源码:

     #wget http://dist.momonga-linux.org/pub/momonga/2/SOURCES/libusb-0.1.10.tar.gz

     #wget http://down1.chinaunix.net/distfiles/usbutils-0.80.tar.gz

      其中libusb分为1.0版和0.1版两种版本,1.0并不向下兼容0.1,需要libusb-compat的支持;因此,你可以同时装上1.0和0.1,但不可同时装0.1版和libusb-compat。详见:http://www.libusb.org/

     usbutils 是Linux下查看usb设备信息的工具

2、解压:  

  1)tar -xvf usbutils-0.80.tar.gz   

  2)tar -xvf libusb-0.1.10.tar.gz

3、设环境变量(可省略): 

  export PATH=/usr/local/arm /4.5.1/arm-linux/bin/:$PATH

4、编译:   

  #cd  libusb-0.1.10

  #./configure CC=arm-linux-gcc--prefix="$PWD/../_install" --host=arm-linux

       #make install

       #cd ..

       #cd usbutils-0.80

       #./configure CC=arm-linux-gcc --host=arm-linux

LIBUSB_CFLAGS="$PWD/../_install/include/"LIBUSB_LIBS="$PWD/../_install/lib/libusb.so"

CPPFLAGS=-I"$PWD/../_install/include/"

CFLAGS="-O2"

      #make

5、修改错误

      如在编译libusb时出现错误usbpp.cpperror:'printf' was not declared in this scope,就在usbpp.cpp文件开头部分中添加头文件#include <stdio.h>

6、复制到开发板

     经过上面编译成功后,命令lsusb就出来了,就是位于usbutils-0.80目录下的lsusb可执行文件,将其复制到开发板文件系统中的bin目录中。


下面说说自己编译过程中遇到的问题

首先上面提供的libusb-0.1.10.tar.gz版本有点老了 编译的过程中会遇到没有usb.h 和 printf的问题,虽然可以修正,但是继续往下编译的时候 仍旧会有问题,于是后来 就改用更高的版本libusb-0.1.12.tar.gz,就没有这些问题了连接如下

https://sourceforge.net/projects/libusb/files/libusb-0.1%20%28LEGACY%29/0.1.12/

然后编译的时候 我的CC是 arm-poky-linux-gnueabi-gcc

#./configure CC=arm-poky-linux-gnueabi-gcc --prefix="$PWD/../_install" --host=arm-linux 

这一步会有提示错误 C compiler cannot create executables

如果不加上CC 也就是

#./configure--prefix="$PWD/../_install" --host=arm-linux 就不会有错误提示 但是编译出来的 是gcc的库和命令 移植到arm板子上还是不行 有错误提示。

进一步分析了config.log和 configure 发现执行./configure的时候 会创建一个conftest.c 的文件, 然后会将按照输入的CC宏进行编译,如果编译失败就会有这个错误提示,然后自己试着手动arm-poky-linux-gnueabi-gcc conftest.c -o conftest 发现 手动编译确实也失败了 看来还是CC的问题,

重新配置CC如下:

declare -x CC="arm-poky-linux-gnueabi-gcc  -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7 --sysroot=/opt/poky/1.8/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi"

然后手动编译  conftest.c 

$CC test.c -o test 是可以的

然后在重新配置libusb-0.1.12 步骤如下

declare -x CC="arm-poky-linux-gnueabi-gcc  -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a7 --sysroot=/opt/poky/1.8/sysroots/cortexa7hf-vfp-neon-poky-linux-gnueabi"


./configure --prefix="/home/chit/fsl-release-bsp/tool/lsusbcmd/_install" --host=arm-linux


make


make install

一切ok

下面接着编译usbutils-0.80 我将下面的路径改为全路径了,这个可以自己看着改成自己需要的。


./configure --host=arm-linux LIBUSB_CFLAGS="/home/chit/fsl-release-bsp/tool/lsusbcmd/_install/include/" LIBUSB_LIBS="/home/chit/fsl-release-bsp/tool/lsusbcmd/_install/lib/libusb.so" CPPFLAGS=-I"/home/chit/fsl-release-bsp/tool/lsusbcmd/_install/include/" CFLAGS="-O2"


make


一切ok 最后在usbutils-0.80目录下就生成了lsusb,然后拷贝lsusb和 需要的库,在目录_install/lib/libusb-0.1.so.4


在开发板上输入lsusb显示 

root@imx6ulevk:~# lsusb 
lsusb: cannot open "/usr/local/share/usb.ids", No such file or directory
Bus 001 Device 002: ID 0781:5581  

Bus 001 Device 001: ID 1d6b:0002 


在主机上 找usb.ids文件

root@ubuntu:/usr/share# find / -name usb.ids -print
/var/lib/usbutils/usb.ids
/home/chit/fsl-release-bsp/tool/lsusbcmd/usbutils-0.80/usb.ids
/home/chit/fsl-release-bsp/build-x11/tmp/work/cortexa7hf-vfp-neon-poky-linux-gnueabi/usbutils/007-r0/usbutils-007/usb.ids

将/home/chit/fsl-release-bsp/build-x11/tmp/work/cortexa7hf-vfp-neon-poky-linux-gnueabi/usbutils/007-r0/usbutils-007/usb.ids拷贝到开发板上

在lsusb

root@imx6ulevk:/usr# lsusb                                                                                                                     
Bus 001 Device 002: ID 0781:5581 SanDisk Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

到此一切ok 其中usb.ids可以到http://www.linux-usb.org/usb.ids 上面去下,这个是比较新的。

驱动开发向来是内核开发中工作量最多的一块,随着USB设备的普及,大量的USB设备的驱动开发也成为驱动开发者手头上做的最多的事情。本文主要介绍Linux平台下基于libusb的驱动开发,希望能够给从事Linux驱动开发的朋友带来些帮助,更希望能够给其他平台上的无驱设计带来些帮助。文章是我在工作中使用libusb的一些总结,难免有错误,如有不当的地方,还请指正。 [1]   Linux 平台上的usb驱动开发,主要有内核驱动的开发和基于libusb的无驱设计。   对于内核驱动的大部分设备,诸如带usb接口的hid设备,linux本身已经自带了相关的驱动,我们只要操作设备文件便可以完成对设备大部分的操作,而另外一些设备,诸如自己设计的硬件产品,这些驱动就需要我们驱动工程师开发出相关的驱动了。内核驱动有它的优点,然而内核驱动在某些情况下会遇到如下的一些问题:   1 当使用我们产品的客户有2.4内核的平台,同时也有2.6内核的平台,我们要设计的驱动是要兼容两个平台的,就连makefile 我们都要写两个。   2 当我们要把linux移植到嵌入平台上,你会发现原先linux自 带的驱动移过去还挺大的,我的内核当然是越小越好拉,这样有必要么。这还不是最郁闷的地方,如果嵌入平台是客户的,客户要购买你的产品,你突然发现客户设 备里的系统和你的环境不一样,它没有你要的驱动了,你的程序运行不了,你会先想:“没关系,我写个内核驱动加载一下不就行了“。却发现客户连insmod加载模块的工具都没移植,那时你就看看老天,说声我怎么那么倒霉啊,客户可不想你动他花了n时间移植的内核哦   3 花了些功夫写了个新产品的驱动,挺有成就感啊,代码质量也是相当的有水准啊。正当你沉醉在你的代码中时,客服不断的邮件来了,“客户需要2.6.5内核的驱动,config文件我已经发你了” “客户需要双核的 2.6.18-smp 的驱动” “客户的平台是自己定制的是2.6.12-xxx “ 你恨不得把驱动的源代码给客户,这样省得编译了。你的一部分工作时间编译内核,定制驱动   有问题产生必然会有想办法解决问题的人, libusb的出现给我们带来了某些方便,即节约了我们的时间,也降低了公司的成本。 所以在一些情况下,就可以考虑使用libusb的无驱设计了。   下面我们就来详细讨论一下libusb, 并以写一个hid设备的驱动来讲解如何运用libusb,至于文章中涉及的usb协议的知识,限于篇幅,就不详细讲解了,相关的可自行查看usb相关协议。   一 libusb 介绍   libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得libusb的使用也比开发内核驱动相对容易的多。   Libusb 的编译安装请查看Readme,这里不做详解   二 libusb 的外部接口   2.1 初始化设备接口   这些接口也可以称为核心函数,它们主要用来初始化并寻找相关设备。   usb_init   函数定义: void usb_init(void);   从函数名称可以看出这个函数是用来初始化相关数据的,这个函数大家只要记住必须调用就行了,而且是一开始就要调用的.   usb_find_busses   函数定义: int usb_find_busses(void);   寻找系统上的usb总线,任何usb设备都通过usb总线和计算机总线通信。进而和其他设备通信。此函数返回总线数。   usb_find_devices   函数定义: int usb_find_devices(void);   寻找总线上的usb设备,这个函数必要在调用usb_find_busses()后使用。以上的三个函数都是一开始就要用到的,此函数返回设备数量。   usb_get_busses   函数定义: struct usb_bus *usb_get_busses(void);   这个函数返回总线的列表,在高一些的版本中已经用不到了,这在下面的实例中会有讲解   2.2 操作设备接口   usb_open   函数定义: usb_dev_handle *usb_open(struct *usb_device dev);   打开要使用的设备,在对硬件进行操作前必须要调用usb_open 来打开设备,这里大家看到有两个结构体 usb_dev_handle 和 usb_device 是我们在开发中经常碰到的,有必要把它们的结构看一看。在libusb 中的usb.h和usbi.h中有定义。   这里我们不妨理解为返回的 usb_dev_handle 指针是指向设备的句柄,而行参里输入就是需要打开的设备。   usb_close   函数定义: int usb_close(usb_dev_handle *dev);   与usb_open相对应,关闭设备,是必须调用的, 返回0成功,<0 失败。   usb_set_configuration   函数定义: int usb_set_configuration(usb_dev_handle *dev, int configuration);   设置当前设备使用的configuration,参数configuration 是你要使用的configurtation descriptoes中的bConfigurationValue, 返回0成功,<0失败( 一个设备可能包含多个configuration,比如同时支持高速和低速的设备就有对应的两个configuration,详细可查看usb标准)   usb_set_altinterface   函数定义: int usb_set_altinterface(usb_dev_handle *dev, int alternate);   和名字的意思一样,此函数设置当前设备配置的interface descriptor,参数alternate是指interface descriptor中的bAlternateSetting。返回0成功,<0失败   usb_resetep   函数定义: int usb_resetep(usb_dev_handle *dev, unsigned int ep);   复位指定的endpoint,参数ep 是指bEndpointAddress,。这个函数不经常用,被下面介绍的usb_clear_halt函数所替代。   usb_clear_halt   函数定义: int usb_clear_halt (usb_dev_handle *dev, unsigned int ep);   复位指定的endpoint,参数ep 是指bEndpointAddress。这个函数用来替代usb_resetep   usb_reset   函数定义: int usb_reset(usb_dev_handle *dev);   这个函数现在基本不怎么用,不过这里我也讲一下,和名字所起的意思一样,这个函数reset设备,因为重启设备后还是要重新打开设备,所以用usb_close就已经可以满足要求了。   usb_claim_interface   函数定义: int usb_claim_interface(usb_dev_handle *dev, int interface);   注册与操作系统通信的接口,这个函数必须被调用,因为只有注册接口,才能做相应的操作。   Interface 指 bInterfaceNumber. (下面介绍的usb_release_interface 与之相对应,也是必须调用的函数)   usb_release_interface   函数定义: int usb_release_interface(usb_dev_handle *dev, int interface);   注销被usb_claim_interface函数调用后的接口,释放资源,和usb_claim_interface对应使用。   2.3 控制传输接口   usb_control_msg   函数定义:int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);   从默认的管道发送和接受控制数据   usb_get_string   函数定义: int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, size_t buflen);   usb_get_string_simple   函数定义: int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen);   usb_get_descriptor   函数定义: int usb_get_descriptor(usb_dev_handle *dev, unsigned char type, unsigned char index, void *buf, int size);   usb_get_descriptor_by_endpoint   函数定义: int usb_get_descriptor_by_endpoint(usb_dev_handle *dev, int ep, unsigned char type, unsigned char index, void *buf, int size);   2.4 批传输接口   usb_bulk_write   函数定义: int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);   usb_interrupt_read   函数定义: int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);   2.5 中断传输接口   usb_bulk_write   函数定义: int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);   usb_interrupt_read   函数定义: int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值