内核使用 event(事件)机制向外抛出消息,在应用层由udev/mdev接收到事件后,根据规则自动创建设备文件。
但是内核有事件时需要调用 一个程序,以执行接下来的操作,故一般使用
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
但前提是必须要挂载一些文件系统,如将/dev挂为临时文件系统,这样就不需要向Flash写数据了。
好了,先从/etc/fstab说起
/home/zhangshaoyan/ftpdir # cat /etc/fstab
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/mmcblk0p1 / ext3 defaults 0 0
/dev/mmcblk0p2 /media ext3 defaults 0 0
devpts /dev/pts devpts defaults 0 0
tmpfs /var tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
再来看看开机脚本
/home/zhangshaoyan/ftpdir # cat /etc/init.d/rcS
#!/bin/bash
#this file is used to initial local runtime environment,
#includes set environment variable,create necessary files,
#dynamic install device driver module,etc.
#July 15,2014 by shell.albert.
#Contact me with 13522296239.
#Copyright(C) 2014~2016,oristartech.com
#DO NOT CHANGE THE WHOLE SOFT-ARCHITECTURE!
#KEEP ORIGINAL DIRECTORY STRUCTURE.
#THANKS!
#mount partitions
#this will use /etc/fstab
mkdir /dev/pts -p
mount -t devpts devpts /dev/pts
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
#set environment variable
PATH=/bin:/sbin:/usr/sbin:/usr/bin:/home/zhangshaoyan/bin
export PATH
LD_LIBRARY_PATH=/lib:/home/zhangshaoyan/lib
export LD_LIBRARY_PATH
#install necessary driver module file.
HOME_DIR=/home/zhangshaoyan
DRVS_DIR=$HOME_DIR/drivers
DRVS_LIST=(\
imx5_msp430_driver.ko \
imx5_cspi_driver.ko \
imx5_led_driver.ko \
imx5_ds3234_driver.ko \
imx5_ds3650_driver.ko \
imx5_ecspi2_vnic_driver.ko \
);
#loop to install
for file_ko in ${DRVS_LIST[*]}
do
done
#create device files
#already created in /dev through static mknod command.
#mknod /dev/imx5_led1 c 1987 1
#mknod /dev/imx5_led2 c 1987 2
#mknod /dev/imx5_led3 c 1987 3
#mknod /dev/imx5_led4 c 1987 4
#mknod /dev/imx5_led5 c 1987 5
#mknod /dev/imx5_led6 c 1987 6
#mknod /dev/imx5_ds3234 c 1988 0
#mknod /dev/imx5_cspi c 1990 0
#mknod /dev/imx5_ds3650 c 1991 0
#supply by ecspi1_vnic.ko
#mknod /dev/imx5_ecspi1 c 1989 0
#mknod /dev/imx5_ecspi2 c 1992 0
#ipaddress for eth0
#fixed or dhcp
#be sure /usr/share/udhcpc/default.script file
#must exists before using dhclient.
#udhcpc
#ifconfig eth0 172.23.146.119 netmask 255.255.252.0
#ip,mac for vnic.
ifconfig zvnic0 hw ether 00:00:19:87:09:01
ifconfig zvnic0 192.168.10.53
ifconfig zvnic0
#start dropbear sshd service
mkdir -p /etc/dropbear
cd /etc/dropbear
if [ ! -f "/etc/dropbear/dropbear_rsa_host_key" ];then
dropbearkey -t rsa -f dropbear_rsa_host_key
fi
if [ ! -f "/etc/dropbear/dropbear_dss_host_key" ];then
dropbearkey -t dss -f dropbear_dss_host_key
fi
dropbear &
#start ftp service
tcpsvd -vE 0.0.0.0 21 ftpd -w /home/zhangshaoyan/ftpdir &
#change login directory
cd /home
#start sm
#sleep 5
#/mnt/imbsm_new/bin/zsy.sh
#the end of file,tagged by ZSY.
再来看看当mdev程序执行时,读到的配置规则文件:
/home/zhangshaoyan/ftpdir # cat /etc/mdev.conf
# system all-writable devices
full 0:0 0666
null 0:0 0666
ptmx 0:0 0666
random 0:0 0666
tty 0:0 0666
zero 0:0 0666
# console devices
tty[0-9]* 0:5 0660
vc/[0-9]* 0:5 0660
# serial port devices
s3c2410_serial0 0:5 0666 =ttySAC0
s3c2410_serial1 0:5 0666 =ttySAC1
s3c2410_serial2 0:5 0666 =ttySAC2
s3c2410_serial3 0:5 0666 =ttySAC3
# loop devices
loop[0-9]* 0:0 0660 =loop/
# i2c devices
i2c-0 0:0 0666 =i2c/0
i2c-1 0:0 0666 =i2c/1
# frame buffer devices
fb[0-9] 0:0 0666
# input devices
mice 0:0 0660 =input/
mouse.* 0:0 0660 =input/
event.* 0:0 0660 =input/
ts.* 0:0 0660 =input/
# rtc devices
rtc0 0:0 0644 >rtc
rtc[1-9] 0:0 0644
好,现在我加载驱动看看。
/home/zhangshaoyan/ftpdir # ls -l /dev/input/
total 0
crw-rw---- 1 root root 13, 64 Jan 1 00:00 event0
crw-rw---- 1 root root 13, 63 Jan 1 00:00 mice
/home/zhangshaoyan/ftpdir # insmod imx6_key_drv.ko
input: imx6_key_drv as /devices/virtual/input/input2
/home/zhangshaoyan/ftpdir # i'm running!!!!!
/home/zhangshaoyan/ftpdir # ls -l /dev/input/
total 0
crw-rw---- 1 root root 13, 64 Jan 1 00:00 event0
crw-rw---- 1 root root 13, 65 Jan 1 00:09 event1
crw-rw---- 1 root root 13, 63 Jan 1 00:00 mice
/home/zhangshaoyan/ftpdir # cat /proc/bus/input/devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="da9052-onkey"
P: Phys=da9052-onkey/input0
S: Sysfs=/devices/platform/imx-i2c.0/i2c-0/0-0048/da9052-onkey/input/input0
U: Uniq=
H: Handlers=kbd event0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="imx6_key_drv"
P: Phys=
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=kbd event1
B: EV=3
B: KEY=281 0 0 0
/home/zhangshaoyan/ftpdir #
看到了吧,设备节点生成了!!!
内核中使用input_register_device注册输入设备时,由内核抛出信息,hotplug机制,将引发调用应用层程序mdev,并将消息传递给它。mdev根据这些信息生成设备文件。
sys跟文件系统里,可以设置当这些事件发生之后,接收该事件的程序。