Android整机调试串口新玩法

在Android设备整机,调试时经常会用到USB接线进行ADB调试,但对于机顶盒或其他不支持USB OTG(或device)接口的Android设备,此时就得用网络ADB来调试整机,非常不方便,而我们想绕着玩,变个玩法来利用设备上的USB Host接口,实现USB转UART转接线在接入机顶盒的USB Host口时,Android系统的调试终端也能通过该路UART口来进行调试,于是,我们按着这思路有了如下的设想:

1.机顶盒与电脑间的硬件连接

机顶盒端:USB转串口线(可能是DB9接口的串口线,也可能是4PIN的连接线);

电脑端:可将上述的DB9接口直接连接到电脑后面的串口座,现在很多没有该串口座,那么直接再使用同样的USB转串口线(注意DB9的接口有所区别,如果是4PIN线的,那请注意两边的4PIN座子对应的接线为GND接GND,TX接RX,RX接TX,VCC接VCC)与机顶盒用到的转换线相连。

相应的硬件连接可参考如下图所示:

Android系统调试串口变着玩

2.机顶盒的软件设计

有了上面的硬件连接后,我们要进行如下修改(我们使用到的USB转串口线内置的转换芯片型号为CP2102,下面的Android对应linux kernel都是针对该款芯片配置):

a.内核配置

CONFIG_USB_SERIAL=y

CONFIG_USB_SERIAL_CONSOLE=y

CONFIG_USB_SERIAL_GENERIC=y

CONFIG_USB_SERIAL_CP210X=y

b.内核源码修改

进行源码修改,主要是该USB转串口识别到的设备名改下名字,避免与其他类型设备冲突,主要将识别到ttyUSBx改名为ttyUSBDBGx(其中x为0-255之间的数字):

a).修改drivers/usb/serial/bus.c文件,在如下语句:

dev_info(&port->serial->dev->dev,

"%s converter now attached to ttyUSB%d\n",

driver->description, minor);

前添加如下语句:

if (driver->driver.name == "cp210x")

dev_info(&port->serial->dev->dev,

"%s converter now attached to ttyUSBDBG%d\n",

driver->description, minor);

else

在如下语句:

dev_info(dev, "%s converter now disconnected from ttyUSB%d\n",

driver->description, minor);

前添加如下语句:

if (driver->driver.name == "cp210x")

dev_info(dev, "%s converter now disconnected from ttyUSBDBG%d\n

driver->description, minor);

else

b).修改drivers/usb/serial/usb-serial.c文件,在如下语句:

dev_set_name(&port->dev, "ttyUSB%d", port->number);

前添加如下语句:

if (type->driver.name == "cp210x") {

usb_serial_tty_driver->name = "ttyUSBDBG";

dev_set_name(&port->dev, "ttyUSBDBG%d", port->number);

}

else

c.Android源码修改

a).在external目录下添加setdebugport目录,包含如下文件和内容:

Android.mk:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

setdebugport.c

LOCAL_MODULE:= setdebugport

include $(BUILD_EXECUTABLE)

setdebugport.c(请将include的双引号修改为尖括号,新浪博客会过滤尖括号):

#include "stdio.h"

#include "fcntl.h"

#include "sys/ioctl.h"

int main(int argc, char **argv)

{

int fd;

if ((fd = open(argv[1], O_RDWR)) < 0) {

fd = open("/dev/null", O_RDWR);

}

ioctl(fd, TIOCSCTTY, 0);

dup2(fd, 0);

dup2(fd, 1);

dup2(fd, 2);

close(fd);

execl("/system/bin/sh", "/system/bin/sh", NULL, NULL, NULL);

return 0;

}

该部分代码的核心在于将“标准输入0”、“标准输出1”、“标准错误输出2”都重定向到打开的串口设备fd,并且执行/system/bin/sh命令,此时该命令的所有输入和输出都会跟对应打开的串口关联起来,那么串口端就可以出现对应的sh交互界面,我们就可以进行调试了(该处参考了adb shell的实现)。

b).在device/{vendor}/{product}/device.mk添加如下语句:

PRODUCT_PACKAGES += setdebugport

c).在device/{vendor}/{product}/init.rc添加如下语句:

service exchgdbgport0 /system/bin/setdebugport /dev/ttyUSBDBG0

class main

oneshot

user root

group system

(此处oneshot表示该服务只运行一遍,在RK3288 Android5.1.1上去getprop init.svc.exchgdbgport0,得到的结果一直是running,故而没有去掉,而在Amlogic S905 Android5.1上是需要把oneshot去掉才能用的,不然会一直处于stopped状态,去掉oneshot的service在stop时会reboot,看来是Amlogic更符合Android标准些)

3.验证

当我们将USB转串口的串口这端接到PC上(直接接到PC的DB9或者另一个USB转串口线),并且用SecureCRT等串口终端软件打开该串口(波特率配置与原系统的调试串口一致,一般为115200n8),然后将USB转串口的USB端接到机顶盒上,等约1-2秒,SecureCRT就出现了sh交互界面,就可以进行调试了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stxinu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值