高通平台 支持通过uart唤醒系统, 前提是使用高速串口驱动,即msm_serial_hs.c ,这个驱动中是将rx配置成

这里简单列下高速串口的配置过程。

打开驱动宏控:

kernel/arch/arm/configs/msm8909-1gb_defconfig+CONFIG_SERIAL_MSM_HS=y

添加 高速串口配置

修改 kernel/arch/arm/boot/dts/qcom/msm8909.dtsi

+blsp1_uart2:  uart@78b0000  {
+       compatible  =  "qcom,msm-hsuart-v14";
+       reg  =  <0x78b0000  0x200>,
+             <0x7884000  0x23000>;
+       reg-names  =  "core_mem",  "bam_mem";
+       interrupt-names  =  "core_irq",  "bam_irq",  "wakeup_irq";
+       #address-cells  =  <0>;
+       interrupt-parent  =  <&blsp1_uart2>;
+       interrupts  =  <0  1  2>;
+       #interrupt-cells  =  <1>;
+       interrupt-map-mask  =  <0xffffffff>;
+       interrupt-map  =  <0  &intc  0  108  0
+                       1  &intc  0  238  0
+                       2  &msm_gpio  21  0>;
+       qcom,bam-tx-ep-pipe-index  =  <2>;
+       qcom,bam-rx-ep-pipe-index  =  <3>;
+       qcom,master-id  =  <86>;
+       clocks  =  <&clock_gcc  clk_gcc_blsp1_uart2_apps_clk>,
+       <&clock_gcc  clk_gcc_blsp1_ahb_clk>;
+       clock-names  =  "core_clk",  "iface_clk";
+       qcom,msm-bus,name  =  "blsp1_uart";
+       qcom,msm-bus,num-cases  =  <2>;
+       qcom,msm-bus,num-paths  =  <1>;
+       qcom,msm-bus,vectors-KBps  =
+       <86  512  0  0>,
+       <86  512  500  800>;
+      qcom,rx-char-to-inject = <0xFD>;
+      qcom,inject-rx-on-wakeup;
+       pinctrl-names  =  "sleep",  "default";
+       pinctrl-0  =  <&hsuart_sleep>;
+       pinctrl-1  =  <&hsuart_active>;
+       status  =  "ok";
+}; 

添加pinctrl 配置:

kernel/arch/arm/boot/dts/qcom/msm8909-pinctrl.dtsi

+        blsp1_uart2_active  {
+               qcom,pins  =  <&gp  20>,  <&gp  21>;
+               qcom,num-grp-pins  =  <2>;
+               qcom,pin-func  =  <3>;
+               label  =  "blsp1_uart2_active";
+               hsuart_active:  default  {
+               drive-strength  =  <16>;
+               bias-disable;
+               };
+       };
+       blsp1_uart2_sleep  {
+               qcom,pins  =  <&gp  20>,  <&gp  21>;
+               qcom,num-grp-pins  =  <2>;
+               qcom,pin-func  =  <0>;
+               label  =  "blsp1_uart2_sleep";
+               hsuart_sleep:  sleep  {
+               drive-strength  =  <2>;
+               bias-disable;
+               };
+       }; 

下面简单描述下,uart唤醒系统的实现,在上述的高速串口驱动,有如下的配置选项:

+        blsp1_uart2_active  {
+               qcom,pins  =  <&gp  20>,  <&gp  21>;
+               qcom,num-grp-pins  =  <2>;
+               qcom,pin-func  =  <3>;
+               label  =  "blsp1_uart2_active";
+               hsuart_active:  default  {
+               drive-strength  =  <16>;
+               bias-disable;
+               };
+       };
+       blsp1_uart2_sleep  {
+               qcom,pins  =  <&gp  20>,  <&gp  21>;
+               qcom,num-grp-pins  =  <2>;
+               qcom,pin-func  =  <0>;
+               label  =  "blsp1_uart2_sleep";
+               hsuart_sleep:  sleep  {
+               drive-strength  =  <2>;
+               bias-disable;
+               };
+       }; 

这里配置了gpio21(rq)可唤醒中断。

qcom,rx-char-to-inject = <0xFD>;qcom,inject-rx-on-wakeup;

这个配置是在中断触发后,像tty上添加一个字节,内容为 0xfd, 它的作用 后面会做描述:

在驱动中对这个中断的处理:

中断申请:


