S3C2440 热拔插驱动 修改mdev配置支持U盘自动挂载(三十三)

发布者:幸福之舞最新更新时间:2020-07-07 来源: eefocus关键字:S3C2440  热拔插驱动  自动挂载 手机看文章 扫描二维码
随时随地手机看文章

1、当我们每次插入U盘后,都会自动创建U盘的设备节点/dev/sda%d


这是因为里面调用了device_create()实现的,busybox的mdev机制就会根据主次设备号等信息,在/dev目录下创建设备节点,如下图所示:

而想使用上面的sda1设备节点,读写数据时,还需要使用mount /dev/sda1 /mnt来挂在U盘才行,会显得很麻烦,如下图所示:

2、其实,可以在/etc/mdev.conf文件里加入一行语句就能实现自动装载u盘,也可以在里面干其他与设备节点相关的事


2.1 而/etc/mdev.conf又是什么?


它是属于mdev的一个配置文件,而mdev之前就讲过了,它主要的功能是管理/dev目录底下的设备节点


当系统中有自动注册设备节点的时候,mdev就会/etc/mdev.conf一次,该文件可以实现与设备节点相关的事,比如自动装载usb,打印创建的设备节点信息等


3、我们首先来分析device_ceate(),是如何来调用到/etc/mdev.conf的,后面再讲如何使用mdev.conf(也可以直接跳过,直接看下面第4小节,如何使用)


(ps:之前创建字符设备节点用的class_device_create(),其实是和device_create功能差不多)


3.1 class_device_create()最终调用了:class_device_create()->class_device_register()->class_device_add():


device_create()->device_register()->device_add()函数如下所示:

 

int class_device_add(struct class_device *class_dev)

{

       ... ...

       kobject_uevent(&class_dev->kobj, KOBJ_ADD);         // KOBJ_ADD是一个枚举值

              //调用了kobject_uevent_env(kobj, action, NULL);              // action=KOBJ_ADD

}

3.2 class_device_create()->class_device_register()->class_device_add()->kobject_uevent_env()函数如下所示:


int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,char *envp_ext[])

{

       char **envp;

       char *buffer;

       char *scratch;

       int i = 0;

       ... ...

 

       /* 通过KOBJ_ADD获取字符串"add",所以action_string="add"  */

       action_string = action_to_string(action);              // action=KOBJ_ADD

 

                                                       

       /* environment index */

       envp = kzalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL);      //分配一个环境变量索引值

 

       /* environment values */

    buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);     //分配一个环境变量缓冲值      

 

/* event environemnt for helper process only */

/*设置环境变量*/

       envp[i++] = "HOME=/";

       envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";

       scratch = buffer;

       envp [i++] = scratch;

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

       envp [i++] = scratch;

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

       envp [i++] = scratch;

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

       ... ...

       /*调用应用程序,比如mdev*/

       if (uevent_helper[0]) {

            char *argv [3];

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

              argv [1] = (char *)subsystem;

              argv [2] = NULL;

              call_usermodehelper (argv[0], argv, envp, 0);        //调用应用程序,根据传入的环境变量参数来创建设备节点

       }

}

从上面的代码和注释来看,最终通过*argv[],*envp[]两个字符串数组里面存的环境变量参数来创建设备节点的


3.2 接下来便在kobject_uevent_env()函数里添加打印信息,然后重新烧写uboot:


kobject_uevent_env() 函数 在 linux-2.6.22.6libkobject_uevent.c

3.3 然后我们以注册一个案件驱动为例:


加载以前的按键驱动,insmod buttons.ko打印以下语句:


class_device: argv[0]=/sbin/mdev                 //调用mdev

 

class_device: argv[1]=sixth_dev                      //类名

 

class_device: envp[0]=HOME=/

 

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

 

class_device: envp[2]=ACTION=add             //add:表示添加设备节点,  若=remove:表示卸载设备节点

 

class_device: envp[3]=DEVPATH=/class/sixth_dev/buttons   //设备的路径

 

