Android BlueDroid分析: OSI中的reactor的实现与使用分析

说明 actor相当于内核中的worker, 用于监控与执行任务. reactor可以认为是: re+actor. 监控使用的是epoll, 而执行任务使用的是对应的epoll_wait返回后的event type, 然后调用相关的read或者write函数来完成对应event type的处理.而epoll_wait对某个fd是监控和执行一次还是多次是使用eventfd来进行控制. epoll可以看下面的recator_change_registration这个函数的实现. 而eventfd的控制可以search event_read与event_write来找到对应的控制点. actor的类型 不断监控: 即epoll_wait返回后, 再继续监控. 体现在函数reactor_start,这个时候可以叫做reactor 一次性的: event发生后就被移除,不再监控.

Continue reading »

OpenWRT添加无线USB网卡

说明 要完成网线网卡的驱动需要在内核中添加驱动,同时还需要将固件放入rootfs中正确的位置,如果需要固件的话。 内核驱动添加 因为内核中对常规的USB网卡均支持,所以直接添加即可, 例如下面是对9170的支持: Firmware添加 在menuconfig中直接添加: 启动确认 启动后,我们需要等待rootfs完成后再插入, 这样子可以比较容易看到log, 对于TPLink的其中一款,对应的log如下:

从log看,加载了对应的固件。配置country code。这个FW位于:

因为这个网卡具备WPS功能,有一个按键,所以有一个input设备。 对于另外一个USB网卡:

  然后就可以看到对应的网卡设备了:

Continue reading »

Android BlueDroid分析: OSI中的List与alloctor的实现分析

说明 在bluedroid中有许多数据是使用List来保存的, 而不同的数据的size各不相同,因此bluedroid中的osi封装了一个list. 不同的OS的malloc与free各不相同,因此为了屏蔽底层细节bluedroid对malloc与free进行了一个封装,成为alloctor. alloctor 定义 alloctor是一对函数函数指针的结构体,因此先要定义来个函数Pointer 类型。

可以看到,这个和libc中的malloc与free arguments与return type都是一样的,因此可以认为是OSI为了抽象分隔不同的“OS Interface”(Memory中的Stack 管理)。因此如果我们需要将BlueDroid移植到其他OS的话,需要注意适配。 alloctor_t结构体包含两个函数Pointer,一个是分配的fn,一个是释放的fn,函数Pointer类型定义如下:

  在Android中,使用的libc是bonic,和glibc一样,都实现C POSIX Library(参考Wikipedia),所以函数都是名称和传入参数都一样,也是malloc与free,因此:

Continue reading »

Android BlueDroid分析: OSI中的HashMap的实现

说明 hash map在C语言标准库中并没有封装, 不像其他语言那么方便, 例如python中有Dictionary, 而hashmap又非常有用, 因此Bluedroid自己封装了一套.封装实现的文件列表如下:

其中hash_functions.c中是对几个特殊类型的hashmap封装. 因此我们先说明hash map, 然后再看hash functions. HashMap概念与术语 首先如果要实现hashmap,那么需要做什么呢? 下面是引用StackOverFlow中的回答:

简单来说就是: A1. 创建:

Continue reading »

【IMX6UL开发板试用体验】OpenWRT有线网络的配置

在前面编译完成后,就可以烧写测试启动了。 但是启动后发现了一些问题。本次我们说明一下如何使用OpenWrt中的wired LAN。 网卡驱动问题 本身板子有两个网口,其中一个没有变压器转换器,另外一个在Uboot中使用是没有问题的,可以正常的tftp下载kernel与dtb,但是在Linux,OpenWRT启动后,如果配置网络IP地址就会出现不停的up与down的情况 udhcpc (v1.20.2) started fec 2188000.ethernet eth0: Freescale FEC PHY driver [Generic PHY] (mii_bus:phy_addr=2188000.ethernet:00, irq=-1) IPv6:

Continue reading »

【IMX6UL开发板试用体验】OpenWRT在iMX6UL上面的移植与编译

选择 OpenWRT在最近的时期分裂出了LEDE出来,因此这就涉及到了这两个的选择。 前段时间,编译过LEDE用于树莓派3,于是想着直接使用以前的LEDE,这样子省去了下载,毕竟在国内下载很多source code可能需要很长的时间,如果没有proxy的话。于是想着省些事情就用起来了以前的LEDE来编译,但是编译过程中出现了很多错误, 因此最终我决定切回到OpenWRT,并且使用master上面新的代码来移植编译。 代码仓库: https://github.com/tonyho/OpenWRT_iMX6UL OpenWRT配置 本身LEDE与OpenWRT里面已经有一个imx6 Cortex-A9的arch支持,因此直接选择这个为base来做Porting与Compile较为合适。配置如下: Compile Tuning 因为imx6ul是Cortex-A7,所以我们需要更改一下 选择好Target之后,我们需要做移植工作。 Target移植 内核移植 移植需要将内核更改一把,这个位于: $ ls target/linux/imx6/ base-files

Continue reading »

【IMX6UL开发板试用体验】上手试用与资源使用

缘起 这个是我拿到的第二块工控板了,前面是AM335X的板子。这块板子也是工业板。相比一些“开发板”而言还是有一些区别的。 硬件 和以前的AM335X板子一样,做工和用料比较扎实,该有的都有,连插针都是镀金的。让人非常放心的感觉。不愧是工业板。 快递的包装也很好,Top与Bottom都有一层泡沫,板子都有静电膜保护。 外设的配件也齐全,尤其是电源绝非普通的10多块钱的廉价货色,下面是一些图片 包装: 因为iMX6UL支持8个串口,因此厂家直接发了两个串口接头,Good,网线什么的都有了,无需自己再去找 Debug串口线与电源 下面这个是开机后的显示,自带的Qt example 看控件样子可以猜到是Qt4而不是Qt5,当然对于工业控制Qt4有着很深的现存基础。 软件资源 硬件不错,看看软件。软件主要分为: 1. binary image + Rootfs,因为板子有多种启动与Storage形式,因此有用在nand上的UBI的。 2.

Continue reading »

如何减少Android源码size并打包与切割上传共享

源码很大的原因 repo sync下Android的代码, 然后编译后,一般size都在60GB左右, 主要是因为代码中包含了out编译结果产物目录, 以及版本相关的.git与.repo目录, 如果不打包这两个目录, 那么常规的Android 6.0代码压缩后大概为6GB左右. 打包 可以使用类似下面的命令来排除非必须代码和目录以及压缩Android source code, 假设Android源码位于/home/dev/android目录, 那么可以这样子做:     cd /home/dev     tar

Continue reading »

Andorid BlueDroid分析: Semophore的实现分析

实现 在BlueDroid的OSI/src目录下存放的是Operating System Interface相关的封装与实现, 其中semophore.c实现了父子进程间的Semophore, 可以用来对父子进程间执行顺序的控制,完成Notify与Wait的功能. 而这个semophore的实现依赖于Linux的eventfd, 同时使用了glibc的event_read与event_write, 因为BlueDroid主要使用在Android中(其他Linux OS中也有使用的情况), 所以很显然Android的bonic也实现了eventfd_read与eventfd_write. 所以如果想移植BlueDroid到其他非LinuxOS系统中,那么就需要实现这个eventfd. 函数 这个文件的Overview 共有六个函数, new与free, wait与try_wait, post与get_fd. 结构体 对fd用struct包装了一下:

Continue reading »