高通平台开发系列讲解(USB篇)port_bridge转发应用分析

简介: 高通平台开发系列讲解(USB篇)port_bridge转发应用分析

1676037776166.jpg

本篇章主要介绍高通平台USB数据转发给modem流程。


一、图解port_bridge作用


port_bridge的功能是将从USB接受到的数据转发至SMD,该阶段在linux debug口上进行排查,通过分析port_bridge进程的状态及执行log,定位问题发生位置。

1675933907983.jpg


二、port_bridge入口分析


目录:apps_proc/data/port-bridge/port_bridge.c

int main()
{
  pthread_t mdm_thread, usb_thread;
  thread_info_t mdm_info, usb_info;
 /* MDM -> USB info object */
  mdm_info.from_fd        = &mdm_fd;
  mdm_info.to_fd          = &usb_fd;
  mdm_info.to_file_path   = targetinfo.usb_chardev;
  mdm_info.from_file_path = targetinfo.mdm_chardev;
  mdm_info.to_mutex       = &usb_mutex;
  mdm_info.from_mutex     = &mdm_mutex;
  /* USB -> MDM info object */
  usb_info.from_fd        = &usb_fd;
  usb_info.to_fd          = &mdm_fd;
  usb_info.from_file_path = targetinfo.usb_chardev;
  usb_info.to_file_path   = targetinfo.mdm_chardev;
  usb_info.to_mutex       = &mdm_mutex;
  usb_info.from_mutex     = &usb_mutex;
  pthread_create(&mdm_thread, NULL, targetinfo.mdm_handler, &mdm_info);
  pthread_create(&usb_thread,  NULL, usb_to_modem_bridge, &usb_info);
  pthread_join(mdm_thread,  NULL);
  pthread_join(usb_thread,   NULL);
}


三、usb_to_modem_bridge线程


USB -> MDM这里操作的 glink_pkt

