皮皮网

【登录界面源码替换】【会员积分抽奖源码】【抽闷砖源码】MYUSB源码

2024-11-23 03:18:52 来源:kdenlive源码

1.udev的rules定制和调试
2.STM32 进阶教程 1 - micropython 移植

MYUSB源码

udev的rules定制和调试

       udev的rules定制和调试

        在定制项目中,对外设的热插拔的管理基本都在udev/systemd-udev来管理。这里没有对基本的udev使用/rules书写进行介绍。

        1. udev的rules可能的位置

        /lib/udev/rules.d -- udev默认/预置的rules

        /etc/udev/rules.d/ -- 定制的rules, 优先级高于/lib/udev/rules.d,官方建议客户写的rules都放这里

        至于放在哪个位置,自己决定就好,既然你在修改系统就应该知道你在做什么

        2. 定制自己的rules

        定制热插拔的事件,具体到rules就是:

          1)过滤到正确的udev事件。

          2)指定执行的动作,rules里的“RUN”,通常是脚本(毕竟要完成一个功能,绝大多数场景都不是一个命令能搞定的)

        3.到这里就要设计到rules的调试了

          1)如何知道要过滤的是条件?

          2)如何将必要的参数传递给RUN执行的脚本?

        方法1:

        udevadm monitor -p

        -- 监测所以的kernel/udevd的热插拔事件, -p选项很有必要,打印出本次热插拔事件的一些属性

       è¿™é‡Œå°±æ˜¯æ¯”较设备插入和拔出时的事件属性的不同,可作为过滤的条件

        比如:

        rules文件对于规则:

        到这里很多时候就能满足要求了,如果还有解决不里的场景,就要进一步修改过滤条件。

        man udev里会有绝大部分的关键字的信息(想全部的就只能去撸源码)。

       æ–¹æ³•2:

        通过在RUN指定的脚本里传递参数,来找到设备存在和不存在的属性差异。

        比如:

        参考信息:

        a)、udev 规则的匹配键

        ACTION:          事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。

        KERNEL:          内核设备名称,例如:sda, cdrom。

        DEVPATH:         设备的 devpath 路径。

        SUBSYSTEM:        设备的子系统名称,例如:sda 的子系统为 block。

        BUS:            设备在 devpath 里的总线名称,例如:usb。

        DRIVER:           设备在 devpath 里的设备驱动名称,例如:ide-cdrom。

        ID:             设备在 devpath 里的识别号。

        SYSFS{ filename}:     设备的 devpath 路径下,设备的属性文件“filename”里的内容。

                       例如:SYSFS{ model}==“STSS”表示:如果设备的型号为 STSS,则该设备匹配该 匹配键。

                       在一条规则中,可以设定最多五条 SYSFS 的 匹配键。

        ENV{ key}:          环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。

        PROGRAM:        调用外部命令。

        RESULT:           外部命令 PROGRAM 的返回结果。

        b)、udev 的重要赋值键

        NAME:           在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。

        SYMLINK:          为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。

        OWNER, GROUP, MODE:  为设备设定权限。

        ENV{ key}:         导入一个环境变量。

        c)、udev 的值和可调用的替换操作符

        Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:

        $kernel, %k:        设备的内核设备名称,例如:sda、cdrom。

        $number, %n:        设备的内核号码,例如:sda3 的内核号码是 3。

        $devpath, %p:       设备的 devpath路径。

        $id, %b:          设备在 devpath里的 ID 号。

        $sysfs{ file}, %s{ file}:    设备的 sysfs里 file 的内容。其实就是设备的属性值。

        $env{ key}, %E{ key}:   一个环境变量的值。

        $major, %M:        设备的 major 号。

        $minor %m:        设备的 minor 号。

        $result, %c:        PROGRAM 返回的结果。

        $parent, %P:          父设备的设备文件名。

        $root, %r:          udev_root的值,默认是 /dev/。

        $tempnode, %N:      临时设备名。

        %%:            符号 % 本身。

        $$:             符号 $ 本身。

        对比一下和man里的差别,$sysfs{ file},这个在实际解决问题的时候是很有用的。

        这种方法适合调试系统启动的时候对rules的调试,这个过程中是没得udevadmin monitor使用的。(当然,可以尝试自己写一个systemd启动服务,这就涉及到启动的时机、关联、影响,实际操作会比预想的复杂)

        这里提两个点:

        1. env - 可以是udev事件里的属性(-p打印的)

        2. $sysfs{ file}, 这里的file就是在系统/sys目录下对应的节点下的文件,有些情况下只能在sysfs的file的内存才能准确区分事件。

STM 进阶教程 1 - micropython 移植

       在STMFZET6开发板上移植Micropython,为单片机和嵌入式程序开发引入Python的优点。

       MicroPython是Python 3的精简高效实现,包含标准库的登录界面源码替换一部分,可在微控制器和受限环境中运行。它具备Python的高级特性,如交互式提示符、任意精度整数、闭包、列表解析、生成器和异常处理等,会员积分抽奖源码同时体积紧凑,可在k代码空间和k RAM中运行。

       移植Micropython至STMFZET6开发板,让我们以正点原子的stmf4探索者开发板为例,使用JFLAH、抽闷砖源码PUTTY和ST_DFU工具进行硬件配置。ST_DFU工具可从document/d...>获取。

       安装所需的工具,如Git、gcc和gcc-arm-none-eabi交叉编译器,Qt免费系统源码并在Ubuntu系统中下载Micropython源码。在ports/stm/boards目录下找到支持的处理器或开发板型号,如STMF4DISC,然后将其复制并重命名为MYBOARD。在micropython目录下进入mpy-cross目录,ar手势识别源码先编译MicroPython cross-compiler,随后编译Micropython。生成的固件以DFU或HEX形式适用于烧录。

       使用jlink工具直接烧录firmware.hex文件至开发板。如需使用DFU,参考相关教程。程序烧录与运行后,在电脑资源管理器中应能看到USB串行设备或新盘符。通过PUTTY连接开发板,执行命令验证Micropython功能,如加减乘除运算、IO口操作、随机数生成等。

       实现Micropython移植教程至此完成。如需深入了解Micropython,可访问en...>。对移植过程感兴趣或有实际应用案例的同学,可继续研究和实践。针对所用开发板,仍有未完全支持的功能,如不支持特定GPIO口的操作、LED控制端口不匹配或UART1使用受限。下一节将介绍解决这些具体问题的方法。