static int msm_hs_startup(struct uart_port *uport)
{if (is_use_low_power_wakeup(msm_uport)) {ret = request_threaded_irq(msm_uport->wakeup.irq, NULL,msm_hs_wakeup_isr,IRQF_TRIGGER_FALLING | IRQF_ONESHOT,"msm_hs_wakeup", msm_uport);if (unlikely(ret)) {MSM_HS_ERR("%s():Err getting uart wakeup_irq\n",__func__);goto free_uart_irq;}msm_uport->wakeup.freed = false;disable_irq(msm_uport->wakeup.irq);msm_uport->wakeup.enabled = false;ret = irq_set_irq_wake(msm_uport->wakeup.irq, 1);if (unlikely(ret)) {MSM_HS_ERR("%s():Err setting wakeup irq\n", __func__);goto free_uart_irq;}}

中断处理函数:

static irqreturn_t msm_hs_wakeup_isr(int irq, void *dev)
{unsigned int wakeup = 0;unsigned long flags;struct msm_hs_port *msm_uport = (struct msm_hs_port *)dev;struct uart_port *uport = &msm_uport->uport;struct tty_struct *tty = NULL;msm_hs_resource_vote(msm_uport);spin_lock_irqsave(&uport->lock, flags);MSM_HS_DBG("%s(): ignore %d\n", __func__,msm_uport->wakeup.ignore);if (msm_uport->wakeup.ignore)msm_uport->wakeup.ignore = 0;elsewakeup = 1;/* 这里根据 设备树中是否 设置了qcom,inject-rx-on-wakeup 来决定是否 插入 0xfd 这个字节*/if (wakeup) {/** Port was clocked off during rx, wake up and* optionally inject char into tty rx*/if (msm_uport->wakeup.inject_rx) {tty = uport->state->port.tty;tty_insert_flip_char(tty->port,msm_uport->wakeup.rx_to_inject,TTY_NORMAL);MSM_HS_DBG("%s(): Inject 0x%x", __func__,msm_uport->wakeup.rx_to_inject);}}spin_unlock_irqrestore(&uport->lock, flags);msm_hs_resource_unvote(msm_uport);if (wakeup && msm_uport->wakeup.inject_rx)tty_flip_buffer_push(tty->port);return IRQ_HANDLED;
}

当RX 上有数据时,有电平变化,会触发中断,在中断处理函数中,可以唤醒系统。

默认状态下,系统需要休眠时,需要关闭打开的串口进入 suspend状态,这时rx 就是一个可以唤醒系统的gpio;

如果靠从设备发过来的数据来触发中断唤醒系统,这时系统还未打开串口,当前的数据内容一定会丢失,所以在需要唤醒系统前,从设备应当与系统进行简单的握手来确保各自的状态再进行接下来的通讯内容。

高通平台上,默认支持了一种,用于uart蓝牙从设备来唤醒系统的, 默认驱动中添加的 0xfd的作用也是用作次目的。 下面是高通平台 蓝牙从设备与系统的通讯的过程框图。

Wake         - This byte is used to wake up the device which has to receive the data
Wake ack   - This byte is used as an acknowledgement to the wake byte, meaning I am ready to receive
Sleep         - This byte is sent to the other device when it has no data to send

软件逻辑是如此,如果要使用uart唤醒系统,可以借鉴参考这个流程,从设备可编程,与主机通讯握手(可自定义细节)成功后,再收发数据。

qcom高速串口调试相关推荐

  1. 高通QM215 高速串口调试总结

    高通QM215 高速串口调试总结 参考文档 硬件和复用情况确认 修改如下 串口调试 测试程序代码: 将串口设置为高速串口,AP端收到的数据一直为0XFD 参考文档 1.sp80-pk881-6_a_q ...

  2. android spi串口调试,PIC入门3,SPI通信和串口调试实验

    原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...

  3. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04【EC20模组SIM卡和驻网模组指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04[EC20模组SIM卡和驻网模组指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 关于SIM ...

  4. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03EC20模组基础串口指令说明

    本系列博文将系统性讲解物联网模组系列的实际使用和调试指南,以移远4G模组EC20为例(其他厂家模组的调试方法大同小异),加快嵌入式软.硬件工程师对物联网模组调试和使用的上手速度. 一.准备工作 1.软 ...

  5. DIY一款4路USB转TTL串口调试模块

    目录 1.电源设计 2.USB集线器设计 3.USB转TTL设计 4.模块效果 最近调测程序经常用到单片机的三个串口同时交互通信,我使用1路USB转TTL串口调试模块不断切换,不仅影响观察效果,更是劳 ...

  6. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05【EC20模组TCP/IP模块AT指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05[EC20模组TCP/IP模块AT指令说明] Socket长连接 一.准备工作 二.针对TCP/IP协议 关于TCP/ ...

  7. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03【EC20模组基础串口指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03[EC20模组基础串口指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 STM32F103学 ...

  8. STM32H743多路串口调试经验总结(HAL库)

    STM32H743多路串口调试经验总结(HAL库) 一.硬件基础 1.STM3H743核心板 2.自制串口拓展板(控制485收发使用的TDHx01D485H2隔离模块,该模块EN为低电平是发送,高电平 ...

  9. 【Windows10调教】注册表法一键修改COM口属性,使串口调试显示更直观

    ---------------- 注册表法一键修改COM口属性,使串口调试显示更直观 ---------------- 一.问题 在进行嵌入式软件开发时,我们经常会使用串口助手工具来调试打印消息,毕竟 ...

最新文章

  1. ABAP 数字处理相关内容备注
  2. HDU4353(找一个三角形面积与它里面包含点的比值最小)
  3. Tax debug and BP number external generation
  4. nodeJs利用mongoose模块操作数据
  5. Android Service基本使用
  6. 贾跃亭吹过的牛,苹果来实现?
  7. Git教程——回到从前 (checkout 针对单个文件)
  8. flink sql设置并行度_Flink原理——任务调度原理
  9. 干货 | 平面设计、UI 设计和视觉设计的区别
  10. jDBC连接mysql数据库的5种方式
  11. js 获取指定日期的前几天日期或后几天日期
  12. 解析函数论 Page 22 达朗贝尔判别法 VS 柯西判别法
  13. 测试用例评审的旁观记录
  14. 恩兔NS-1刷ARMBIAN教程
  15. 图解windows系统 硬盘主分区、扩展分区、逻辑分区的区别.
  16. java毕业设计芮城县十全十美火锅店点餐系统源码+lw文档+mybatis+系统+mysql数据库+调试
  17. Android,firefly3399开发板,arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  18. 写代码:假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?...
  19. antlr (updating)
  20. 星载SAR成像处理——轨道根数

热门文章

  1. js 弹出确认 取消对话框
  2. 中国工业设计行业市场现状及投资策略分析报告2021年
  3. Mac下LaTeX字体修改
  4. JasperException
  5. mongodb数据存储大小
  6. ZigBee协议栈广播
  7. DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理总结及对比
  8. 跨境电商ERP店群管理系统源码支持二开,企业数据私有化部署
  9. Visual Studio 2012制作MFC计算器-TC王者
  10. zigbee智能家居系统转载文章