Yocto i.MX6 (TQIMX6) (04) : 使用mjpg-streamer做一个WebCam Server

libjpeg的编译 下载后直接对configure指定即可。或者使用Yocto编译,参考我的其他与Yocto相关博文。 mjpg-server的编译 mjpg-streamer已经很老了,且sourceforge中的下载文件,默认是deb格式的,因此需要找到对应的源代码 下载地址:http://sourceforge.net/projects/mjpg-streamer/files/mjpg-streamer/Sourcecode/ 编译 下载之后,解压,并将所有Makefile中的CC变更成接受Preset的格式,即将:

变更成:

为了防止少修改,还可以用grep看看都有哪些文件有:

结果如下: 对于修改Makefile,可以使用sed与awk组合完成,命令如下:

然后再使用grep看看文件是否都完成了变更。 将mjpg-streamer的库output文件放到target上 lib库so文件 直接在target中使用scp或者其他方式放进去即可,下面是一个范例:

Continue reading »

Yocto i.MX6 (TQIMX6) (02) : USB Wifi (TP-Link WN821N等设备)AR9170的Linux内核支持与固件使用

说明 固件的下载见博客末尾。 Wifi模块 有一个TP-Link的WN821N的USB无线网卡,查到UbuntuPC上面用lsusb看了看: 内核支持 在内核中搜索lsusb输出的设备VID与PID,可以看到是有支持的,直接在内核中配置即可: 这个是Linux社区对这个USB Wifi的支持,在这个Menuconfig选项的help中的网站里面很多东西都已经无法下载了。 支持的设备 使用AR9170的设备有如下这些(来源于这个网页): Vendor [all]3ComAVMActiontecAirliveArcadyanAtherosCaceD-LinkH3CIO-DataNECNetgearPlanexProximSphaironTP-LINKWNCZ-ComZydasZyxel Product USB Vendor [all]0x04090x04bb0x057c0x05860x07d10x083a0x08460x0ace0x0cde0x0cf30x14350x16680x1b750x20190xcace USB Product [all]0x00230x00260x00270x02490x02b40x03000x03260x08040x093f0x10010x10020x10100x10110x12000x12210x34170x3a090x3a0f0x3c100x53040x84010x84020x90010x90100x90400x91700xf522 MaxPower

Continue reading »

Yocto i.MX6 (TQIMX6) (01) : 3.14.28内核的适配

Freesacle Yocto的环境配置与编译 到Freescale下载imx6 Linux Source Code,解压里面的fsl-yocto命名的压缩包得到Yocto setup手册:Freescale_Yocto_Project_User’s_Guide.pdf 然后按照里面的步骤操作即可编译出一个完整的distribution,当然很可能会因为网络或者一些Package早已不存在,或者因为大家都知道的原因而无法下载一些source code,而编译失败。 注意编译的目标选择imx6qsabresd,因为这个和我们的TQIMX6Q接近。 个人使用的步骤如下: 按照文档说明repo init会出错:

这是因为googlecode无法访问,所以特别指定其他的:

然后是repo sync

接着就是source

Continue reading »

Freescale IMX6 Android (7): Android启动动画死循环 Home界面不出来与pid XXX exit 可能的原因汇总

或许你某一次编译了整个Android,然后烧进去,结果屏幕中一直显示Android Bootanimation,Home界面一直不出来。对此,可能有以下五类原因,往这几个方向考虑与调查可能可以提供一些线索。前面两类是属于软件的,后面两类属于硬件。最后一类属于软件硬件都相关。 第一类:binder相关

这一类的问题,一般都是因为某个进程退出了,因此binder消息无法发送过去了,因此和下面第二类比较类似。 第二类:pid XXX exit 这类log会不断输出,表现为某个或者某几个线程不断的重启。为何会不断的重启,因为这个是系统关键的线程,可能是守护进程。 那么就需要调查程序为什么会退出,这一般有三种可能的原因: 进程需要的资源无法获得 进程程序有问题 有其他进程在不断的kill(发信号)这个进程 这几类都遇到过,下面举例说明。 进程需要的资源无法获得 有可能是某个分区坏了,而这个线程一定需要在这个分区创建某个文件并写入数据才能执行。 有一些Service可能需要某个属性的值变成特定的值才能运行。 进程程序有问题 在前面的博客:Freescale IMX6

Continue reading »

Freescale IMX6 Android (6): 向SystemServer中添加Service

简述 前面的博客中,我们直接添加C lib到APK中,然后使用LoadLibrary加载这个库,同时添加一个class来作为中间层,直接使用这个C库中的native函数来控制硬件,这种做法将硬件与APK牢牢绑定,如果有多个APP来访问同一个硬件就会出现问题,代码也会有很多的重复,在Android中,我们使用Android的SystemServer向ServiceManager来将硬件的功能添加为一个服务,这样当一个APP需要使用硬件的时候就向SystemServer发出请求service服务,然后由ServiceMnager统一提供服务,提供统一的接口与硬件控制,即相当于多添加了一层,从而实现解耦。 详细原理 先看下图(图片来源于韦东山的Android视频资料)中的③②①,按照顺序: SystemServer会加载Cpp lib 在JNI_OnLoad中注册各个Service,SystemServer向ServiceManager添加服务 这些service就包括像串口/LED等硬件相关的服务 而使用的时候,就是7~5步骤: AddService:SystemServer向ServiceManager添加服务addServeice getservice:通过getservice来从SystemServer注册了的service中获取服务所具有的功能,例如ledctrl 使用Service的方法:APP使用一个Interface(即以i开头的对象)来使用service提供的功能,将服务请求到SystemServer去 APP/SystemServer/ServiceManager三者都是通过Bindler来通讯。 添加Service与使用Service的步骤 添加serviceAIDL文件,生成Interface java文件 因为系统中其他都aidl文件都放在frameworks/base/core/java/android/os下,所有我们也参考其他的文件添加一个ILedService.aidl:

可以看到这个interface前面有个@hide的修饰,表明是个hide

Continue reading »

Freescale IMX6 Android: APP通过JNI控制LED

本篇博客接上一篇的:Freescale IMX6 Android: 基于TQIMX6 给Toolbox添加LED控制程序,上一篇是直接将控制程序放到了Toolbox,本篇则是通过JNI调用C库来完成LED的控制,即APP–> C –> HW。 APK的编写(源码见末尾) 编写主要需要注意下面个事项与步骤 1. 更改xml在layout中添加控件 2. Checkbox与Button的添加及其click与checked事件的handler 3. Toast的使用 4. API版本问题 5. 文档的查询

Continue reading »

Freescale IMX6 Android: 基于TQIMX6 给Toolbox添加LED控制程序

本篇博文是为了后面的Android HAL层使用LED而做的准备,板子基于TQIMX6Q,Android 4.3,Android已经编译完成了,如果还没有可以参考前面我的博文:Freescale IMX6 Android: 使用HDMI作为Android显示输出的配置,以及TQ提供的开发者手册。 LED的硬件连接 LED4~6是给用户使用的,如下: 可以看到是GPIO3_21~23。而且是GPIO给高电平的时候接通。 LED软件方面的配置 直接导出使用 看到前面的原理图,在用户态直接将gpio导出来操作(gpiolib)是最容易的了,但是要在/sys/class/gpio中导出来需要知道各组gpio的base number,直接使用cat查看,结果如下:

  可以知道gpio3是从64开始的,gpio3-21为64+21=85,于是直接操作:

但是发现不成功,因为gpio已经被使用了,无法导出来,尽管操作的时候没有出现问题log提示。 使用Gpio-led 内核使用的是3.0.35版本的内核,尽管也有dts,但是Freescale在最开始的Linuxkernel中并没有使用,因此都是hard

Continue reading »

Freescale IMX6 Android: 手动制作Android启动用SD卡 省去MFGTOOLS烧写

Freescale IMX6的烧写方式在Windows下面一般使用MFGTools,但是TQ提供的MFGTools在Windows 10下面无法工作,USB的驱动不正常。于是想到Linux下面的烧写方式,结果一样出现问题,且因为TQ没有提供一些烧写程序的源码,因此无法更改与调试。因此TQ提供的两种烧写Android的方式都无法使用了,加之前面博文中,我也尝试使用NFS来启动,也没有达到需要的效果,因此这篇文章说一下自己原创的直接制作SD卡来启动Android。 LinuxSD卡烧写Android的尝试 因为这个方案是TQ给出的,所以我尝试的去使用了一下,结果无法使用,因此也写下来,希望其他人不用会去浪费时间,或者帮忙指出我的操作哪里不对。 按照官方的说法制作好了烧写用的SD卡,并且从SD卡启动之后,rcS中会自动去mount SD卡,然后解析EmbedSky.ini配置文件,但是解析的结果似乎不正确,以下是启动之后看到了rcS内容:

步骤非常直接,配置好各种需要的材料之后,直接调用一个可执行的ELF程序autoDownload,然后就没有反应了,使用ps命令也无法看到有此进程在工作。 分区mount 前面的博客(Freescale IMX6 Android NFS启动问题汇总)中提到了Android的启动过程,其中有一个步骤是mount各个分区,这个分区的mount list有一个和Linux 发行版类似的配置文件,IMX6的这个文件是fstab.freescale,其内容如下:

其中各个分区的信息可以参考这篇文章:安卓系统分区介绍,下面是我给出自己的理解,不保证准确: /system是system.img对应的partition /boot存放的应该是boot.img文件

Continue reading »

Freescale IMX6 Android NFS启动问题汇总

前面的一篇博文中,提到了要使用自己编译出来的Android来启动,且使用NFS的方式来启动Android,但是在今天的尝试中却遇到了问题。且最终没有解决,但是找到了替换方案,替换方案见下一篇博文。遇到的问题汇总如下,希望可以帮助遇到同样问题的人。板子用的还是TQIMX6Q(见以前的博文)。 Android NFS启动的rootfs制作与启动 要制作Android NFS rootfs,需要对Android的启动有一个基本的了解,推荐参考相关书籍。简单而已,Android的启动过程如下: uboot –> kernel –> Android Init in ramdisk(boot.img) –> Init 解析 init.rc –> Init 解析

Continue reading »

Freesacle IMX6 使用HDMI作为Android显示输出的配置

环境准备与编译 个人使用的是Ubuntu 12.04 X64,针对环境的配置,百度即可。板子使用的是TQIMX6Q。 lunch目标 但是,编译的时候使用的是TQ提供的脚本build_sh,根据这个脚本,可以看到lunch的目标是sabresd_6dq:

  即,TQIMX6的Android lunch目标其实使用的是sabred板子的目标,并没有自己添加lunch target,编译完成后,也没有userdata.img:

  同时也编译了uboot与uImage。 编译可能出现的问题 Android编译使用的是自带的ToolChain,自然不需要再自己配置。但是Host PC中的GCC也需要注意版本,否则会出现问题:

看log输出,还以为是Host GCC的Bug,换了多个版本的GCC之后,问题依旧,后来发现make时指定submake过多,将make

Continue reading »