给MK802(USB大小的Android4.0小PC)引出串口信号,变成ARM开发版

这几天搞到了前不久被媒体宣传过的只有U盘大小的Android 4.0小PC。他的样子如下,使用HDMI接口连接显示器再外接一个usb键盘鼠标就能作为PC用了。

托朋友买了台,试用了下果然还不错,虽然是Mali 400MP + Cortex-A8 的配置,不过感觉播放1080p媒体很流畅,3D渲染没怎么测试,不过依照我以前接触mali 400的经验看,不会差到哪里,但也好不到哪里。

硬件上他使用了全智(Allwinner)的A10 CPU,实际为Cortex-A8 + Mali400 MP GPU。1G DDR以及集成的usb WIFI和一个usb host以及一个usb OTG。仅支持HDMI输出音视频。一些内部照片贴在这:

 

如果就想把它当作一台小pc来用,那么就应该到此收手,安心的用了。但相信也有不少朋友和我一样,不满足于这些功能,想完全发挥出这么小巧的arm主板的性能,那还需要做几件事情

1. 拿到kernel source以及相关的driver code。业内称为BSP(board support package)

2. 获得串口调试信息

第一件事情我们已经不用操心了,网上已经有针对A10的kernel code,且可以用于MK802的机器。对于第二件事情,我之前并没在网上看到有人说明如何在MK802上引出串口,但其实看了内部PCB也不难发现办法。在介绍前,我先和不明白引出串口信号的朋友介绍下这样做的目的:

一般做linux kenrel(其实是所有kernel层次)的开发,没有VC IDE debugger这种好用的工具,就连gdb server很多时候都不管用。最常见的办法就是通过printf把日志从串口打印出来调试。(当然如果正在开发串口驱动,那只好通过点亮几个LED灯来调试了,这听上去很疯狂,但这是事实)。虽然也有ICE/JTAG这类硬件调试器,但对于linux kernel这类OS的调试,硬件调试器就显得很不直观,而且很多time critical的逻辑无法通过下断点复现。因此,一般做硬件/kernel/驱动层次开发,有一个用于打印printk信息的串口是非常必要的。

估计又有人问,这和现在有什么关系?我们只是使用MK802,又不是做开发。呵呵,这里我们就是希望做一些“开发”。比如从简单的控制MK802上几个IO(就像arduino那样)到修改usb驱动、优化GPU驱动等等,都是hacker喜欢做的事情。那么,有个串口供调试就是非常必要的。

不扯开了,其实串口信号很好引出,具体见下图:

PCB上其实有对应的测试点,但是没有丝印标出信号含义,但其实很容易猜到:右起第二个肉眼就能看出是GND。最右侧通过万用表测量横定是3V3。那自然是VCC。左边2个自然有很大嫌疑是TXD和RXD的TTL电平的串口信号。那么怎么确定那个是TX哪个是RX? 注意左起第二个有一个上拉电阻。一般输入信号才要上拉/下拉。那很可能就是RX。用示波器看了下,果然最左侧有信号发出。果断焊上线路,启动putty,看到了熟悉的uboot画面和kernel dmesg。可惜厂家把tty给禁用了,没法登陆console。但没关系,反正有kernel source,自己编一个即可。从dmesg中也可看出,厂家对系统的优化基本没做,很多内部调试log都还在:-P

Uboot和Kernel启动log

使用putty连接usb串口

将引出的串口信号连接usb转串口适配器

用热熔胶保护,防止短路

最后提醒看的手痒的朋友一声:焊盘间距比较小,小心短路。

附上从开机到启动完毕的log:

http://www.csksoft.net/data/code/mk802_log.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在进行NDK开发时,Android.mk文件是非常重要的一个文件,它用来描述你的Native代码库的模块依赖关系、编译选项等信息。下面是Android.mk文件编写的一些基本规则和示例。 1. Android.mk文件基本结构 Android.mk文件由一系列的变量定义、模块声明和编译选项等组成。下面是一个基本的Android.mk文件结构: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mymodule LOCAL_SRC_FILES := mymodule.c LOCAL_LDLIBS := -llog -landroid include $(BUILD_SHARED_LIBRARY) ``` 其中,`LOCAL_PATH`指定了当前目录路径;`CLEAR_VARS`清除之前的变量定义;`LOCAL_MODULE`指定了模块名称;`LOCAL_SRC_FILES`指定了源代码文件;`LOCAL_LDLIBS`指定了链接库;`BUILD_SHARED_LIBRARY`指定了编译成共享库。 2. 添加多个源文件 如果一个模块由多个源文件组成,可以使用`LOCAL_SRC_FILES`变量指定多个源文件,例如: ``` LOCAL_SRC_FILES := file1.c \ file2.c \ file3.c ``` 3. 添加头文件路径 如果源文件中包含了其他头文件,可以使用`LOCAL_C_INCLUDES`变量指定头文件路径,例如: ``` LOCAL_C_INCLUDES := $(LOCAL_PATH)/include ``` 4. 添加编译选项 如果需要添加编译选项,可以使用`LOCAL_CFLAGS`和`LOCAL_CPPFLAGS`变量,例如: ``` LOCAL_CFLAGS := -Wall -O2 LOCAL_CPPFLAGS := -std=c++11 ``` 5. 添加链接库 如果需要链接其他库,可以使用`LOCAL_LDLIBS`变量,例如: ``` LOCAL_LDLIBS := -llog -landroid ``` 6. 添加静态库 如果需要链接静态库,可以使用`LOCAL_STATIC_LIBRARIES`变量,例如: ``` LOCAL_STATIC_LIBRARIES := libfoo libbar ``` 7. 使用预编译头文件 如果需要使用预编译头文件,可以使用`LOCAL_CXX_FLAGS`变量,例如: ``` LOCAL_CXX_FLAGS += -include myheader.h ``` 8. 模块依赖关系 如果一个模块依赖于另外一个模块,可以使用`LOCAL_STATIC_LIBRARIES`或`LOCAL_SHARED_LIBRARIES`变量来声明依赖关系,例如: ``` include $(CLEAR_VARS) LOCAL_MODULE := libfoo LOCAL_SRC_FILES := foo.c include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libbar LOCAL_SRC_FILES := bar.c LOCAL_STATIC_LIBRARIES := libfoo include $(BUILD_SHARED_LIBRARY) ``` 上面的例子中,模块`libbar`依赖于模块`libfoo`。 以上就是Android.mk文件编写的一些基本规则和示例,希望能够对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值