博文

目前显示的是 一月, 2017的博文

关于USB HID Report Descriptors

图片
  最近有需要调试一款USB HID设备,拿到了该款HID设备的Report Descriptors,找了一些资料学习了下,下面转发讲解清晰易懂的一篇内容(http://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/):   Tutorial about USB HID Report Descriptors   A USB HID report descriptor is one of the descriptors that a USB host can request from a USB device. HID devices send data to the host using reports, and the descriptor tells the host how to interpret the data. I will try to show you how to write one of these descriptors.   First, go to this page http://www.usb.org/developers/hidpage/ and find the document titled “Device Class Definition for HID”. What I will be talking about is essentially paraphrasing the important sections of that document.   Second, go get the HID descriptor tool from the same page. You’ll want to play with it as you go through this tutorial. It is an absolute headache to write the HID report descriptors manually (converting between binary and hex and looking up the meanings of the numbers) so this tool is essential.

Android源码下进行APK签名

  在Android源码下如何对APK手动签名呢?需要如下几个步骤:   1、编译signapk JAR包:     在Android源码目录下执行make signapk命令,即可在out/host/linux-x86/framework/目录下生成signapk.jar文件。   2、对已编译好的普通APK进行签名:     java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 xinu.apk xinu_new.apk     以上都是在Android源码目录下执行,对xinu.apk进行签名,签名后名为xinu_new.apk,其中pem和pk8是签名时要用到的key文件,使用Android源码下的key可在编译出来系统上运行时获取System权限等。   参考网址:   http://www.android123.com.cn/kaifafaq/815.html   http://chroya.iteye.com/blog/803028   http://www.android123.com.cn/androidkaifa/173.html   http://www.91linux.com/html/article/qianrushiyingyong/google_android/20100920/20670.html

Android系统在小内存下的使用

  最近在调试的方案,硬件配置是512MB的DDR,这在Android4.4这号称优化很大的系统版本上运行还是很吃力,找了一些资料,发现我们的方案上使用到了ZRAM这一技术,直接使用压缩内存来作为交换分区,其中涉及到的内核配置如下:   CONFIG_SWAP=y   CONFIG_CGROUP_MEM_RES_CTLR=y   CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y   CONFIG_ZRAM=y   CONFIG_ZSMALLOC=y   接下来运行起来后(如上述编译失败,需要把SYSFS和BLOCK相关配置加上),可以看到有/dev/block/zram0 这一结点,然后我们的方案在init.rc里加了一个service,其为oneshot类型,就是执行一个脚本了,脚本内容如下:   #!/system/bin/sh   echo $((256*1024*1024))  > /sys/block/zram0/disksize   mkswap /dev/block/zram0   swapon /dev/block/zram0   sleep 1   mkfs.ext2 -b 4096 /dev/block/zram0   sleep 1   mount -t rootfs -o remount -rw rootfs /   mkdir /swap_zram0   sleep 1   mount -t rootfs -o remount -r rootfs /   mount -t ext2 -o rw /dev/block/zram0 /swap_zram0   这样的话,我们就有了一个交换分区来使用了,但发现使用free -m命令查看时,SWAP分区一直没有使用,并且一直有lowmemorykiller的操作,后来发现是我们的/sys/module/lowmemorykiller/parameters/minfree参数还是1GB DDR的配置,故而将其按一定比例调小后就可以了。   对于/sys/module/lowmemorykiller/parameters/minfree,其6个值与/sys/module/lowmemorykiller/parameters/adj一一对应

Android下制作OTA包及验证

  当我们拿到一份Android源码后,要如何制作OTA升级包(实质上是Recovery升级的ZIP包,OTA升级是基于Recovery的机制再加上下载ZIP包和ZIP包版本管理等功能实现)呢?(注:下面命令如无特别说明,则均在Android源码目录下执行)   1.进入Android源码目录下执行如下命令来初始化环境变量:    source build/envsetup.sh    lunch    其中,lunch命令运行后会要求选择所要编译的产品名。   2.编译生成OTA包(前提是Android需先完整编译过一次)    make otapackage    执行上述命令后,会生成out/target/product/XXX/YYY-ota-eng.guochongxin.zip和out/target/product/XXX/obj/PACKAGING/target_files_intermediates/YYY-target_files-eng.guochongxin.zip两个后期需要使用到的包,其中前一个为完整升级包,后一个为后期制作增量升级包时的对比包,那么如何制作增量升级包呢?假如系统里的软件是A版本,然后我们刚使用make otapackage命令制作了B版本,此时我们可以在之前保留的A版本的临时目标文件基础上制作增量包,过程如下(在Android源码根目录下执行):    ./build/tools/releasetools/ota_from_target_files -v -i A-target_files-eng.guochongxin.zip out/target/product/XXX/obj/PACKAGING/target_files_intermediates/YYY-target_files-eng.guochongxin.zip YYY-eng.guochongxin_incremental.zip    执行上述命令后,会在当前目录下生成YYY-eng.guochongxin_incremental.zip增量包,其中A-target_files-eng.guochongxin.zip为A版本的临时目标文件,而YYY-target_files-eng.guochongxin.zip为刚编译好的B版本的临

Android UART触摸框调试

  在Android系统里调试UART口触摸框时,需要使用到Linux内核的SERIO框架,涉及的配置项为CONFIG_SERIO=y和CONFIG_SERIO_SERPORT=y,而我们需要的驱动里会包含module_serio_driver()宏注册的驱动接口,可以在内核源码drivers/input/touchscreen目录下搜索上述的这个宏就可以搜索到相关的驱动,我们可以找最相近的作为参考来修改,有了这个驱动后,我们还需要有一个上层应用程序inputattach,该程序用于将实际使用的串口设备与这个驱动关联上,实际上该程序里面最重要的是ioctl(fd, SPIOCSTYPE, &devt)这一操作,就是实现关联操作。如在init*.rc里有如下服务:   service irtouch /system/bin/inputattach --baud 9600 --boray /dev/ttyS1     class main     oneshot   上述提及相关资料可以参考如下网址:   http://lwn.net/Articles/122577/   http://sourceforge.net/p/linuxwacom/input-wacom/ci/master/tree/inputattach/

通过Netlink检测USB设备的插拔

    在Android的Vold里面可以了解到,其检测USB的插拔是通过Netlink机制来实现的,那我们也来尝试下如何在Linux下写个程序检测USB设备的插拔,下面我们将使用Netlink的NETLINK_KOBJECT_UEVENT类型套接字与Kernel进行通信,然后使用setsocketopt()来利用该套接字,再使用select()并发检测相应的套接写是否可操作,具体的代码实现 如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/socket.h> #include <linux/netlink.h> #define UEVENT_BUFFER_SIZE 2048 int main(void) {     struct sockaddr_nl client;     struct timeval tv;     int fd, rcvlen, ret;     fd_set fds;     int buffersize = 1024;     fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);     memset(&client, 0, sizeof(client));     client.nl_family = AF_NETLINK;     client.nl_pid = getpid();     client.nl_groups = 1; /* receive broadcast message*/     setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));     bind(fd, (struct sockaddr*)&client, sizeof(client));     while (1) {         char buf[UEVENT_BUFFER_SIZE] = { 0 };         FD_ZERO(&fd

通过Netlink检测网线插拔

  最近有个需求需要检测RJ45网卡的网线有没有接上,而最近正在了解Netlink相关资料,刚好也看下通过Netlink可以进行检测,故在此做下粗略笔记:   1.首先要创建一个Netlink Socket,在用户层使用如下参数来调用socket()函数:    fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);    上面这个函数第一个参数必须是AF_NETLINK或PF_NETLINK,这两个标志在Linux下是一样的,第二个参数可以是SOCK_RAW或SOCK_DGRAM(对应用到TCP或UDP协议),而最后一个参数NETLINK_ROUTE为“路由守护进程”,用于接收来自内核的路由通知事件。   2.将上面创建的Socket绑定    addr.nl_family = AF_NETLINK;    addr.nl_groups = RTNLGRP_LINK; //指定接收路由多播组消息    bind(fd, (struct sockaddr*)&addr, sizeof(addr));    上面将创建的socket与相应的协议族和组进行绑定,接下来通过读fd这个socket来获得相应的消息数据struct nlmsghdr,再对该结构体数据进行判断来获得网线是接上或是拔掉,相应的源码如下: #include <sys/types.h>  #include <sys/socket.h>  #include <asm/types.h>  #include <linux/netlink.h>  #include <linux/rtnetlink.h>  #include <stdlib.h>  #include <stdio.h>  #include <sys/ioctl.h>  #include <linux/if.h>  #include <string.h>  #define BUFLEN 20480  int main(int argc, char *argv[])  {      int fd, retval;      char buf[BUFLEN] = {0};

