寫驅動的時候如果使用自動分配設備號的方式,在創建設備結點的時候需要在 '/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的左邊,一個在;的右邊。