在嵌入式开发平台中实现USB设备的自动挂载

字体变小 字体变大

  以我的xmu168项目为例。下面做一下简单的介绍,希望以后自己再动手做的时候,会比较快地回忆起来。同时也希望能对网络上的朋友提供帮助。

       在这里的USB设备主要指的是一般的U盘。我的程序全是用shell 实现的,原来应用的平台是linux redhat9.0,现在改在嵌入式设备上。因些要求嵌入式设备的busybox支持一些简单的shell命令,如:echo, grep [最好有-r 参数],killall, cat等。

       在介绍原理的东西前,先说明一下下面几个源文件的作用。

1.       hotplugusb.sh 这个是开机时运行的,主要是告诉系统,当检测到有USB设备插入或者拔出时,去执行的哪一个文件。其内容如下:

 echo "/mnt/pchome/usb/xmu_usb/usb.sh" > /proc/sys/kernel/hotplug

有的嵌入式系统没有/proc/sys/kernel/hotplug 选项,这是因为在编译内核时没有指定支持hotplug。 这个选项可在General setup->CONFIG_HOTPLUG中指定。

 2.       usb.sh是硬件检测到有USB设备插入或者拔出时,执行的文件。根据硬件提供的三种情况:1)开机时;2)设备插入时;3)设备拔出时去执行不同的shell脚本

3.       usb_mount.sh是检测到设备插入时执行的shell脚本。

4.       usb_umount.sh是检测到设备拔出时执行的shell脚本。

 5.     loop_open.sh主要是输出一些调试信息

下面分别是插入和拔出的流程图。

查看更多精彩图片

查看更多精彩图片

下面是源代码

1.usb.sh

#!/bin/sh

log=/mnt/pchome/usb/xmu_usb/log
path=/mnt/pchome/usb/xmu_usb
#killall usb_mount_add

#function func_onlyone_usb()
func_onlyone_usb()
{
        USB_NUM=` grep "Attached: Yes" /proc/scsi/usb-storage-0/0 -c`
        if [ $USB_NUM -eq 1 ];then
                #mount usb-storyage
                echo "find only one usb-storage!" >> $log
                return 1
        else
                #do not mount usb any more
                echo "find too many usb-storage!" >> $log
                return 0
        fi
}


cat /dev/null >$log

echo "start" >>$log

case $1 in
        start)
 cd $path
        ./usb_mount.sh sda
        ;;
        usb)
        case $ACTION in
                remove)
         if grep "Attached: Yes" /proc/scsi/usb-storage-0/0 > /dev/null
         then
                 exit 1
         fi
  echo "killall usb_umount" >> $log
  killall usb_umount
  echo "killall loop_open" >> $log
  killall loop_open
  echo "killall usb_mount_start" >> $log
  killall usb_mount_start
  echo "remove" >> $log
                cd $path
  ./usb_umount.sh sda
                ;;
                add)
  if func_onlyone_usb
         then
                 echo "exit" >> $log
                       exit 1
         fi
  
  if grep "Attached: No" /proc/scsi/usb-storage-0/0 > /dev/null
                then
                 exit 1
                fi
  
  echo "killall usb_umount" >> $log
  killall usb_umount
  echo "killall loop_open" >> $log
                killall loop_open
  echo "killall usb_mount_start" >> $log
                killall usb_mount_start
  echo "add" >> $log
                cd  $path
  ./usb_mount.sh sda
                ;;
                *)
                exit 1
                ;;
        esac
        ;;
        *)
        exit 1
        ;;
esac


2)usb_mount.sh

#!/bin/sh

logtxt=/mnt/pchome/usb/xmu_usb/log

echo "usb_mount_start:start" >> $logtxt