制作并验证Android的OTA包

 当我们拿到一份Android源码后,要如何制作OTA升级包(实质上是Recovery升级的ZIP包,OTA升级是基于Recovery的机制再加上下载ZIP包和ZIP包版本管理等功能实现)呢?(注:下面命令如无特别说明,则均在Android源码目录下执行)   1.进入Android源码目录下执行如下命令来初始化环境变量:     source build/envsetup.sh     lunch     其中,lunch命令运行后会要求选择所要编译的产品名。   2.编译生成OTA包(前提是Android需先完整编译过一次)     make otapackage     执行上述命令后(有些平台需要先执行make后再执行该命令),会生成out/target/product/XXX/YYY-ota-eng.guochongxin.zip和out/target/product/XXX/obj/PACKAGING/target_files_intermediates/YYY-target_files-eng.guochongxin.zip两个后期需要使用到的包,其中前一个为完整升级包,后一个为后期制作增量升级包时的基准对比包,那么如何制作增量升级包呢?假如机器里的Android系统软件是A版本,然后我们刚使用make otapackage命令制作了B版本,此时我们可以在之前保留的A版本的临时目标文件(即保留下来的编译A版本软件时target_files_intermediates目录下的YYY-target_files-eng.guochongxin.zip文件)基础上制作增量包,过程如下:     ./build/tools/releasetools/ota_from_target_files -v -i A-target_files-eng.guochongxin.zip out/target/product/XXX/obj/PACKAGING/target_files_intermediates/YYY-target_files-eng.guochongxin.zip YYY-eng.guochongxin_incremental.zip     执行上述命令后,会在当前目录下生成YYY-eng.guochongxin_increment

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)与机顶盒用到的转换线相连。      相应的硬件连接可参考如下图所示:     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.内核源码修改(不同Kernel版本有区别,注意根据实际处理)        进行源码修改,主要是该USB转串口识别到的设备名改下名字,避免与其他类型设备冲突,主要将识别到ttyUSBx改名为ttyUSBDBGx(其中x为0-255之间的数字):        a).修改drivers/usb/serial/bus.c文件,在如下语句:           dev_info(&port->serial->dev->dev,              "%s converter now attached to tt

Android Studio NDK升级导致编译失败

  最近在Android Studio2.2上面的工程,原来的NDK版本是12,而升级为13 Beta 1后出现编译失败,有类似如下提示: CMake Error at .../cmake/3.6.3155560/android.toolchain.cmake:356 (message):    Invalid Android NDK revision (should be 12): 13.0.3057941-beta 处理方法为:   将$PROJECT_DIR/app/.externalNativeBuild目录删除,然后运行Build->Clean,清空项目后Rebuild一下项目就可以正常编译通过了。 参考网址:https://code.google.com/p/android/issues/detail?id=222068

Android应用导入Apache包错误解决方法

原来在4.4源码上能编译通过的代码,放到6.0上就编译不通过,有如下错误提示: ERROR: /home/guochongxin/slam/xxx.java:14: The import org.apache.http.HttpEntity cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:15: The import org.apache.http.HttpResponse cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:16: The import org.apache.http.client cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:17: The import org.apache.http.client cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:18: The import org.apache.http.client cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:19: The import org.apache.http.impl cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:20: The import org.apache.http.message cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:22: The import org.apache.http.protocol cannot be resolved ERROR: /home/guochongxin/slam/xxx.java:593: DefaultHttpClient cannot be resolved to a type 解决方法是: 1.修改Android.mk,添加LOCAL_JAVA_LIBRARIES += org.apache.http.legacy 2.修改An

Android6.0上frameworks增加代码编译错误

    在Android6.0的frameworks/base/core/java/com下面增加代码,发现有如下编译错误:     Error: out/target/common/obj/JAVA_LIBRARIES/com.slam.info_intermediates/classes.jar: unknown package name of class file com/slam/info/slamInfo.class    搜索build目录下,发现build/core/tasks/check_boot_jars/check_boot_jars.py脚本里CheckJar函数会打印上面的提示,在该文件的main函数调用该函数前,会先调用LoadWhitelist函数加载白名单列表文件,加载的文件为调用check_boot_jars.py脚本时传进来的参数,继续搜索,发现在build/core/tasks/boot_jars_package_check.mk文件中会调用到该脚本,并且参数是build/core/tasks/check_boot_jars/package_whitelist.txt,故而修改该TXT文件,添加如下内容:     com\.slam\.info     com\.slam\.info\..*     接下来make clean后再make编译的,确认能编译通过。     参考资料:http://blog.csdn.net/zhudaozhuan/article/details/51789002

Android让所有APK横屏显示

    在Android6.0.1里面,Box产品的HDMI输出都是以横屏显示,而有些APK会申请竖屏显示,此时通过修改frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java文件里面的updateRotationUncheckedLocked函数的如下语句:     if (mRotateOnBoot) {              mRotation = Surface.ROTATION_0;              rotation = Surface.ROTATION_90;     }     后面添加如下语句:     if("box".equals(SystemProperties.get("ro.target.product","tablet")))         rotation = Surface.ROTATION_0;     重新编译后,所有的APK都会以横屏显示了。