imx6ull开发板环境配置 - libusb、libudev、eudev交叉编译

这篇具有很好参考价值的文章主要介绍了imx6ull开发板环境配置 - libusb、libudev、eudev交叉编译。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

零、前言

一、libusb交叉编译

1.0 前言

1.1 交叉编译

二、usbutils交叉编译

2.0 前言

2.1 交叉编译

三、libudev交叉编译

3.0 前言

3.1 交叉编译

3.2 错误处理-没找到usbutils

3.3 错误处理-没找到pci.ids (pci.ids not found)

3.3.0 前言

3.3.1 查找pci.ids

3.3.2 继续编译

3.4 错误处理-没找到gperf (gperf not found)

 3.5 编译并安装

四、eudev交叉编译

4.0 前言

4.1 交叉编译

五、测试代码

5.1 usb测试代码

5.2 编译脚本Makefile

5.3 运行结果


零、前言

背景:由于正点原子imx6ull需要使用到usblib进行一些usb相关的编程,而正点没有提供对应的usblib相关的库交叉编译方法。下面简单介绍如何交叉编译usb开发所需要的库。
依赖关系:libusb<-usbutils<-libudev   交叉编译建议按照下面的顺序进行,防止出现冲突
现象:使用测试代码进行编译,出现如下错误,原因是缺少对应的 libusb、libudev库
alientek@ubuntu16:~/linuxProject/v4l2_test/usb_callback_test$ make
arm-linux-gnueabihf-gcc  -o usb_callback_test usb_callback_test.c -lpthread -lusb-1.0 -I/home/alientek/tools/libusb-1.0.26/build/include -L/home/alientek/tools/libusb-1.0.26/build/lib
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4/../../../../arm-linux-gnueabihf/bin/ld: warning: libudev.so.1, needed by /home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so, not found (try using -rpath or -rpath-link)
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_monitor_filter_add_match_subsystem_devtype@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_monitor_enable_receiving@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_enumerate_scan_devices@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_new@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_device_get_devnode@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_enumerate_new@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_list_entry_get_name@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_enumerate_add_match_subsystem@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_device_get_sysname@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_enumerate_get_list_entry@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_enumerate_add_match_property@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_device_new_from_syspath@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_monitor_new_from_netlink@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_monitor_receive_device@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_device_unref@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_enumerate_unref@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_monitor_get_fd@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_list_entry_get_next@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_monitor_unref@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_unref@LIBUDEV_183’未定义的引用
/home/alientek/tools/libusb-1.0.26/build/lib/libusb-1.0.so:对‘udev_device_get_action@LIBUDEV_183’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:9: recipe for target 'usb_callback_test' failed
make: *** [usb_callback_test] Error 1

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

一、libusb交叉编译

1.0 前言

