使用本地AOSP镜像快速获取Android代码

说明 一次次的从AOSP mirror站点获取代码特别慢, 尤其是如果使用的还是google的AOSP Mirror而不是国内的. 因此如果在开发中需要经常性的切换Android branch/Tag, 对不同的Android版本进行开发验证与编译的话, 最好在本地建立一个次级的AOSP Mirror. 这样所有的Android版本都有了, 即节省了流量也节省了时间. 建立本地AOSP镜像 建立本地次级AOSP Mirror直接使用google提供的命令即可, 在repo init的命令后面加上–mirror即可, 例如下面是从TsingHua University的AOSP mirror获取本地一个Mirror.

Continue reading »

程序员修电脑必备: 使用Grub2制作一个多系统(WinPE与Linux, Android X86)启动的维护移动硬盘和U盘

说明 多台计算机安装了不同的系统(Windows, Linux, MacOS), 如果要对系统进行重装或者维护, 每一次都是重新制作启动和维护移动存储设备, 为了节省时间, 考虑制作一个即可启动和维护Windows的也可以启动和安装Linux的多启动移动存储设备. 现代的电脑主板上面的固件(BIOS)可以支持Legacy BIOS启动也可以支持UEFI启动, 下面我们指的是Legacy BIOS, 当然最后也说明了一下制作UEFI启动盘. 这里面使用移动U盘和移动硬盘都测试实践没有问题. 以下是过程. 如果你想制作一个和我这个一样的多系统启动维护移动设备,那么可以看最后的总结部分, 通过几个步骤完成, 所有的文件我都会上传.  作用 多系统启动的移动存储设备可以完成但是不限于下面这些功能

Continue reading »

Android BlueDroid分析: 配置文件(bt_stack.conf bt_vendor.conf )的加载与分析

说明 在Android BlueDroid启动,即stack启动的时候,回去加载好几个配置文件, 然后BlueDroid Stack根据这几个配置文件会进行调整, 例如Device ID(did), Log相关的Trace Level, COD(即Class of Device), BT snoop log相关配置等等.下面结合代码和配置文件一起来说明分析. 配置文件说明 配置文件分为运行时动态加载和编译的时候直接解析使用的.主要有下面三个, 冒号后面是简要的作用说明. 编译完成后,这些配置文件都是位于: /system/etc/bluetooth/

Continue reading »

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

说明 thread封装了pthread, 完成的功能是, 使用fixed_queue作为workquque, 将需要被执行的thread function放入其中(enqueue), 使用thread_post来enqueue,enqueue完成后semophore发送信号给dequeue, 然后使用reactor中的epoll_wait监控到dequeue semaphore变更, 就读出queue中的数据, 而queue中的item是thread function与args, 于是运行这个function, 完成任务执行功能.  结构体

  函数分析 创建thread以及reactor

Continue reading »

OpenWRT中使用无线网卡做中继器与AP热点

中继器与AP的实现 这里我们假定中继器完成下面这样的一个功能: Wired Network —> Wireless Network —> 上级无线路由器 即从外部插入一个网线,通过imx6UL上面的无线网卡将数据转发到上级的路由器上面, 当然也可以完成下面这样的传送: Wireless Network(AP mode) –> Wireless Network(Client) –> 上级无线路由器 即设立一个AP热点,相当于一个路由器,然后再将这个AP的数据通过另外一个无线网卡转发到上一级的路由器或者WLAN上面。

Continue reading »

OpenWRT中使用mpd作为音频Server及其使用

说明 MPD可以播放音乐与streaming Radio,可以用于娱乐用。其官网的说法为:

即MPD是CS架构的Daemon端。 接下来我们将在iMX6UL上面使用MPD, 并在手机与Ubuntu等上面使用其Client来控制与播放音乐。 ALSA验证声卡发声 要完成音乐的播放,首先iMX6UL需要可以播放声音。 iMX6UL使用的Codec是WM8960, 这个和TQE9使用的是一样的。 在播放之前,我们先查看声卡是哪个:

首先需要确定ALSA识别了哪些声卡,然后再确定声卡的设备Index, 例如这里面WM8960不是Card0,所以如果直接默认使用aplay来播放,那么就会出错。 当然启动的时候也有:

确定设备Index后,我们需要一个WAV文件来播放。 直接使用MP3来convert一个: 然后我们使用wavinfo查看一下wav文件的属性:

Continue reading »

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

说明 fixed_queue使用List来存储数据, 同时使用semophore来控制enqueue与dequeue. 在HCI等地方都有用到. 结构体的组成

  函数 fixed_queue_register_dequeue 完成在dequeue取出数据后, 对数据进行处理. 重点在于:

  enqueue与dequeue 在enqueue后,会发送信号, 这样dequeue等待的epoll_wait, 即reactor中的run_reactor就会返回, 然后执行对应的read_ready callback,

Continue reading »

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 »