基于Android(安卓)5.1系统的nfc读卡驱动和上层的调试记录,nfc移植到android系统
PN544驱动,nfc驱动移植
pn5xx driver, nfc driver
pnx544 nfc移植
安卓nfc驱动移植
标签:流水帐式的目录哦
-
- 1. 原因
- 2. 步骤
-
- a. step001:
- b. step002:
- c. step003:
- d. step004:
- e. step005:
- f. step006:
- g. step007:
- h. step008:
- i. step009:
- 结语
1. 原因
公司要我在我们的s5p6818的安卓设备上移植pn5xx的nfc驱动,之前有人做过,我第一次做。没有官方资料,但是网上是知识点海洋,可以吸取。
我的开发环境是ubuntu 14.04 x64.
首先,读这篇文章之前,请先阅读这个博客:
可以参考这个链接的文章,和我现在做的比较相近:
https://blog.csdn.net/u010134087/article/details/54315748
2. 步骤
下面是各个步骤:
a. step001:
参考4418的nfc驱动,发现,4418的驱动位置:
./linux/kernel/kernel-3.4.39/drivers/nfc/pn544.c./linux/kernel/kernel-3.4.39/drivers/nfc/pn5xx.ko./linux/kernel/kernel-3.4.39/include/config/nfc/nxp/pn5xx.h./linux/kernel/kernel-3.4.39/include/linux/nfc/pn5xx_i2c.h./linux/kernel/kernel-3.4.39/include/linux/nfc/pn544.h
还需要头文件,在如下目录:
./include/linux/nfc/bcm2079x.h ./include/linux/nfc/pn544.h./include/linux/nfc/pn5xx_i2c.h
不要问我为什么知道,这些都是根据经验,判断应是用的是pn5xx的驱动,生成的是pn5xx.ko
下面,看看如何实现这个驱动。
b. step002:
同样,调试好nfc的s5p4418 android 5.1的工程项目里面,
./linux/kernel/kernel-3.4.39/include/config/nfc
里面的文件夹,牛工已经把android 6818的和4418的nfc都拷贝到那边去了,但是我发现内核,还没有配置好nfc,所以编译不出nfc的ko,
于是,我进入4418 android 5.1的内核,make menuconfig查看,果然发现和6818的内核配置不一样,6818的驱动已经配置进去,但是没有选择编译进去。
这个是android 5.1 linux内核配置:
NXP PN5XX based driver │ │ NFC_HSJ160 based driver
网上说,调试这个,找官方的fae拿到的资料如下名字:
NFC_NCIHALx_ARF.3.3.0_L_FW08.01.26_FW10.01.14 下载, 但是我找不到,公司也没有找nxp的fea。我先参考别人的做饭试试。
c. step003:
我把6816的内核加入了驱动,编译通过,下载到设备中,发现没有生成节点/dev/pn5xx,于是我用dmesg查看了一下加载驱动过程的信息,发现,原来驱动没加载成功,
只看到一个初始化的信息: pn54x_dev_init, 查询驱动代码:
static int __init pn54x_dev_init(void){ pr_info(" %s\n", __func__);//这里的打印,但是,其实还有一个probe的函数没有执行,因为系统没生成/dev/pn5xx节点return i2c_add_driver(&pn54x_driver);}
于是我得加入更多的代码去调试跟着驱动为何没加载,是不是因为板级文件没有修改和注册i2c?? 对待,没有在板级文件加入,因为我们的6818不用设备树,只能在板级文件注册。
在板级文件 arch/arm/plat-s5p6818/Puma/device.c ,在文件头部定义部分,中加入如下代码,具体位置自己看文件结构和源码很容易判断,就是定一个结构体:
#if defined(CONFIG_NFC_NXP_PN5XX) || defined(CONFIG_NFC_NXP_PN5XX_MODULE)#include #defineNFC_PN5XX_I2C_BUS(0)static struct pn544_i2c_platform_data nfc_pdata = { .irq_gpio = PAD_GPIO_C +2/*GPIO_TO_PIN(2,2)*/,.ven_gpio = PAD_GPIO_C +25/*GPIO_TO_PIN(2,25)*/,.firm_gpio = GPIO_UNUSED,.clkreq_gpio = GPIO_UNUSED,};static struct i2c_board_info __initdata nfc_board_info[] = { { I2C_BOARD_INFO("pn547", 0x28),.platform_data = &nfc_pdata,},};#endif
d. step004:
还要在同一arch/arm/plat-s5p6818/Puma/device.c 中的void __init nxp_board_devs_register(void)函数里面,加入加入板级信息:
#if defined(CONFIG_NFC_NXP_PN5XX) || defined(CONFIG_NFC_NXP_PN5XX_MODULE)printk("plat: add nfc(pn5xx) device\n");i2c_register_board_info(NFC_PN5XX_I2C_BUS, nfc_board_info, 1);#endif
这个表示注册动作,启动的时候会调用到, 如果不知怎样去写,参考其他的设备,你会知道怎么写的。
否则,会编译提示警告:
arch/arm/plat-s5p6818/Puma/device.c:850:41: warning: ‘nfc_board_info’ defined but not used [-Wunused-variable]
编译通过,不会出错,也不会提示警告。编译完成之后,烧录新的内核,你会在dev下面发现节点:
/dev/pn544
e. step005:
完成了 Kernel 部分的移植后可以开始上层代码的移植了。
上层代码的移植
external/libnfc-nci 删除后用 NXP 提供的代码替换。packages/apps/Nfc 删除后用 NXP 提供的代码替换。frameworks/base/core/java/android/nfc 删除后用 NXP 提供的代码替换。frameworks/base/core/java/com/nxp 删除后用 NXP 提供的代码替换。frameworks/base/core/java/com/vzw 删除后用 NXP 提供的代码替换。对比修改 frameworks/base/Android.mk 文件。主要是添加 NFC 相关的语句。
device/下的平台文件进行对比添加。
的 device-common.mk 为平台的 mk,这个里面需要添加的内容较多。
————————————————
版权声明:本文为CSDN博主「Younix脏羊」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dearsq/article/details/50585287
f. step006:
编译系统之后,会在在释放的代码 external\libnfc-nci\halimpl\pn54x 目录下我们可以看到
libnfc-brcm_sample.conf
libnfc-nxp-PN547C2_example.conf
libnfc-nxp-PN548C2_example.conf
三个文件。
将 libnfc-brcm_sample.conf 改名为 libnfc-brcm.conf
选取符合自己情况的 libnfc-nxp-PN54xC2_example.conf 并改名为 libnfc-nxp.conf
我是选择之前的项目中4.4android的nfc的配置文件,因为我没有找到官方的包,用别人用的保险!
g. step007:
参考android5.1 4418成功的nfc配置,在devicd.mk文件中,添加如下:
PRODUCT_PACKAGES += \libnfc-nci \libnfc_nci_jni \nfc_nci_pn54x.default \NfcNci \Tag \com.android.nfc_extrasPRODUCT_COPY_FILES += \frameworks/native/data/etc/com.nxp.mifare.xml:system/etc/permissions/com.nxp.mifare.xml \frameworks/native/data/etc/com.android.nfc_extras.xml:system/etc/permissions/com.android.nfc_extras.xml \frameworks/native/data/etc/android.hardware.nfc.xml:system/etc/permissions/android.hardware.nfc.xml \frameworks/native/data/etc/android.hardware.nfc.hce.xml:system/etc/permissions/android.hardware.nfc.hce.xmlPRODUCT_COPY_FILES += \device/nexell/weiqian/nfc/hsj160.ko:/system/lib/modules/hsj160.ko \device/nexell/weiqian/nfc/pn5xx.ko:/system/lib/modules/pn5xx.ko \device/nexell/weiqian/nfc/libnfc-brcm.conf:system/etc/libnfc-brcm.conf \device/nexell/weiqian/nfc/libnfc-nxp.conf:system/etc/libnfc-nxp.conf
执行最后面的那个PRODUCT_COPY_FILES动作的时候,要先确保device/nexell/weiqian/nfc文件存在,从你编译好的内核路径里面,
拷贝对应的ko文件,和conf文件到device/nexell/weiqian/nfc文件夹,没有及建立一个。
mkdir device/nexell/weiqian/nfc
cp -vf ./kernel/drivers/nfc/.ko ./device/nexell/weiqian/nfc/
cp -vf /home_WQ/android51/device/nexell/weiqian/nfc/.conf ./device/nexell/weiqian/nfc/
h. step008:
关于上面的文件,我心存疑问,到底6818是否和4418一样齐全呢?? 我得亲自查找一下,PRODUCT_PACKAGES:
我尝试查找了一下,发现:
find ./ -name "libnfc_nci_jni.so"./result/system/lib/libnfc_nci_jni.so./result/system/app/NfcNci/lib/arm/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/symbols/system/lib/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/obj/SHARED_LIBRARIES/libnfc_nci_jni_intermediates/LINKED/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/obj/lib/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/system/lib/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/system/app/NfcNci/lib/arm/libnfc_nci_jni.so
只要按照官方的说明,或者网上的说明移植了上层的代码,就会有libnfc_nci_jni.so文件,所以不必担心。
但是libnfc_nci.so,我在android5.1 4418中,和android 4.4 4418中,都可查找到,就是在6818文件夹中,找不到。于是我到网上搜索,
发现原来,是在packages/apps/Nfc/nci里面编译生成的!网上这样说:
packages/apps/Nfc/nci 将会在 /system/lib 下生成 libnfc_nci_jni.so ,将在 /system/app/NfcNci 生成 NfcNci.apk
external/libnfc-nci 将会在 /system/lib 下生成 libnfc_nci.so,将在 /system/lib/hw 下生成 nfc_nci_pn54x.default.so
于是我对比例两个工程的对应的文件夹,meld ./packages/apps/Nfc/ /home_WQ/android51/packages/apps/Nfc/
这两个文件夹竟然一模一样,所有文件没有不一样,为啥不产生libnfc_nci.so文件呢??
我决定单独编译这部分的文件:
mmm ./packages/apps/Nfc/nci/
这样就能查找了!
find ./ -name "libnfc_nci_jni.so"./result/system/lib/libnfc_nci_jni.so./result/system/app/NfcNci/lib/arm/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/symbols/system/lib/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/obj/SHARED_LIBRARIES/libnfc_nci_jni_intermediates/LINKED/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/obj/lib/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/system/lib/libnfc_nci_jni.so./out/target/product/s5p6818_Puma/system/app/NfcNci/lib/arm/libnfc_nci_jni.so
紧接着,我继续查找了一下6818d的NfcNci.apk是否存在,结果发现是存在的,也就是说编出来了!
./result/system/app/NfcNci/NfcNci.apk
./out/target/product/s5p6818_Puma/system/app/NfcNci/NfcNci.apk
接着确定find ./ -name “nfc_nci_pn54x.default.so”, 结果发现,这个文件不存在!
很明显,根据网上资料和我其他工程资料的提示,应该是:
mmm ./external/libnfc-nci/
于是就出现了!
i. step009:
初步检查和调试完成,于是我可以make整个android,然后下在到板子上验证,结果发现还是打不开,我查询总结了一下:
进入android系统,进入设置,打开nfc,打不开! 发现报错如下:
E/NfcAdaptation( 697): NfcAdaptation::Initialize: ver=NFCDROID-AOSP_L_00.01 nfa=NFA_PI_1.03.66+E/NxpTml ( 697): _i2c_open() Failed: retval ffffffffE/NxpHal ( 697): phTmlNfc_Init FailedE/BrcmNfcJni( 697): nfcManager_doInitialize: fail nfa enable; error=0x0
怀疑是不是GPIO不对!电位不对??但是linux内存层的驱动已经做好了啊,根据板级文件,可以知道用到的两个io情况如下:
.irq_gpio = PAD_GPIO_C +2/GPIO_TO_PIN(2,2)/,
.ven_gpio = PAD_GPIO_C +25/GPIO_TO_PIN(2,25)/,
查看文件。
kernel/arch/arm/plat-s5p6818/Puma/include/cfg_gpio.h
发现并无什么异常,应该跟ip配置无关,就算之前配置错了,那么驱动中也是直接可以设定io的,所以和预先配置的 io 模式应该无关。继续往下看,在网上看到官方的一份资料
里面说,还需要在init.xxx.rc中改变一些权限,和节点从关系的。真的我就查看之前4418 android 4.4的问情况:
果然发现,还需要,在gedit ./device/nexell/s5p6818_Puma/init.s5p6818_Puma.rc里面加入:
# nfc setprop ro.nfc.port "I2C" chmod 0660 /dev/pn544 chown nfc nfc /dev/pn544
这个官方的说明资料,在附件中,你可以看看。
添加完这个东西之后,重新生成镜像,下载进去,再次进入系统,进入“设置”,“更多”,打开nfc,成功了哦!然后我把公司的饭卡放上去,果然系统提示生意,可以独傲nfc标签了!
之后接着安装一个nfc读取软件,去读取,果然正常读到数据。ok,到此为止,nfc调试成功, 耗时大半天。
结语
耐心,细心,善于搜索过滤网上资料为自己所有,才能让自己事半功倍。
更多相关文章
- windows系统上安装与使用Android(安卓)NDK r5
- android LruCache 原理 以及 源代码解析
- Android(安卓)Debug Bridge
- android apk 防止反编译技术第二篇-运行时修改字节码
- ANDROID导入文件后的本地无法编译生成R.java的问题
- android 修改host 文件
- Android(安卓)使用 Gradle 自增长版本号 并更改打包文件名称
- Android事件分发机制完全解析
- android基础学习--->Android(安卓)SharedPreferences存储对象和