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调试成功, 耗时大半天。

结语

耐心,细心,善于搜索过滤网上资料为自己所有,才能让自己事半功倍。

更多相关文章

  1. windows系统上安装与使用Android(安卓)NDK r5
  2. android LruCache 原理 以及 源代码解析
  3. Android(安卓)Debug Bridge
  4. android apk 防止反编译技术第二篇-运行时修改字节码
  5. ANDROID导入文件后的本地无法编译生成R.java的问题
  6. android 修改host 文件
  7. Android(安卓)使用 Gradle 自增长版本号 并更改打包文件名称
  8. Android事件分发机制完全解析
  9. android基础学习--->Android(安卓)SharedPreferences存储对象和

随机推荐

  1. mysql免安装版配置教程
  2. 新装MySql后登录出现root帐号提示mysql E
  3. mysql count详解及函数实例代码
  4. CentOS下重启Mysql的各种方法(推荐)
  5. Mysql5.7.14安装配置方法操作图文教程(密
  6. mysql 详解隔离级别操作过程(cmd)
  7. macOS Sierra安装Apache2.4+PHP7.0+MySQL
  8. MyBatis 如何写配置文件和简单使用
  9. win10免安装版本的MySQL安装配置教程
  10. Mac下安装mysql5.7 完整步骤(图文详解)