微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > hotplug_uevent机制

hotplug_uevent机制

时间:11-21 来源:互联网 点击:
class_device_create

class_device_register

class_device_add

kobject_uevent(&class_dev->kobj, KOBJ_ADD);

kobject_uevent_env(kobj, action, NULL);

// action_string = "add";

action_string = action_to_string(action);

// 分配保存环境变量的内存 //

// environment values //

buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);

// 设置环境变量 //

envp [i++] = scratch;

scratch += sprintf(scratch, "ACTION=%s", action_string) + 1;

envp [i++] = scratch;

scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;

envp [i++] = scratch;

scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;

// 调用应用程序: 比如mdev //

// 启动脚本 echo /sbin/mdev > /proc/sys/kernel/hotplug

// 设置了uevent_helper为“/sbin/mdev“

//

argv [0] = uevent_helper; // = "/sbin/mdev"

argv [1] = (char *)subsystem;

argv [2] = NULL;

call_usermodehelper (argv[0], argv, envp, 0);

分析: busybox mdev.c

100ask: uevent_helper = /sbin/mdev

envp[0] = HOME=/

envp[1] = PATH=/sbin:/bin:/usr/sbin:/usr/bin

envp[2] = ACTION=add

envp[3] = DEVPATH=/class/sixth_drv/buttons

envp[4] = SUBSYSTEM=sixth_drv

envp[5] = SEQNUM=720

envp[6] = MAJOR=252

envp[7] = MINOR=0

mdev_main

temp = /sys/class/sixth_drv/buttons

make_device(temp, 0);

// 确定设备文件名,类型,主次设备号 //

device_name = bb_basename(path); = "buttons"

c == > 字符设备节点

根据"/sys/class/sixth_drv/buttons/dev"的内容确定主次设备号

mknod(device_name, mode | type, makedev(major, minor)

我接上U盘,想自动挂载,怎么办?

mdev.conf的格式:

: [<@|$|*> ]

device regex:正则表达式,表示哪一个设备

uid: owner

gid: 组ID

octal permissions:以八进制表示的属性

@:创建设备节点之后执行命令

$:删除设备节点之前执行命令

*: 创建设备节点之后 和 删除设备节点之前 执行命令

command:要执行的命令

命令:vi /etc/mdev.conf

ls -l /dev/led*

vi /bin/add_remove_led.sh

chmod +x /bin/add_remove_led.sh

写mdev.conf

1.

leds 0:0 777

led1 0:0 777

led2 0:0 777

led3 0:0 777

2.

leds?[123]? 0:0 777

3.

leds?[123]? 0:0 777 @ echo create /dev/$MDEV > /dev/console

4.

leds?[123]? 0:0 777 * if [ $ACTION = "add" ]; then echo create /dev/$MDEV > /dev/console; else echo remove /dev/$MDEV > /dev/console; fi

5.

leds?[123]? 0:0 777 * /bin/add_remove_led.sh

把命令写入一个脚本:

add_remove_led.sh

#!/bin/sh

if [ $ACTION = "add" ];

then

echo create /dev/$MDEV > /dev/console;

else

echo remove /dev/$MDEV > /dev/console;

fi

6. U盘自动加载

sda[1-9]+ 0:0 777 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi

7.

sda[1-9]+ 0:0 777 * /bin/add_remove_udisk.sh

add_remove_udisk.sh

#!/bin/sh

if [ $ACTION = "add" ];

then

mount /dev/$MDEV /mnt;

else

umount /mnt;

fi

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top