写驱动的时候如果使用自动分配设备号的方式,在创建设备结点的时候需要在 '/proc/devices' 文件中查看一下所分配的设备号。可以通过awk命令:
awk '{if($2=="your-driver") {print $1}}' /proc/devices
mknod.sh
这个脚本能够自动获取设备号并创建设备节点:
#!/bin/bash
driver=$1
dir=$2
major=`awk "{if(\\$2==\\"$driver\\") {print \\$1}}" /proc/devices`
#major=`awk '{if(\$2=="usb") {print \$1}}' /proc/devices`
mknod /dev/$dir/$driver c $major 0
把脚本保存为 mknod.sh,使用命令'chmod +x mknod.sh'改成可执行文件,再使用如下命令在/dev/your-dir目录下创建设备节点:
./mknod.sh your-driver your-dir
也可在/dev目录下创建设备节点:
./mknod.sh your-driver
在Makefile中加入如下项目:
setup:
insmod your-mod.ko
mkdir /dev/your-dir
./mknod.sh your-driver your-dir
unsetup:
rmmod your-mod.ko
rm -rf /dev/your-dir
major.sh
这个脚本可返回设备号:
#!/bin/bash
driver=$1
awk "{if(\$2==\"$driver\") {print \$1}}" /proc/devices
在Makefile中加入如下内容:
setup:
insmod your-mod.ko
mkdir /dev/your-dir
mknod /dev/your-dir/your-driver c `./major.sh your-driver` 0
unsetup:
rmmod your-mod.ko
rm -rf /dev/your-dir
Makefile
Makefile也可以不借助shell脚本实现:
setup:
insmod your-mod.ko
mkdir /dev/your-dir
mknod /dev/your-dir/your-driver c `awk '{if($$2=="your-driver") {print $$1}}' /proc/devices` 0
unsetup:
rmmod your-mod.ko
rm -rf /dev/your-dir
需要注意的是Makefile中$的转义和Shell中不一样。在Makefile 中 "$"、"#" 有特殊含义,转义方式为 "/#"、"$$"。
总结
本文尝试了三种方式的Makefile,区别只在于对awk命令进行了不同方式的转义:
setup:
insmod your-mod.ko
mkdir /dev/your-dir
./mknod.sh your-driver your-dir
mknod /dev/your-dir/your-driver c `./major.sh your-driver` 0
mknod /dev/your-dir/your-driver c `awk '{if($$2=="your-driver") {print $$1}}' /proc/devices` 0
注:
- 本文中shell脚本可以直接使用,但是Makefile示例需要把your-mod,your-driver,your-dir改成你自己的东西。
- 注意'和`的区别,一个在数字键1的左边,一个在;的右边。