#function func_fdisk()
func_fdisk()
{
        if [ $# -ne 1 ];then
                echo "func_fdisk: the arguement wrong."
                exit 1
        fi
        DETAIL=$(fdisk /dev/$1 -l)
 echo "$DETAIL" >> $logtxt
        if [ "$DETAIL" != "" ]
        then
  echo "1" >> $logtxt
                return 0
        fi
 echo "2" >> $logtxt
 return 1
}

#function func_mount()
func_mount()
{
        #func_mount sda
        if [ $# -ne 1 ];then
                echo "func_mount,the arguement wrong." >> $logtxt
                exit 1
        fi
 echo "mkdir /mnt/$1" >> $logtxt
        mkdir /mnt/$1
 echo "mount /dev/$1 /mnt/$1" >> $logtxt
        if mount /dev/$1 /mnt/$1
        then
                echo "Successfully,mount /dev/$1" >> $logtxt
                #open the $1 with loop
                return 0
        else
  echo "rm -rf /mnt/$1" >> $logtxt
                rm -rf /mnt/$1
                return 1
        fi
}

#function func_mount_usb()
func_mount_usb()
{
        #mount all disks of the usb-storage
        for fdiskindex in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
        do
                if echo $DETAIL | grep $1$fdiskindex > /dev/null
                then
   echo "func_mount $1$fdiskindex" >> $logtxt
                        func_mount $1$fdiskindex
                fi
        done
        #open the $1 with loop
        return 0
}

#function mount_usb_storage()
mount_usb_storage()
{
        #findueb-storage
        while :
        do
  echo "func_mount $1" >> $logtxt
                if func_mount $1
                then
                        #open $1 with loop
   echo "./loop_open" >> $logtxt
                        ./loop_open &
                        exit 0
                fi
                                         
  echo "func_fdisk $1" >> $logtxt
                if func_fdisk $1
                then
                        break
                fi
  echo "sleep 1" >> $logtxt
                sleep 1
        done
                            
 echo "func_mount_usb $1" >> $logtxt
        if func_mount_usb $1
        then
  echo "./loop_open" >> $logtxt
                ./loop_open &
                exit 0
        fi
}

if grep "Attached: No" /proc/scsi/usb-storage-0/0 > /dev/null
then
 exit 1
fi
echo "Attached: Yes" >> $logtxt

## Go to make sure whether sda is already mounted
while :
do
 echo "MOUNTDETAIL=`mount`" >> $logtxt
        MOUNTDETAIL=`mount`
        if ! echo $MOUNTDETAIL | grep $1  >> /dev/null
        then
                break
        fi
 echo "sleep 1" >> $logtxt
        sleep 1
done
echo "mount_usb_storage $1" >> $logtxt
mount_usb_storage $1

3)usb_umount.sh

#!/bin/sh

logtxt=/mnt/pchome/usb/mtk_usb/log

echo "usb_umount:start" >> $logtxt

#function func_umount()
func_umount()
{
        if [$# -ne 1 ]
        then
                echo "func_umount, the arguement wrong." >> $logtxt
                exit 1
        fi
        if umount /dev/$1
        then
                echo "Successfully,umount /dev/$1" >> $logtxt
                rm -rf /mnt/$1
                #return to func_mount
                return 0
        else
                return 1
        fi
}

#function func_umount_usb()
func_umount_usb()
{
        #umount sda
        MOUNTDETAIL=`mount`
        for fdiskindex in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
        do
                if echo $MOUNTDETAIL | grep "$1${fdiskindex}"  >> /dev/null
                then
                        func_umount $1$fdiskindex
                fi
        done
}

#function func_remove_usbstorage()
func_remove_usbstorage()
{
        while :
        do
  echo "func_umount $1" >> $logtxt
                func_umount $1
                echo "func_umount_usb $1" >> $logtxt
  func_umount_usb $1
  echo "MOUNTDETAIL=`mount`" >> $logtxt
                MOUNTDETAIL=`mount`
                if ! echo $MOUNTDETAIL | grep $1  >> /dev/null
                then
   echo "rmmod usb-storage" >> $logtxt
#                        rmmod usb-storage
   echo "insmod usb-storage" >> $logtxt
#                        insmod /root/usb-storage.o
                        return 0
                fi
  echo "" >> $logtxt
                sleep 1
        done
}
echo "func_remove_usbstorage $1" >> $logtxt
func_remove_usbstorage $1

4)loop_open.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define USB_STAT /tmp/usbstat

int main()
{
 int open_result;
 FILE *fp;
    int usb_stat = -1;
  
    system("echo 0 > /tmp/usbstat");

 while(1)
 {
  system("echo /"open/" >> /mnt/pchome/usb/xmu_usb/log");
  open_result=open("/dev/sda", O_RDONLY);
  printf("open_result=%d/n",open_result);
  close(open_result);
  
  if(open_result == -1)
  {
   system("echo /"open_result == -1/" >> /mnt/pchome/usb/xmu_usb/log");
   system("echo 0 > /tmp/usbstat");
   system("echo /"./usb_umount sda/" >> /mnt/pchome/usb/xmu_usb/log");
            system("./usb_umount sda");
   system("echo /"./usb_mount_start sda &/" >> /mnt/pchome/usb/xmu_usb/log");
   system("./usb_mount_start sda &");
   return 1;
  }
  
  if ((fp=fopen("/tmp/usbstat","r"))==NULL)
        {
   printf("error/n");
   exit(0);
        }

  fscanf(fp,"%d",&usb_stat);
  fclose(fp);
 
  if(usb_stat==1)
  {
   system("echo /"usb_stat==1/" >> /mnt/pchome/usb/xmu_usb/log");
   system("echo 0 > /tmp/usbstat");
   system("echo /"./usb_umount sda/" >> /mnt/pchome/usb/xmu_usb/log");
   system("./usb_umount sda");
   system("echo /"./usb_mount_start sda &/" >> /mnt/pchome/usb/xmu_usb/log");
   system("./usb_mount_start sda &");
   return 0; 
  }
  sleep(1);
 }
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值