class_device: envp[4]=SUBSYSTEM=sixth_dev                //类名

 

class_device: envp[5]=SEQNUM=745

 

class_device: envp[6]=MAJOR=252                          //主设备号

 

class_device: envp[7]=MINOR=0

3.4 最终这些参数根据/sbin/mdev就进入了busybox的mdev.c的mdev_main()函数里:


int mdev_main(int argc, char **argv)

{

... ...

action = getenv("ACTION");           //获取传进来的执行参数,它等于“add”,则表示创建设备节点

env_path = getenv("DEVPATH");      //获取设备的路径“/class/sixth_dev/buttons”

sprintf(temp, "/sys%s", env_path);   //指定temp (真正设备路径)为“/sys/class/sixth_dev/buttons”

 

if (!strcmp(action, "remove"))           //卸载设备节点

                    make_device(temp, 1);

 

else if (!strcmp(action, "add")) {       //创建设备节点

                     make_device(temp, 0);

 ... ... 

}

3.5 最终调用mdev_main()->make_device()函数来创建/卸载设备节点,该函数如下所示:


static void make_device(char *path, int delete) //delete=0:创建, delete=1:卸载

{

       /*判断创建的设备节点是否是有效的设备*/

       if (!delete) {

              strcat(path, "/dev");

              len = open_read_close(path, temp + 1, 64);

              *temp++ = 0;

              if (len < 1) return;

       }

 

device_name = bb_basename(path);    //通过设备路径,来获取要创建/卸载的设备节点名称

                      //例: path =“/sys /class/sixth_dev/buttons”,那么device_name=“buttons”

 

 

 

type = path[5]=='c' ? S_IFCHR : S_IFBLK;     //判断如果是在/sys/class/目录下,那么就是字符设备

                                              //因为块设备,是存在/sys/block/目录下的

 

 

/* 如果配置了支持mdev.conf选项,那么就解析里边内容并执行   */

 if (ENABLE_FEATURE_MDEV_CONF) { 

       /* mmap the config file */

fd = open("/etc/mdev.conf", O_RDONLY);     //调用/etc/mdev.conf配置文件

     

      ... ...         //开始操作 mdev.conf配置文件

}

 

 

 

       if (!delete) {                  //如果是创建设备节点

 

              if (sscanf(temp, "%d:%d", &major, &minor) != 2) return;   //获取主次设备号

 

        /*调用mknod ()创建字符设备节点*/

if (mknod(device_name, mode | type, makedev(major, minor)) && errno != EEXIST)

                     bb_perror_msg_and_die("mknod %s", device_name);

 

 

              if (major == root_major && minor == root_minor)

                     symlink(device_name, "root");

 

              /*若配置了支持mdev.conf选项,则调用chown命令来改变属主,默认uid和gid=0 */

              if (ENABLE_FEATURE_MDEV_CONF) chown(device_name, uid, gid);

}

 

     if (delete) unlink(device_name);           //如果是卸载设备节点

}

从上面的代码和注释分析到,要使用mdev.conf配置文件,还需要配置busybox的menuconfig,使mdev支持mdev.conf选项才行


如下图,进入busybox目录,然后输入make menuconfig,发现我们已经配置过了该选项了

4、接下来,便来看看如何使用mdev.conf,参考:busybox-1.7.0docsmdev.txt文档


使用方法如下所示:


the format: : [<@|$|*> ]


The special characters have the meaning:


@ Run after creating the device.


$ Run before removing the device. 


* Run both after creating and before removing the device.


大概就是:


配置文件格式:


: [<@|$|*> ]


各个参数代表的含义如下:


device regex:


正则表达式,来表达哪一个设备,正则表达式讲解链接:https://deerchao.net/tutorials/regex/regex.htm


uid:


owner(uid,gid:注册设备节点时,就会被chown命令调用,来改变设备的属主,默认都填0即可)


gid:


组ID


octal permissions:


以八进制表示的权限值,会被chmod命令调用,来更改设备的访问权限,默认填660即可


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


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


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


command:要执行的命令


5、接下来便来使用mdev.conf,实现u盘自动装载


vi /etc/mdev.conf


添加以下一句:


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


[1-9]:匹配1~9的数字


+     :重复匹配一次或更多次


$ACTION = "add":表示注册设备节点,否则就是注销设备节点


/dev/$MDEV        :表示要创建/注销的那个设备节点


所以当我们插上U盘,自动创建了/dev/sda1时,mdev便会进入/etc/mdev.conf配置文件,然后执行mount /dev/命令,即可自动装载u盘,如下图所示:

输入ls /dev/sda1 -l,可以看到都是通过mdev.conf里配置信息来创建的设备节点,如下图所示:

而取出u盘时,同样自动umount /mnt来卸载

关键字:S3C2440  热拔插驱动  自动挂载 引用地址:S3C2440 热拔插驱动 修改mdev配置支持U盘自动挂载(三十三)

上一篇:S3C2440 网卡驱动介绍以及制作虚拟网卡驱动(二十五)
下一篇:S3C2440声卡驱动移植、测试以及madplay播放mp3文件(三十一)

推荐阅读最新更新时间:2024-10-28 19:23

Samsung S3C2440平台上的Vxworks BSP移植
  研究基于S3C2440平台上的Vxworks BSP移植具有重要的意义。本文就BSP的概念、BSP移植过程中重点修改的几个文件、串口和网口驱动以及BSP的调试和仿真做详细的介绍。   BSP概述   VxWorks操作系统将所有硬件的功能函数分别放到一系列库中,这些库就被称为板级支持包BSP。BSP是连接VxWorks操作系统与硬件平台的一个接口软件包,在引导系统、支持系统运行过程中扮演着重要的角色,首先,通过BSP可以生成引导操作系统的bootrom;其次,引导行工程的建立基础就是BSP;最后,BSP具有与用户交互的作用,可以提供一个基础的硬件调试环境。BSP还可以使VxWorks运行于特定的硬件平台,如ARM、PPC、
[单片机]
Samsung <font color='red'>S3C2440</font>平台上的Vxworks BSP移植
S3C2440-SDRAM
我板子的SDRAM是64M,从0x30000000 0x3fffffff,被BANK6选中。 //64MB // 0x30000000 0x30ffffff : Download Area (16MB) Cacheable // 0x31000000 0x33feffff : Non-Cacheable Area // 0x33ff0000 0x33ff47ff : Heap & RW Area // 0x33ff4800 0x33ff7fff : FIQ User Stack Area // 0x33ff8000 0x33fffeff : Not Useed Area
[单片机]
从0开始学Keil下的S3C2440裸机开发-3使用外部NORFLASH+内部RAM
关于S3C2440启动方式: 程序下载到NORFLASH中后,选择从NORFLASH启动,自动执行,NORFLASH中执行代码,内部RAM分配变量;NORFLASH本身地址映射为0X0000000,内存选用内部RAM。 程序下载到NANDFLASH中后,选择从NANDFLASH启动,会自动搬运4K到RAM中运行。 1、新增工程配置组. 2设置分散加载组 3使用命令生成.bin文件。 4更改S3C2440.S文件: (1)均为: IMPORT ||Image ERROM1ERROM1 RO Length||IMPORT||ImageLength||IMPORT||Image RW_IR
[单片机]
从0开始学Keil下的<font color='red'>S3C2440</font>裸机开发-3使用外部NORFLASH+内部RAM
s3c2440 LCD及触摸屏的学习笔记(1)
所用的LCD为TopPoly-TD035STED4(TFT)型号,240*320的 其VCLK为6.39MHz。 根据s3c2440手册s3c2440处理LCD的时钟源是HCLK,通过寄存器LCDCON1中的CLKVAL可以调整VCLK频率大小,它的公式为:VCLK=HCLK÷ ,程序的内部分频为FCLK=400MHz、HCLK=100MHz、PCLK=50MHz(MPLLCON=(92 12)|(1 4)|1;),因此得到CLKVAL取整为6。 注:(LCD一般需要三个时序信号:VSYNC、HSYNC和VCLK。VSYNC是垂直同步信号,在每进行一个帧(即一个屏)的扫描之前,该信号就有效一次,由该信号可以确定LCD的场频,即
[单片机]
<font color='red'>s3c2440</font> LCD及触摸屏的学习笔记(1)
s3c2440芯片串口操作
S3C2440A通用异步接收器和发射机(UART)提供了三个独立的异步串行输入/输出(SIO)端口,每个端口都可以在中断或基于dma的模式下运行。换句话说,UART可以生成一个中断或DMA请求来在CPU和UART之间传输数据。UART可以使用系统时钟,支持波特率高达921.6 Kbps。如果外部设备提供UEXTCLK,那么UART可以以更高的速度运行。每个UART通道包含两个64字节的FIFO,用于接收器和发送器。 S3C2440A UART包括可编程的波特率、红外(IR)传输/接收、一个或两个停止位、5位、6位、7位或8位数据宽度和奇偶校验。 每个UART包含一个波特率生成器、发射机、接收机和一个控制单元,如图1所示。波
[单片机]
<font color='red'>s3c2440</font>芯片串口操作
s3c2440串口裸板驱动(使用fifo)
1:串口的数据发送的数据量较大时,使用fifo可以大大降低MCU的开销。(有点类似串入并出的cput处理模型,本质上还是串行收发) 2:在某些特殊场合,例如制定较复杂的协议时,可以使用fifo特性来做协议简化,比如一包 数据包含8个字节,(并且fifo设置的长度为8),这样相当于把uart转换为类似CAN/以太网模型, 这样信息可扩展性得到了质的提高,当然,这里需要同步协调。 fifo分析拓展: 1. 如果要用中断来处理接收到的数据,就是说,接收完数据然后产生中断,再于中断里处理接收的数据。如果要实现这个本意,要设置好触发点。 至于超时中断之类,那是另外一回事了。 2. 就UART的中断类型
[单片机]
<font color='red'>s3c2440</font>串口裸板<font color='red'>驱动</font>(使用fifo)
S3C2440裸机------Nor Flash编程_识别
1.编写菜单程序 首先我们编写一个测试菜单程序,用来获取norFlash信息以及对NorFlash进行读写操作,代码如下: void nor_flash_test(void) { char c; while (1) { /* 打印菜单, 供我们选择测试内容 */ printf( Scan nor flashnr ); printf( Erase nor flashnr ); printf( Write nor flashnr ); printf( Read nor flashnr ); printf( quitnr ); printf( Enter selection:
[单片机]
<font color='red'>S3C2440</font>裸机------Nor Flash编程_识别
基于S3C2440处理器和WinCE的智能车载仪表设计
  随着高性能电子显示技术的发展,汽车仪表电子化的程度越来越高。国内外已开发出了多功能全电子显示仪表、平视显示仪表、汽车导航系统、行车记录仪等高技术产品。未来,车用电子化嵌入式仪表具有以下优点:提供大量复杂的信息,使汽车的电子控制程度越来越高;满足小型、轻量化的要求,使有限的驾驶空间更人性化;高精度和高可靠性实现汽车仪表的电子化,降低了故障的发生率;设有在线故障诊断系统,一旦汽车发生故障,可以找到故障来源,方便维修;外形设计自由度高,汽车仪表盘造型美观。基于以上优点,汽车会越来越多地采用各种用途的电子化仪表。造型新颖、功能强大的嵌入式电子化仪表将是今后车用仪表的发展趋势和潮流。    1 智能车载仪表系统结构   本智能车载仪
[单片机]
基于<font color='red'>S3C2440</font>处理器和WinCE的智能车载仪表设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved