I.MX6 Linux udev porting

/***********************************************************************
 *                     I.MX6 Linux udev porting
 * 声明:
 *     在嵌入式产品上,我们可以使用mdev来解决热插拔的问题,同时也经常看到
 * udev,所以尝试来移植一下,但是最终发现她会丢失内核阶段产生的uevent,
 * 这导致无法生成内核阶段产生的设备节点,目前采用了mdev来做完成内核阶段的
 * 设备节点生成,之后使用udev完成热插拔,这个问题后续有空再解决。
 *
 *                                     2016-1-17 深圳 南山平山村 曾剑锋
 **********************************************************************/

一、参考文档:
    1.“configure: error: Package requirements (blkid) were not met”
        http://unix.stackexchange.com/questions/215406/configure-error-package-requirements-blkid-were-not-met
    2. 建立ARM交叉编译环境arm-none-linux-gnueabi-gcc
        http://blog.sina.com.cn/s/blog_a000da9d0101436p.html
    3. [原创]嵌入式系统UDEV的移植
        http://blog.chinaaet.com/snifer/p/38942
    4. 用Busybox制作嵌入式Linux的文件系统
        http://www.jiancool.com/article/6782467490/
    5. 编译busybox,动态链接与静态链接的选择
        http://blog.csdn.net/newnewman80/article/details/7971317
    6. busybox 制作动态库文件系统
        http://www.xuebuyuan.com/913205.html
    7. 第 12 章使用 udev 进行动态内核设备管理
        https://www.suse.com/zh-cn/documentation/sles11/singlehtml/book_sle_admin/cha.udev.html

二、Download:
    1. 网址:http://pkgs.fedoraproject.org/repo/pkgs/udev/
    2. 目标:udev-070.tar.gz 或者 udev-126.tar.gz

三、udev-070.tar.gz 编译:
    1. Makefile 修改:
        将142行:
            CROSS = #/usr/i386-linux-uclibc/usr/bin/i386-uclibc-
        修改为:
            CROSS = arm-linux-gnueabihf-
    2. make

四、udev-126.tar.gz编译:
    1. ./configure --prefix=<your install path> --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf
    2. 上面的<your install path>会保存在udevd程序中;
    3. 可以考虑先找个地方编译安装一次,得到一些配置文件,再编译一次不指定位置的,替换udev等可执行文件。
    4. ./configure --prefix= --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf
    5. cp udev/test-udev udev/udevd udev/udevadm <filesystem root path>/sbin

