3G上网卡3

xiaoxiao2021-02-28  73

目的:当识别出/dev/ttyUSB...后, 它创建一个链接文件/dev/gsmmodem指向拨号时要用的/dev/ttyUSB

1、do_link函数

/*   * 创建/dev/gsmmodem链接, 指向某个/dev/ttyUSBX  * 3g_manager link ttyUSB0,1,2  */ int do_link(int argc, char **argv) {     char cmdBuf[1024];     int index;     int i;          /*      * 如果有多个/dev/ttyUSBX有中断类型端点,       * 则/dev/gsmmodem指向最小的/dev/ttyUSBX      */

 3g_manager link ttyUSB0,1,2     sscanf(argv[2]+6, "%d", &index);//读入数值存在index中     for (i = 0; i <= index; i++)     {

//如果有中断端点,把原来的链接文件删掉,再创建1个新的链接文件         if (hasInterruptEndpoint(i))         {

//利用ln创建链接文件,-s表示软连接,-d表示硬链接

//ln -s 源文件 目标文件             sprintf(cmdBuf, "ln -s /dev/ttyUSB%d /dev/gsmmodem", i);//打印信息             system("rm -f /dev/gsmmodem");//先删除文件, -f --force 强制删除             system(cmdBuf);//重新进行链接             return 0;         }     }     return -1; }

2、判断中断类型端点函数

/*  * 判断/dev/ttyUSB'index'是否有中断类型的endpoint

查看 /usr/sbin/usb_modeswitch_dispatcher,搜索ttyUSB  */ int hasInterruptEndpoint(int index) {     /* 1. 对于每一个/dev/ttyUSBX      *    都有一个对应的/sys/class/tty/ttyUSBX      * 2. 它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0      * 3. 进入/sys/......../1-1:1.0/目录,      *    里面有多个"ep_"的子目录      * 4. 子目录里有名为type的文件      * 5. 如果这个文件的内容为Interrupt, 则返回1      *          */     char tmpBuf[1024];     char tmpBuf2[1024];     int cnt;     char *ptr;     DIR *dir;     struct dirent *entry;     int fd;     sprintf(tmpBuf, "/sys/class/tty/ttyUSB%d", index);//打印目录

ssize_t readlink(const char *path, char *buf,size_t bufsiz);

readlink()会将参数path的符号链接内容存储到参数buf所指的内存空间     cnt = readlink(tmpBuf, tmpBuf2, 1024);//会把tmpBuf存的路径所指向的真实路径存在tmpBuf2里面

它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0

//如果错误返回     if (cnt == -1)     {         return 0;     }     else     {

        tmpBuf2[cnt] = '\0';//成功后cnt是  tmpBuf2里存放的字节数     }

* 2. 它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0     /sys/class/tty/

    sprintf(tmpBuf, "/sys/class/tty/%s", tmpBuf2);/* tmpBuf: /sys/devices/platform/s3c2410-ohci/usb1/1-1/1-1:1.3/ttyUSB2/tty/ttyUSB2 */

char * strstr(char * str1,char * str2);功能就是找出在字符串str1中第一次出现字符串str2的位置(也就是说字符串sr1中要包含有字符串str2),找到就返回该字符串位置的指针(也就是返回字符串str2在字符串str1中的地址的位置),找不到就返回空指针(就是 null)。     ptr = strstr(tmpBuf, "/ttyUSB");//搜到 /ttyUSB     if (!ptr)     {         return 0;     }

 * 3. 进入/sys/......../1-1:1.0/目录,

    里面有多个"ep_"的子目录     tmpBuf[ptr-tmpBuf] = '\0';  /* tmpBuf: /sys/......../1-1:1.0 */     //printf("Dir: %s\n", tmpBuf); // 打开/sys/......../1-1:1.0/目录,     dir = opendir(tmpBuf);     if (!dir)     {         printf("can not open %s\n", tmpBuf);         return 0;     }

//读取目录里面的每1项     while((entry = readdir(dir)))     {

//匹配名字,匹配3个字符         if (strncasecmp(entry->d_name, "ep_", 3) == 0)         {

//tmpBuf2= tmpBuf(目录)+entry->d_name(名字)+type             sprintf(tmpBuf2, "%s/%s/type", tmpBuf, entry->d_name);             //printf("type: %s\n", tmpBuf2);

//打开文件             fd = open(tmpBuf2, O_RDONLY);             if (fd < 0)             {                 printf("can not open %s\n", tmpBuf2);                 return 0;             }

//读取里面的内容             read(fd, tmpBuf2, 1024);             //printf("endpoint: %s\n", tmpBuf2);

//内容判断(如果是interrupt代表的是中断类型端点)             if (!strncmp(tmpBuf2, "Interrupt", 9))             {                 return 1;//找到要找的东西             }             close(fd);         }     }     return 0; }

3、实验

(1)自动拨号功能

在/etc/mdev.conf里面

因为当出现ttyUSBx后调用3g_manager link  $MDEV

(2)怎么判断ttyUSB有无中断类型的端点

查看 /usr/sbin/usb_modeswitch_dispatcher,搜索ttyUSB

 /* 1. 对于每一个/dev/ttyUSBX      *    都有一个对应的/sys/class/tty/ttyUSBX

2. 它是一个链接文件, 指向: /sys/......../1-1:1.0/ttyUSB0/tty/ttyUSB0  * 3. 进入/sys/......../1-1:1.0/目录,  *    里面有多个"ep_"的子目录  * 4. 子目录里有名为type的文件  * 5. 如果这个文件的内容为Interrupt, 则返回1

接上3G上网卡到开发版上,会自动切换成USB串口

安装驱动程序

查看设备节点

对于每1个串口,是 1个链接文件,cd ../.. 就是回到上两级

 进入目录下 1-1:1.0中第1个表示第1个USB HUB,第2个1表示hub里面的第1个端口,第3个1表示设备,第4个0表示接口;

查看里面有很多端点

type表示端点的类型,Bulk是批量端点

到别的接口

找到中断类型端点,拨号时使用ttyUSB2

(3)手动执行

查看设备节点

  编译3g_manager并拷贝到文件系统

执行

拨号

把生成的文件拷贝到/etc/resolv.conf目录下

这里的/etc/resolv.conf是设置DNS服务器的IP地址及DNS域名

接上联通卡,自动切换成USB 串口,也会创建连接文件

进行拨号

 拷贝生成的resolv文件,ping其他网址

修改/etc/init.d/rcS加入我们想自动装载的驱动程序

转载请注明原文地址: https://www.6miu.com/read-74910.html

最新回复(0)