首先说一下大环境和总体步骤:

下载lirc 0.8.7源码,使用ubuntu的setup.sh,配置为mceusb的驱动,同时Compile tools for X-Windows选项去掉,生成configure.sh,然后丢到raspberry中,只改为如下:

./configure \
--with-moduledir=/lib/modules/3.2.0-29-generic/misc \
--without-x \
--with-kerneldir=/media/61f7e2bf-c92c-4a36-8b26-9c175f2f286b/kernel \
--with-driver=mceusb \
--with-major=61 \
--with-port=none \
--with-irq=none \

其中主要是指定了内核树位置,这个位置的内核树是从android SDK中编译好的内核数拿过来的,如果要开debug信息,则加上:

--enable-debug \

对lirc源码需要进行的修改:

1、如果你的硬件设备的vendor ID和product ID没在标准lirc中的mceusb驱动代码中,则需要添加进去:

查看我们mec usb设备发现串口输出如下:

[ 1009.330740] usb 2-1.1: new full speed USB device number 8 using usb20_host
[ 1009.437824] usb 2-1.1: New USB device found, idVendor=147a, idProduct=e042
[ 1009.437967] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1009.438096] usb 2-1.1: Product: eHome Infrared Transceiver
[ 1009.438184] usb 2-1.1: Manufacturer: Formosa21
[ 1009.438264] usb 2-1.1: SerialNumber: 0000A859

将 idVendor=147a, idProduct=e042加入mceusb的驱动代文件lirc_mceusb.c中,修改的代码如下:

