View on GitHub

富乎 · 地问


avatar
辗转探寻为富乎?《天问》无解向地问!

<<< 返回主页

i.MX6ULL设备树管脚复用配置
的查重及查漏

1、背景

2、查重

由于管脚复用逻辑集中定义在若干个头文件, 且以功能地址(偏移量)进行组织,所以可从这两方面入手, 即:先利用头文件枚举出所有地址(偏移量),再查找出每个地址所关联的复用特性名称, 最后再逐个名称地在目标设备树文件进行搜寻,同一地址的管脚出现2次以上的复用则为重复。 核心脚本内容如下:

DTS_FILE=$1 # 通过命令行参数传递待检查的.dts文件的实际路径
KERNEL_ROOT=${HOME}/src/linux # 实际的Linux内核源码根目录路径
HEADER_FILES=$(ls ${KERNEL_ROOT}/arch/arm/boot/dts/imx6ul*-pinfunc*.h)

grep "^#define[[:space:]]\+MX6UL" ${HEADER_FILES} | awk '{ print $3 }' | sort | uniq | while read i
do
    echo ">>> 正在对寄存器地址偏移量为[${i}]的引脚复用进行查重……"
    grep "^#define[[:space:]]\+MX6UL" ${HEADER_FILES} | awk "{ if (\"${i}\" == \$3) print \$2 }" | sort | uniq | while read j
    do
        grep -n --color=auto "${j}" "${DTS_FILE}"
    done
done

更灵活、更完善的脚本详见 懒编程秘笈 项目的scripts/check_arm_iomux_repetition.sh及其关联配置scripts/.script_as_config, 其详细用法可带上-h选项进行查看。

3、查漏

仍是基于头文件。仔细观察可发现,每个复用配置项命名均是有规律的,即:

按以上规律可写出核心脚本内容如下:

IOMUX=$1 # 通过命令行参数传递待查找的复用功能名称
KERNEL_ROOT=${HOME}/src/linux # 实际的Linux内核源码根目录路径
HEADER_FILES=$(ls ${KERNEL_ROOT}/arch/arm/boot/dts/imx6ul*-pinfunc*.h)
MASTER_GROUPS=(
    $(grep "^#define[[:space:]]\+MX6UL" ${HEADER_FILES} \
        | awk '{ print $2 }' | sed 's/^[^_]\+_PAD_\([^_]\+\)_.\+/\1/' | sort | uniq)
)
RESULT_GROUPS=(
    $(grep "^#define[[:space:]]\+MX6UL" ${HEADER_FILES} \
        | awk '{ print $2 }' | sed 's/^.\+__\([^_]\+\)_.\+/\1/' | sort | uniq)
)

if [ $(echo ${MASTER_GROUPS[@]} ${RESULT_GROUPS[@]} | sed 's/ /\n/g' | sort | uniq | grep -c "^${IOMUXC}\$") -eq 0 ]
then
    echo "*** 该复用功能名称不存在:${IOMUXC}" >&2
    exit 1
fi

grep "^#define[[:space:]]\+[A-Z0-9_]\+__${IOMUXC}" ${HEADER_FILES} | awk '{ print $2 }' | sort | uniq

以上内容仅用于说明核心逻辑,执行结果并不十分精确,更灵活、更完善的脚本详见 懒编程秘笈 项目的scripts/get_arm_iomux_pins.sh及其关联配置scripts/.script_as_config, 其详细用法可带上-h选项进行查看。

理论上来说,若头文件的定义完整且无差错,则以上脚本可给出指定功能模块所需的全部引脚复用配置。 当然,如果还不放心,可以自行到后面的参考材料的相关章节查阅核对。若有脚本未尽之处, 后续会在本文进行文字补充。

4、使用建议

5、注意事项

6、参考材料