JZ2440 3G上网卡3_编程自动确认拨号端口学习笔记

目的:当识别出/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加入我们想自动装载的驱动程序





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷忆枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值