static struct usb_device_id mceusb_dev_table[] = {

{ USB_DEVICE(0x147a, 0xe042) },
/* Original Microsoft MCE IR Transceiver (often HP-branded) */
{ USB_DEVICE(VENDOR_MICROSOFT, 0x006d) },

其中蓝色字体为新加。如果没有加入idVendor和idProduct,则插上该MCE USB设备后,不能挂载到lirc_mceusb.ko这个驱动,

在运行irw时,那么lircd的日志文件中就会出现如下错误:

Mar 1 07:28:28 localhost lircd: accepted new client on /var/run/lirc/lircd
Mar 1 07:28:28 localhost lircd: could not open /dev/lirc
Mar 1 07:28:28 localhost lircd: default_init(): No such device
Mar 1 07:28:28 localhost lircd: WARNING: Failed to initialize hardware
Mar 1 07:28:36 localhost lircd: removed client

2、lircd日志文件路径的修改

如果默认的日志文件路径在android中不能创建,则运行lircd会出现如下错误:

lircd: could not open logfile
lircd: No such file or directory

则需要改为你自己需要为你的android设备可写的目录或者修改logfile的路径为"/dev/null"直接丢弃,我们在lircd.c中修改:

char *logfile=LOGFILE;改为:char *logfile="/mnt/sdcard/albertLirc";

其中/mnt/sdcard/albertLirc为我指定的lircd日志文件。

然后运行configure.sh,

生成make文件,再运行make命令,即可生成所需的。

然后在raspberry上安装,记录下安装的输出,在android上做同样的操作,具体如下:

首先使根目录可读写:(主要参考:http://blog.chinaunix.net/uid-24856020-id-3389654.html

adb remount

adb shell

mount -o remount,rw rootfs /

安装lirc_dev.ko:

adb push lirc_dev.ko /system/lib/modules/lirc_dev.ko

adb shell

cd /system/lib/modules

chmod 644 lirc_dev.ko

insmod /system/lib/modules/lirc_dev.ko

然后创建节点:

busybox mknod /dev/lirc c 61 0

然后安装lirc_mceusb.ko:

adb push lirc_mceusb.ko /system/lib/modules/lirc_mceusb.ko

adb shell

cd /system/lib/modules

chmod 644 lirc_mceusb.ko

insmod /system/lib/modules/lirc_mceusb.ko

然后:

adb push irrecord /system/bin/

adb shell

chmod 777 irrecord

创建目录并挂载节点:

mkdir -p /var/run/lirc

busybox mknod /var/run/lirc/lircd p

busybox mknod /var/run/lirc/lircm p

创建目录:

mkdir -p /etc/lirc

adb push lircd.conf.mceusb /etc/lirc/lircd.conf

adb shell

chmod 644 /etc/lirc/lircd.conf

#adb push lircmd.conf /etc/lirc/lircmd.conf

#chmod 644 /etc/lirc/lircmd.conf   //注释:lircmd.conf没找到

adb push lircd /system/bin

adb push lircmd /system/bin

复制lib文件:

adb push liblirc_client.la /system/lib

adb push liblirc_client.so.0.2.1 /system/lib

adb shell

cd system/lib

ln -s liblirc_client.so.0.2.1 liblirc_client.so.0

ln -s liblirc_client.so.0.2.1 liblirc_client.so //注释:ln -s -f liblirc_client.so.0.2.1 liblirc_client.so不成功

adb push liblirc_client.a /system/lib

adb push liblirc_client.lai /system/lib

chmod 644 /system/lib/liblirc*

为保险起见,又将所有复制到/system/lib的文件又复制到 /usr/local/lib下了。(测试发现不用复制)

最后执行lircd,出现system/bin sh:lircd: No such file or directory的错误,最后参考:

http://bbs.csdn.net/topics/390349057?page=1#post-393513107

执行:readelf -l lircd

输出如下:

Elf file type is EXEC (Executable file)
Entry point 0x9e3c
There are 8 program headers, starting at offset 52

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x016420 0x0001e420 0x0001e420 0x00008 0x00008 R 0x4
PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x00008134 0x00008134 0x00019 0x00019 R 0x1
[Requesting program interpreter: /lib/ld-linux-armhf.so.3]
LOAD 0x000000 0x00008000 0x00008000 0x1642c 0x1642c R E 0x8000
LOAD 0x017000 0x00027000 0x00027000 0x01464 0x03c38 RW 0x8000
DYNAMIC 0x01700c 0x0002700c 0x0002700c 0x000f0 0x000f0 RW 0x4
NOTE 0x000150 0x00008150 0x00008150 0x00044 0x00044 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4

Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01
02 .interp
03 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame
04 .init_array .fini_array .jcr .dynamic .got .data .bss
05 .dynamic
06 .note.ABI-tag .note.gnu.build-id

发现缺少:/lib/ld-linux-armhf.so.3

从raspberry中将该库考到android的相同位置,

chmod 777 /lib/ld-linux-armhf.so.3

如果不执行上面一句,则会出现错误:

/system/bin/sh: lircd: Permission denied

然后运行:lircd

lircd: error while loading shared libraries: libc.so.6: cannot open shared objec
t file: No such file or directory

发现缺少:libc.so.6,同样考入android的/system/lib下;

运行lircd,ok!

自动生成解码配置文件:

irrecord -f /sam_conf       //注释:/sam_conf配置文件路径及名称

(其他录入查看官网说明,同时注意irrecord的提示即可)

然后将解码文件/sam_conf拷贝到/etc/lirc/lircd.conf:

cp /sam_conf /etc/lirc/lircd.conf

修改配置文件后记得重启lircd生效!(重启可运行lircd,他会提示lircd已运行,同时显示其PID,kill pid即可,然后再运行lircd)

让后运行irw,按下遥控器即可看到信息,ok!

SDK中需要进行的修改:

1、往SDK中新建文件夹,设文件夹名字为installLirc,在该文件夹下写个脚本,设名字为install.sh,它的内容如下,该脚本需要在mkimage.sh前执行,脚本使用到的相应的文件需拷贝到installLirc目录下,install.sh的内容如下:

dsPath=../out/target/product/AskeyBox

#copy ko
cp ./lirc_dev.ko $dsPath/system/lib/modules/lirc_dev.ko
cp ./lirc_mceusb.ko $dsPath/system/lib/modules/lirc_mceusb.ko #copy bin
cp ./irrecord $dsPath/system/bin/irrecord
cp ./irw $dsPath/system/bin/irw
cp ./irsend $dsPath/system/bin/irsend
cp ./lircmd $dsPath/system/bin/lircmd
cp ./lircd $dsPath/system/bin/lircd mkdir -p $dsPath/root/var/run/lirc #copy configure
mkdir -p $dsPath/root/etc/lirc
cp ./lircd.conf.mceusb $dsPath/root/etc/lirc/lircd.conf
#cp ./lircmd.conf $dsPath/root/etc/lirc/lircmd.conf #copy lib
cp ./liblirc_client.la $dsPath/system/lib/liblirc_client.la
cp ./liblirc_client.so.0.2. $dsPath/system/lib/liblirc_client.so.0.2.
cp ./liblirc_client.so.0.2. $dsPath/system/lib/liblirc_client.so.
cp ./liblirc_client.so.0.2. $dsPath/system/lib/liblirc_client.so
cp ./liblirc_client.a $dsPath/system/lib/liblirc_client.a
cp ./liblirc_client.lai $dsPath/system/lib/liblirc_client.lai
cp ./libc.so. $dsPath/system/lib/libc.so.
mkdir -p $dsPath/root/lib
cp ./ld-linux-armhf.so. $dsPath/root/lib/ld-linux-armhf.so.

2、需要修改sdk中init.rc,我们的路径为:device/rockchip/AskeyBox/init.rc。或者直接改out下的root目录下的init.rc,添加内容如下:

#add by YJ for lirc 2014/02/26
chmod 644 /system/lib/modules/lirc_mceusb.ko
chmod 644 /system/lib/modules/lirc_dev.ko
chmod 755 /system/bin/irrecord
chmod 755 /system/bin/irw
chmod 755 /system/bin/irsend
chmod 755 /system/bin/lircmd
chmod 755 /system/bin/lircd
chmod 644 /etc/lirc/lircd.conf
chmod 644 /system/lib/liblirc_client.la
chmod 644 /system/lib/liblirc_client.so.0.2.1
chmod 644 /system/lib/liblirc_client.so.0
chmod 644 /system/lib/liblirc_client.so
chmod 644 /system/lib/liblirc_client.a
chmod 644 /system/lib/liblirc_client.lai
chmod 777 /lib/ld-linux-armhf.so.3

3、由于SDK中自带的LIRC部分与移植进去的LIRC的驱动存在冲突,故SDK中需要去掉原来自带的lirc部分的编译,所以每次kernel中重新生成.config文件后,都需要手动将LIRC相关的选项变为n。

如果没有这么做的话,SDK中自带的lirc_dev.ko就会被加载,因此在我们加载lirc_dev.ko时就会出现:

insmod: init_module '/system/lib/modules/lirc_dev.ko' failed (Exec format error)

此时串口会输出:

lirc_dev: exports duplicate symbol lirc_get_pdata (owned by kernel)

修改过sdk的话,就只需要执行上面红色文字了。

好了,大功告成!

(原创)使用mceusb设备,将lirc移植到android笔记的更多相关文章

  1. 【React Native开发】React Native移植原生Android项目(4)

    ),React Native技术交流4群(458982758),请不要反复加群!欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文章 ...