void* usb_to_modem_bridge(void* thread_info)
{
  thread_info_t tinfo   = *((thread_info_t*)thread_info);
  while (1)
  {
    /* ####### OPEN THE USB FILE ####### */
    if (*tinfo.from_fd < 0)
    {
        temp_fd = open(tinfo.from_file_path, O_RDWR);  /* Custom blocking open */
    }
    while (glink_rx_intent_count < GLINK_RX_INTENT_MIN)
    {
      unsigned int rx_packet_max_size = MAX_MSG_SIZE;
      LOGI("Queuing RX Intent for '%s'\n", tinfo.from_file_path);
      PB_PTHREAD_MUTEX_LOCK(tinfo.from_mutex, tinfo.from_file_path);
      ret = ioctl(*tinfo.from_fd, GLINK_PKT_IOCTL_QUEUE_RX_INTENT, &rx_packet_max_size);
      PB_PTHREAD_MUTEX_UNLOCK(tinfo.from_mutex, tinfo.from_file_path);
      if (ret)
      {
        LOGE("Error queuing RX intent=%d\n", ret);
        exit(1);
      }
      glink_rx_intent_count++;
    }
    // At this point it's open, so poll for anything we need to do
    pollinfo.revents = 0;
    LOGI("Attempting to poll '%s'...\n", tinfo.from_file_path);
    ret = poll(&pollinfo, 1, -1); // -1 timeout specifies infinite block (default linux behavior)
    LOGR(ret, "poll on '%s' returned %i\n", tinfo.from_file_path, ret);
}


四、/dev/at_mdm0处理AT指令


前面分析到port_bridge进程会将从PC发过来的数据写入到/dev/at_mdm0中,那么这个过程又是怎样的呢?/dev/at_mdm0驱动代码位于drivers/soc/qcom/glink_pkt.c,写入的时候最终会调用glink_pkt_write, glink_pkt_write的流程如下:

ssize_t glink_pkt_write(struct file *file, const char __user *buf,
                        size_t count, loff_t *ppos)
{
        struct glink_pkt_device *gpdev = file->private_data;
        void *kbuf;
        int ret;
        gpdev = file->private_data;
        if (!gpdev || refcount_read(&gpdev->refcount) == 1) {
                GLINK_PKT_ERR("invalid device handle\n");
                return -EINVAL;
        }
        GLINK_PKT_INFO("begin to %s buffer_size %zu\n", gpdev->ch_name, count);
        kbuf = memdup_user(buf, count);
        if (IS_ERR(kbuf))
                return PTR_ERR(kbuf);
        if (mutex_lock_interruptible(&gpdev->lock)) {
                ret = -ERESTARTSYS;
                goto free_kbuf;
        }
        if (!completion_done(&gpdev->ch_open) || !gpdev->rpdev) {
                GLINK_PKT_ERR("%s channel in reset\n", gpdev->ch_name);
                ret = -ENETRESET;
                goto unlock_ch;
        }
        if (file->f_flags & O_NONBLOCK)
                ret = rpmsg_trysend(gpdev->rpdev->ept, kbuf, count);
        else
                ret = rpmsg_send(gpdev->rpdev->ept, kbuf, count);
unlock_ch:
        mutex_unlock(&gpdev->lock);
free_kbuf:
        kfree(kbuf);
        GLINK_PKT_INFO("finish to %s ret %d\n", gpdev->ch_name, ret);
        return ret < 0 ? ret : count;
}
相关文章
高通平台开发系列讲解(USB篇)USB端口的说明及切换方法
高通平台开发系列讲解(USB篇)USB端口的说明及切换方法
466 0
高通平台开发系列讲解(USB篇)USB端口的说明及切换方法
|
2月前
|
负载均衡 安全 数据安全/隐私保护
|
网络协议 Android开发
|
安全 网络安全 数据安全/隐私保护
计算机网络实验(思科模拟器Cisco Packet Tracer)——无线路由和防火墙配置
计算机网络实验(思科模拟器Cisco Packet Tracer)——无线路由和防火墙配置
计算机网络实验(思科模拟器Cisco Packet Tracer)——无线路由和防火墙配置
|
网络架构
计算机网络实验(思科模拟器Cisco Packet Tracer)——路由器配置
计算机网络实验(思科模拟器Cisco Packet Tracer)——路由器配置
计算机网络实验(思科模拟器Cisco Packet Tracer)——路由器配置
|
网络虚拟化 iOS开发
计算机网络实验(思科模拟器Cisco Packet Tracer)——交换机配置以及虚拟局域网VLAN
计算机网络实验(思科模拟器Cisco Packet Tracer)——交换机配置以及虚拟局域网VLAN
计算机网络实验(思科模拟器Cisco Packet Tracer)——交换机配置以及虚拟局域网VLAN
|
运维 安全 网络协议
WLAN无线局域网技术 基础(一)WLAN与WIFI的关系,基本的WLAN组网方式,胖AP和瘦AP各自的特点和适用场景
WLAN即Wireless LAN(无线局域网),是指通过无线技术构建的无线局域网络。WLAN广义上是指以无线电波、激光、红外线等无线信号来代替优先局域网中的部分或全部传输介质所构成的网络。通过WLAN技术,用户可以方便地接入到无线网络,并在无线网络覆盖区域内自由移动,彻底摆脱有线网络的束缚。几台设备连接到同一台AP上,是可以实现设备的互访的。无线相对于有线来说更不安全,所以无安全不无线,做无线是一般会对数据进行加密处理,对接入的设备进行验证。
WLAN无线局域网技术 基础(一)WLAN与WIFI的关系,基本的WLAN组网方式,胖AP和瘦AP各自的特点和适用场景
|
网络架构
Cisco Packet Tracker教程:主机直接互联、DHCP配置互联
利用Cisco Packet Tracer实现了主机直接互联通信,通过路由器建立DHCP池分配给主机IP进行通信。
994 1
Cisco Packet Tracker教程:主机直接互联、DHCP配置互联
|
数据采集 监控 网络协议
STM32F103:RTOS设备通过TCP模组上云
本实践案例介绍使用物联网平台提供的C语言设备端SDK,将搭载实时操作系统(RTOS)的微控制单元(MCU)的设备接入阿里云物联网平台。 原有的工业自动化设备、数据采集设备、实时控制设备、家电等使用的是搭载实时操作系统(RTOS)的微控制单元(MCU)。在对此类设备进行物联网改造时,可以使用阿里云物联网平台提供的C语言设备端SDK,将此类设备接入物联网平台。
23973 0
STM32F103:RTOS设备通过TCP模组上云