五、Error:
    1. 编译udev-182.tar.bz2不通过:
        1. 错误如下:
            checking for xsltproc... /usr/bin/xsltproc
            checking for library containing clock_gettime... -lrt
            checking for BLKID... no
            configure: error: Package requirements (blkid >= 2.20) were not met:

            No package 'blkid' found

            Consider adjusting the PKG_CONFIG_PATH environment variable if you
            installed software in a non-standard prefix.

            Alternatively, you may set the environment variables BLKID_CFLAGS
            and BLKID_LIBS to avoid the need to call pkg-config.
            See the pkg-config man page for more details.
        2. 未能解决,换低版本。
    2. 编译udev-070.tar.gz错误:
        1. 现象:
            Running arm-linux-gnueabihf-ar:                                       [OK]
            Running arm-linux-gnueabihf-ranlib:                                   [OK]
            Compiling udev.c:                                                     [OK]
            Linking udev:                                                         [ERROR]
              arm-linux-gnueabihf-gcc -s -Wl -Wl,-warn-common udev.o -o udev libudev.a libs
              ysfs/libsysfs.a
              arm-linux-gnueabihf-gcc: error: unrecognized command line option ‘-Wl’
            make: *** [udev] Error 1
        2. 解决办法:
            1. 注释187行:LDFLAGS += -s -Wl
            2. 注释204行:LDFLAGS += -Wl,-warn-common
    3. 运行依赖动态库程序错误:
        1. 现象:
            [^_^ bin]# ls udev main mainso -al
            -rwxrwxr-x    1 1001     1001        463813 Jan 16  2016 main
            -rwxrwxr-x    1 1001     1001          5970 Jan 16  2016 mainso
            -rwxrwxr-x    1 1001     1001         35268 Jan 16  2016 udev
            [^_^ bin]# ./udev
            -/bin/sh: ./udev: not found
            [^_^ bin]# ./main
            hello world.
            [^_^ bin]# ./mainso
            -/bin/sh: ./mainso: not found
            [^_^ bin]#
        2. 采用的编译方式:
            1. udev、mainso采用的共享库的方式编译的;
            2. main采用的静态编译的。
        3. 解决方法:
            由于busybox采用了静态编译的方式进行编译,这样可以在不依赖库的情况下运行,
            所以自己对busybox进行重现编译,采用动态库共享库的方式进行编译,程序运行正常。
    4. 使用udev-070.tar.gz热插拔无效果:
        1. 配置没写好,本例以miniSD卡为例;
        2. cat /etc/udev/udev.conf
            # Where in the filesystem to place the device nodes
            udev_root="/dev"

            # The name and location of the udev database.
            udev_db="/dev/.udevdb"

            # The name and location of the udev rules file(s).
            udev_rules="/etc/udev/rules.d"

            # The syslog(3) priority: "err", "info", or the numerical value.
            udev_log="err"
        3. cat /etc/udev/rules.d/udev-devfs.rules
            ......
            ACTION=="add", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/mkdir -p /mnt/mmc%n"
            ACTION=="remove", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/rm -rf /mnt/mmc%n"
            ......
        4. cat /etc/init.d/rcS
            ......
            # 这个用于找回内核启动阶段的设备节点,要不然连ttymxc0(debug口)节点都没有。
            /sbin/mdev  -s
            ......
            udevd  --daemon &
            udevstart
            ......
        5. 效果如下:
            [zengjf@root ]# ls /mnt
            [zengjf@root ]# mmc1: host does not support reading read-only switch. assuming write-enable.
            mmc1: new high speed SDHC card at address aaaa
            UEVENT[946688081] add@/devices/plmmcblk1: mmc1:aaaa SS08G 7.40 GiB
            atform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa
            UEVENT[946688081] add@/devices/virtual/bdi/179:24
             mmcblk1: p1 p2 p3
            UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1
            UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p1
            UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p2
            UEVENT[946688081] add@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p3

            [zengjf@root ]# ps | grep udev
             1417 root       0:00 udevd --daemon
             1509 root       0:00 udevmonitor
             1743 root       0:00 udev mmc
             1746 root       0:00 udev bdi
             1753 root       0:00 grep udev
            [zengjf@root ]# ls /mnt
            mmc1  mmc2  mmc3
            [zengjf@root ]# mmc1: card aaaa removed
            UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p3
            UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p2
            UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1/mmcblk1p1
            UEVENT[946688175] remove@/devices/virtual/bdi/179:24
            UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1
            UEVENT[946688175] remove@/devices/platform/sdhci-esdhc-imx.2/mmc_host/mmc1/mmc1:aaaa

            [zengjf@root ]# ls /mnt
            [zengjf@root ]#
        6. udev丢失kernel阶段设备事件:
            如上,如果不使用 /sbin/mdev  -s 获取内核阶段的的设备节点,udev无法获取到内核阶段的。
            目前还没找到什么更好的办法来解决,也许以后不小心就解决了。

    5. udev-126.tar.gz udevd运行错误:
        1. 错误现象:
            ......
            udevd[1468]: lookup_group: specified group 'tty' unknown
            ......
            udevd[1468]: lookup_group: specified group 'uucp' unknown
            udevd[1468]: lookup_group: specified group 'kmem' unknown
            udevd[1468]: lookup_group: specified group 'lp' unknown
            ......
            udevd[1468]: lookup_group: specified group 'disk' unknown
            udevd[1468]: lookup_group: specified group 'floppy' unknown
            ......
            udevd[1468]: lookup_group: specified group 'disk' unknown
            ......
        2. 解决办法:
            cat /etc/group
                ......
                tty:x:1:tty
                uucp:x:2:uucp
                kmem:x:3:kmem
                lp:x:4:lp
                disk:x:5:disk
                floppy:x:6:floppy
                disk:x:7:disk
                ......
        3. cat /etc/udev/rules.d/udev-devfs.rules
            ......
            ACTION=="add", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/mkdir -p /mnt/mmc%n"
            ACTION=="remove", KERNEL=="mmcblk[0-9][b-z][0-9]", RUN+="/bin/rm -rf /mnt/mmc%n"
            ......
        4. 运行正常效果:
            input:  USB OPTICAL MOUSE as /devices/platform/fsl-ehci.1/usb2/2-1/2-1.2/2-1.2:1.0/input/input4
            generic-usb 0003:0000:0538.0001: input,hidraw0: USB HID v1.11 Mouse [ USB OPTICAL MOUSE] on usb-fsl-ehci.1-1.2/input0
            udevd (1426): /proc/1426/oom_adj is deprecated, please use /proc/1426/oom_score_adj instead.
            udevd version 126 started
            zengjf login: root
            login[1429]: root login on 'ttymxc0'
            [zengjf@root ~]# ls /mnt
            [zengjf@root ~]# mmc1: host does not support reading read-only switch. assuming write-enable.
            mmc1: new high speed SDHC card at address aaaa
            mmcblk1: mmc1:aaaa SS08G 7.40 GiB
             mmcblk1: p1 p2 p3

            [zengjf@root ~]# ps
             ......
             1408 root       0:00 [kjournald]
             1426 root       0:00 udevd --daemon
             1427 root       0:00 [flush-179:0]
             1429 root       0:00 -sh
             1433 root       0:00 [mmcqd/1]
             1461 root       0:00 ps
            [zengjf@root ~]# ls /mnt
            mmc1  mmc2  mmc3
            [zengjf@root ~]# mmc1: card aaaa removed

            [zengjf@root ~]# ls /mnt
            [zengjf@root ~]# 

 

