在n32926上面用g_file_storage.ko可以实现虚拟U盘功能。
基本操作没有问题,但是存在一个同步问题,比如,在pc端对某文件进行了删除操作,此时如果不重新插拔,在arm端仍然会认为该文件存在。
是不是g_file_storage设计上就是这样的?还是有什么办法设置下,让文件删除、修改等操作能立即同步到arm端?
离线
我看nuvoton sdk里面的方法首先是unmount掉SD卡,然后再执行insmod /usr/g_file_storage.ko file=/dev/mmcblk0p1 removable=1,相当于是直接禁止arm端访问了。
如果要同时访问,该怎么操作?
离线
这篇文章也这是提到了这个问题,并没有很好解决。arm端并不知道pc端什么时候会修改卡里面的内容
离线
早期的Android确实是这么干,pc连上手机后,直接就禁止访问外置卡了
离线
看来这个方式只能尽量避免了。
昨天查了下hotplug相关资料,发现基本上针对usb host挂载wifi、u盘之类的应用。不知道针对usb slave是怎么实现hotplug的?
我尝试使用网上提到的NETlink方式截获内核消息,在虚拟机上试验,能截获到U盘插拔动作。在arm linux端试验,无法截获usb slave的插拔。不知道是不是内核配置问题?
int main(void)
{
struct sockaddr_nl clt;
struct timeval t1;
fd_set fd;
int buf_size = 2048, len, ret, usb_test;
//创建套接字
usb_test = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
memset(&clt, 0, sizeof(clt));
clt.nl_pid = getpid();
clt.nl_family = AF_NETLINK;
clt.nl_groups = 1;
setsockopt(usb_test, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(buf_size));
//绑定套接字
bind(usb_test, (struct sockaddr*)&clt, sizeof(clt));
while (1)
{
char buf[2048];
memset(&buf,0,sizeof(buf));
FD_ZERO(&fd);
FD_SET(usb_test, &fd);
//监测频率周期
t1.tv_sec = 0;
t1.tv_usec = 50 * 1000;
//监测
ret = select(usb_test + 1, &fd, NULL, NULL, &t1);
if(ret < 0)
continue;
if(!(ret > 0 && FD_ISSET(usb_test, &fd)))
continue;
len = recv(usb_test, &buf, sizeof(buf), 0);
if (len > 0)
{
printf("%s\n", buf);//打印收到的数据
}
}
close(usb_test);
return 0;
}
离线
这个应该也是arm usb做主机吧? 我那个是做从机
离线