您的位置:首页 > 运维架构 > Shell

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

2008-05-23 10:41 661 查看




以我的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

d5b4
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息