  2. Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)

    这节我们来学习Cocos2d-x的最后一节.怎样处理重力感应事件.移植到Android后加入再按一次返回键退出游戏等.我这里用的Android.IOS不会也没设备呃 效果图不好弄,由于是要移植到真机上 ...

  3. Cocos移植到Android的一些问题-中文乱码问题

    Android平台版本和设备碎片化很严重,因此从Win32平台移植到Android平台会有很多问题,下面是我们归纳的从Win32平台移植到Android平台遇到的一些问题.在Android平台中文乱码 ...

  4. cocos2d-x 3.2 移植到android

    前人栽树,后人乘凉,这句话有点过了,只是想感谢一下为了移植cocos2d-x到android的"大婶"们所做出的贡献.          首先android环境需要配置好,需要的文 ...

  5. 将Unity3D游戏移植到Android平台上

    将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...

  6. iperf linux版本移植到android (使用工具链方式不是使用Android.mk)

    由于很多程序是用makefile编译linux应用程序的,如果移植到android就要重新写Android.mk,对于不熟悉这个的人来说,特别麻烦,所以这里介绍只修改makefile就能移植到andr ...

  7. Windows下将ImageMagick移植到Android平台

    Windows下将ImageMagick移植到Android平台 原文链接  http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...

  8. React Native移植原生Android

    (一)前言 之前已经写过了有关React Native移植原生Android项目的文章,不过因为RN版本更新的原因吧,跟着以前的文章可能会出现一些问题,对于初学者来讲还是会有很多疑难的困惑的,而且官方 ...

  9. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