时间: 2024-10-23 01:24:09

I.MX6 Linux udev porting的相关文章

I.MX6 Linux eGTouch TouchScreen porting

I.MX6 Linux eGTouch TouchScreen porting 一.Download Driver: http://www.eeti.com.tw/drivers_Linux.html 二.阅读:EETI eGTouch Linux Programming Guide 三.系统启动配置: ...... # 本人直接将驱动放在内核里了,并没有做成模块 # insmod /module/hid-multitouch.ko # 使用eGTouch_v2.5.4330.L-ma/eGTo

I.MX6 Android i2c-tools porting

/************************************************************************** * I.MX6 Android i2c-tools porting * 说明: * 判断I2C总线设备是否存在,每次都去查dmesg,实在是烦了,于是还是移植 * 一个i2c-tools比较好,不用翻那长长内核信息. * * 2016-3-31 深圳 南山平山村 曾剑锋 **************************************

I.MX6 Android iperf3 porting failed

/***************************************************************************** * I.MX6 Android iperf3 porting failed * 说明: * 本来想移植一下iperf3到Android系统上测试一下网卡,可能是版本高了点,最后 * 运行客户端的时候会报错,也找了一些解决办法,但还是未能解决. * * 2016-4-5 深圳 南山平山村 曾剑锋 ***********************

I.MX6 bq27441 driver porting

/************************************************************************** * I.MX6 bq27441 driver porting * 声明: * 本文主要记录bq27441电池检测芯片驱动遇到的一些问题以及解决方法. * * 2016-1-28 深圳 南山平山村 曾剑锋 ************************************************************************

I.MX6 linux kernel编译错误处理

/******************************************************************************** * I.MX6 linux kernel编译错误处理 * 声明: * 本文仅仅是对I.MX6的linux内核编译出错,记录其对应的处理方法. * * 2015-10-15 晴 深圳 南山平山村 曾剑锋 *******************************************************************

I.MX6 Linux I2C device&amp; driver hacking

/******************************************************************************************* * I.MX6 Linux I2C device& driver hacking * 声明: * 1. 本文主要是对Linux I2C驱动进行代码跟踪,主要是为了能够对I2C驱动框架有个全面的了解: * 2. 本文源代码来自myzr_android4_2_2_1_1_0.tar.bz2: * 3. 如果你有兴趣,

I.MX6 Ubuntu core porting

/*********************************************************************** * I.MX6 Ubuntu core porting * 说明: * 之前查资料查到了Ubuntu core的资料,然后一直想尝试将Ubuntu core放到 * I.MX6中,当然也想将其放到OK335xS中,于是今天花点时间将其放入I.MX6中. * * 2016-4-16 深圳 南山平山村 曾剑锋 ***********************

I.MX6 Linux、Jni ioctl 差异

/*********************************************************************** * I.MX6 Linux.Jni ioctl 差异 * 声明: * 在使用Jni的ioctl()的过程中,发现不能像普通的Linux函数那样使用, * 必须使用3各参数的ioctl()函数. * * 2015-12-20 深圳 南山平山村 曾剑锋 ****************************************************

I.MX6 Linux mipi配置数据合成

/*************************************************************************** * I.MX6 Linux mipi配置数据合成 * 声明: * 由于现有mipi配置数据不符合I.MX6的配置参数,需要将该参数进行数据转换, * 而这又涉及到对数据处理简单算法,主要是为了验证转换代码可靠性. * * 2015-12-24 深圳 南山平山村 曾剑锋 **************************************