参考:韦东山驱动大全-12USB-07_使用libusb读取鼠标参数
库版本:libusb-1.0.26(https://sourceforge.net/projects/libusb/)

1.1 交叉编译

sudo apt-get install libtool

unzip libusb-1.0.26.zip
cd libusb-1.0.26
mkdir build
./autogen.sh

./configure CC={编译器目录} --host=arm-linux-gnueabihf --prefix=$PWD/build

make

make install        #安装在build目录下

编译时需要指定头文件路径/home/alientek/tools/libusb-1.0.26/build/include

库文件路径/home/alientek/tools/libusb-1.0.26/build/lib

二、usbutils交叉编译

2.0 前言

参考: libusb 和 usbutils 的交叉编译 (ngui.cc)
库版本:usbutils-005 ( Index of /pub/linux/utils/usb/usbutils/ (kernel.org))

2.1 交叉编译

#unzip
cd usbutils-005
mkdir build
./configure CC={编译器目录} --host=arm-linux-gnueabihf --prefix=$PWD/build
make
make install

三、libudev交叉编译

3.0 前言

参考: 交叉编译libudev_libudev交叉编译_xqhrs232的博客-CSDN博客
库版本: udev-182

3.1 交叉编译

#unzip
cd udev-182
mkdir build
./configure CC={编译器目录} --host=arm-linux-gnueabihf --prefix=$PWD/build
make
make install

环境没有问题的话,能够一次编译成功,如下所示。但实际上会缺少部分文件,详情根据3.2以后章节查看。

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

3.2 错误处理-没找到usbutils

如果configure配置失败,出现没找到usbutils错误,需要检查是否usbutils安装出现问题

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

 通过查看上面打印信息可以看到使用的pkg-config路径为/opt/fsl-imx-x11/4.1.15-2.1.0/目录下。通过下面指令找到实际存放的pkgconfig路径

cd /opt/fsl-imx-x11/4.1.15-2.1.0/            #根据提示信息自行修改
find ./ -name "pkgconfig"                                         #得到路径/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/pkgconfig

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

将usbutils-005目录下交叉编译生成的文件放到上述pkgconfig目录下

cp {usbutils-005}/build/share/pkgconfig/usbutils.pc  /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/pkgconfig

完成上述操作后,再次配置udev-182

./configure  --host=arm-linux-gnueabihf --prefix=$PWD/build            #配置udev交叉编译

提示如下错误:

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

3.3 错误处理-没找到pci.ids (pci.ids not found)

3.3.0 前言

参考: 交叉编译 udev 库_pci.ids not found_huihuiwith的博客-CSDN博客

3.3.1 查找pci.ids

    使用参考连接中的whereis pci.ids无法找到有效地址。这里使用find指令查找:sudo find / -name "pci.ids"

    找到两个路径。疑问:我们需要是的交叉编译,可以直接只是x86的ids吗?

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

3.3.2 继续编译

    指定pci路径地址,再次配置

./configure  --host=arm-linux-gnueabihf --prefix=$PWD/build --with-pci-ids-path=/usr/share/misc/pci.ids

提示gperf not found

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

3.4 错误处理-没找到gperf (gperf not found)

参考: configure: error: gperf is needed_tool gperf is required._柳鲲鹏的博客-CSDN博客

通过apt安装gperf: 

sudo apt install gperf

再次配置即可成功

libudev交叉编译,嵌入式学习,arm开发,linux,c语言

 3.5 编译并安装

make 
make install

注:本人在进行make过程中,出现了/bin/grep: /usr/lib/libglib-2.0.la: No such file or director等问题。根据其他人的博文内容,udev已经很久没有更新,而且也有eudev作为更好的替代品。因此后面修改使用eudev进行交叉编译。

四、eudev交叉编译

4.0 前言

参考: 海思Hi3536交叉编译eudev和libusb库_eudev 3.2.9编译_mkelehk的博客-CSDN博客

eudev版本:3.2.11  ( Archived eudev tarballs (gentoo.org))

4.1 交叉编译

sudo apt install gperf
#解压
cd eudev-3.2.11
mkdir build
./configure  --host=arm-linux-gnueabihf --prefix=$PWD/build --disable-blkid --disable-kmod
make
make install

将交叉编译的头文件、动态库文件放到交叉工具链中

cd {eudev目录}/build
cp bin/udevadm ~/linux/nfs/rootfs-alientek/bin/

sudo cp lib/* /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/lib/

sudo cp include/* /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/

五、测试代码

5.1 usb测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libudev.h>
#include <sys/select.h>

// 打印设备信息
void print_device_info(struct udev_device *dev) {
    // 获取设备信息
    const char *devpath   = udev_device_get_devpath(dev);
    const char *subsystem = udev_device_get_subsystem(dev);
    const char *devtype   = udev_device_get_devtype(dev);
    const char *syspath   = udev_device_get_syspath(dev);
    const char *sysname   = udev_device_get_sysname(dev);
    const char *sysnum    = udev_device_get_sysnum(dev);
    const char *devnode   = udev_device_get_devnode(dev);
   

    // 打印设备信息
    printf("Device info:\n");
    printf("  devpath   : %s\n", devpath  );
    printf("  subsystem : %s\n", subsystem);
    printf("  devtype   : %s\n", devtype  );
    printf("  syspath   : %s\n", syspath  );
    printf("  sysname   : %s\n", sysname  );
    printf("  sysnum    : %s\n", sysnum   );
    printf("  devnode   : %s\n", devnode  );
    printf("\n");
}

// 遍历USB设备
void enumerate_usb_devices(struct udev *udev) {
    // 创建枚举器
    struct udev_enumerate *enumerate = udev_enumerate_new(udev);
    // 设置匹配条件
    udev_enumerate_add_match_subsystem(enumerate, "usb");
    // 扫描设备
    udev_enumerate_scan_devices(enumerate);

    // 获取设备列表
    struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
    struct udev_list_entry *dev_list_entry;

    // 遍历设备列表
    udev_list_entry_foreach(dev_list_entry, devices) {
        // 获取设备路径
        const char *path = udev_list_entry_get_name(dev_list_entry);
        // 创建设备对象
        struct udev_device *dev = udev_device_new_from_syspath(udev, path);

        if (dev) {
            // 打印设备信息
            print_device_info(dev);
            // 释放设备对象
            udev_device_unref(dev);
        }
    }

    // 释放枚举器
    udev_enumerate_unref(enumerate);
}


int main() {
    // 创建一个udev对象
    struct udev *udev = udev_new();

    if (!udev) {
        // 创建失败
        fprintf(stderr, "Failed to create udev context\n");
        return 1;
    }

    // 枚举所有USB设备并打印它们的信息
    enumerate_usb_devices(udev);

    // 创建udev monitor对象,并设置要监听的设备类型为usb
    struct udev_monitor *monitor = udev_monitor_new_from_netlink(udev, "udev");
    udev_monitor_filter_add_match_subsystem_devtype(monitor, "usb", NULL);

    // 启用udev monitor接收事件
    udev_monitor_enable_receiving(monitor);

    // 获取monitor的文件描述符
    int fd = udev_monitor_get_fd(monitor);
    fd_set fds;

    // 进入循环,等待事件发生
    while (1) {
        // 清空文件描述符集合并将monitor的文件描述符添加到集合中
        FD_ZERO(&fds);
        FD_SET(fd, &fds);

        // 调用select函数等待文件描述符就绪
        int ret = select(fd + 1, &fds, NULL, NULL, NULL);

        if (ret > 0 && FD_ISSET(fd, &fds)) {
            // 从monitor中接收一个事件对象
            struct udev_device *dev = udev_monitor_receive_device(monitor);

            if (dev) {
                // 获取事件动作(add或remove)
                const char *action = udev_device_get_action(dev);

                if (strcmp(action, "add") == 0) {
                    // 如果是add事件,打印提示信息并枚举所有USB设备
                    printf("USB device added\n");
                    // enumerate_usb_devices(udev);
                }
                else if (strcmp(action, "remove") == 0) {
                    // 如果是remove事件,打印提示信息即可
                    printf("USB device removed\n");
                }

                // 释放事件对象
                udev_device_unref(dev);
            }
        }
    }

    // 关闭monitor和udev对象
    udev_monitor_unref(monitor);
    udev_unref(udev);
    return 0;
}

5.2 编译脚本Makefile

CROSS=arm-linux-gnueabihf-
CC = $(CROSS)gcc
CFLAGS = -Wall -Wextra -pedantic -std=c99 \
			-lpthread -lusb-1.0 -ludev \
			-I/home/alientek/tools/libusb-1.0.26/build/include	\
			-I/home/alientek/tools/eudev-3.2.11/build/include

LDFLAGS = -L/home/alientek/tools/libusb-1.0.26/build/lib \
			-L/home/alientek/tools/eudev-3.2.11/build/lib


TARGET = usb_callback_test
OBJS = $(TARGET).o

$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
	cp -f ${TARGET} ~/linux/nfs/rootfs-alientek/

%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -f $(OBJS) $(TARGET)

5.3 运行结果

libudev交叉编译,嵌入式学习,arm开发,linux,c语言文章来源地址https://www.toymoban.com/news/detail-686374.html

到了这里,关于imx6ull开发板环境配置 - libusb、libudev、eudev交叉编译的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

    经过以下四个步骤,终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 一、获取内核、编译内核 二、创建vscode工作区,添加内核目录和个人目录 三、了解驱动程序编写

    2024年02月06日
    浏览(37)
  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(62)
  • 【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

    发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的 sleep 被驱动层的 kill_fasync 打断,所以sleep没有执行完就重新进入下一次循环了 修改代码后解决该问题 解决逻辑就

    2024年02月13日
    浏览(36)
  • 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)

    为什么要设置IMX6ULL与虚拟机通信? 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段,可以互ping后,可以参考这篇博客,实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 一、设置windows有线网卡 二、配置虚拟机双网卡(原本有一个NAT网卡

    2024年02月07日
    浏览(37)
  • IMX6ULL网络环境搭建---电脑WIFI上网、开发板和电脑通过USB转网口连接

    使用场景:一般电脑都是有一个以太网网口的,但是一些超薄本、商务本电脑没有以太网网口,这样并不方便我们的开发。我们可以使用 USB 转网口设备来给电脑拓展出一个以太网网口,因为开发板必选通过有线的方式连接到电脑上。USB 转网口设备如下图所示。 设备:电脑(

    2024年02月02日
    浏览(33)
  • [imx6ull]开发板多种连网方式精讲

    在使用IGKBoard开发板时,因为没有网络,所以交叉编译遇到了困难,于是我研究了两种IGKBoard的连网方式,因为我们的IGKBoard有两个以太网接口,并且有一个板载RealTek WiFi模块,分别可以通过网线让IGKBoard开发板连上网,也可以通过WiFi让开发板连接上网,下面就让我来对这两种

    2024年02月16日
    浏览(31)
  • 【IMX6ULL驱动开发学习】19.mmap内存映射

    mmap将一个文件或者其它对象映射进内存 ,使得应用层可以直接读取到驱动层的数据,无需通过copy_to_user函数 可以用于像LCD这样的外设, 需要读写大量数据的 一、应用层 mmap用法: 用open系统调用打开文件, 并返回描述符fd. 用mmap建立内存映射, 并返回映射首地址指针start. 对映

    2024年02月16日
    浏览(37)
  • IMX6ULL裸机篇之DDR3参数配置分析

    上一篇博文进行了 DDR参数的初始化,通过一个 execl表进行配置,生成脚本文件。文章网址如下: IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 本文对 DDR的参数配置进行详细的说明。即对 \\\"Register Configuration\\\"页面参数的配置 进行说明。 开发板上的DDR3L 内存芯片型号是 NT5CC

    2024年02月05日
    浏览(29)
  • 【IMX6ULL驱动开发学习】12.Linux驱动之设备树

    承接上一篇博客 【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分) 代码获取: https://gitee.com/chenshao777/imx6-ull_-drivers 我后面将三个层合并了(实际上只有前两层),合并成一个dev_drv.c了,暂时没有加GPIO操作,只是个框架 合并前的代码在 11.butt

    2024年02月13日
    浏览(34)
  • 【IMX6ULL驱动开发学习】11.Linux之SPI驱动

    参考:驱动程序开发:SPI设备驱动_spi驱动_邓家文007的博客-CSDN博客 目录 一、SPI驱动简介 1.1 SPI架构概述 1.2 SPI适配器(控制器)数据结构 1.2 SPI设备数据结构 1.3 SIP设备驱动 1.4 接口函数  二、SPI驱动模板 SPI驱动框架和I2C驱动框架是十分相似的,不同的是因为SPI是通过片选引

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包