随机推荐

  1. (笔记)Linux下的准确延时,#include <linux/delay.h>调用出错

    在编写应用层程序时,有时需要延时一下,这个时候该怎么办呢? 在内核代码中,我们经常会看到这样的头文件使用#include <linux/delay.h>,心想着直接调用这个就可以了吧!可是 ...

  2. Eclipse初次java开发问题总结-3

    上篇中提到解决的一个问题是mysql驱动报的: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  3. SpringMVC系列(四)使用 POJO 对象绑定请求参数值

    在实际开发中如果参数太多就不能使用@RequestParam去一个一个的映射了,需要定义一个实体参数对象(POJO)来映射请求参数.Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配 ...

  4. Nginx初入

    商城项目做了一个多月了,想到必须用到负载均衡,首先分享第一个demo,五月份上线后,会继续分享一系列相关知识. 在nginx根目录下,用了一个园友的批处理文件nginx.bat,用于启动和关闭ngin ...

  5. windows使用技巧和工具(后面可能更新linux)

    *:希望广大网友有什么建议或者好的用法工具.也能够在以下评论. 希望这是一个能够让我们更好工作起来的帖子. 工作也能舒适和开心呢. 想着好久没写过博客了吧.今天就写一篇关于windows的使用的吧.我 ...

  6. 清除 Xcode 项目缓存

    运行错误.编译错误.发布错误可尝试清除 Xcode 缓存:清除 Xcode 缓存也能减少占用磁盘空间. (1)前往文件夹(control+shift+G),删除里面的文件: /Users/用户名/Li ...

  7. Node.js静态文件服务器实战[转]

    p.s. 在下面这篇文章的指导下,做了一个静态文件服务器,见:https://github.com/walkerwzy/node_static_server ==== 这是一篇阐述得比较详细的文章,从 ...

  8. 自建Nuger Server拾遗

    企业内部的包需要通过nuget来管理发布,或者一些不允许上外网的企业,通过自己的nuget服务器来使用nuget,都会考虑到自建一个nuget服务器.本文整理了一些有用的链接和使用心得,以备不时之需. ...

  9. 在阿里云创建子域名,配置nginx,使用pm2部署node项目到ubuntu服务器

    配置域名 在阿里云找到主域名 进入主域名之后,右上角添加解析,添加子域名, 记录类型选择cname,主机记录填写子域名的名称,记录值为主域名,至此阿里云已经配置好了. 检查nginx安装 首先检查服务 ...

  10. Nginx系列6之-rewirte功能使用案例总结

    使用案例1 网站架构如下: 公司部分服务器目前通过二级目录来调度到不同的服务器,如下所示: 按照上述需求,我们此时就配置了两个location,如下所示: [root@localhost nginx] ...