PN544驱动,nfc驱动移植,android的驱动移植,pn574nfc驱动

>PN544驱动,nfc驱动移植
>pn5xx driver, nfc driver
>pnx544 nfc移植
>安卓nfc驱动移植



1. 原因


公司要我在我们的s5p6818的安卓设备上移植pn5xx的nfc驱动,之前有人做过,我第一次做。没有官方资料,但是网上是知识点海洋,可以吸取。

我的开发环境是ubuntu 14.04 x64.

首先,读这篇文章之前,请先阅读这个博客:

可以参考这个链接的文章,和我现在做的比较相近:
https://blog.csdn.net/u010134087/article/details/54315748

2. 步骤


下面是各个步骤:

### a. step001:
参考4418的nfc驱动,发现,4418的驱动位置:
```sh
./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
```

还需要头文件,在如下目录:

```sh
./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内核配置:

```sh
<M> NXP PN5XX based driver │ │
<M> 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 <linux/nfc/pn5xx_i2c.h>
#define NFC_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文件中,添加如下:

```sh
PRODUCT_PACKAGES += \
libnfc-nci \
libnfc_nci_jni \
nfc_nci_pn54x.default \
NfcNci \
Tag \
com.android.nfc_extras

PRODUCT_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.xml

PRODUCT_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:
我尝试查找了一下,发现:

```sh
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 ffffffff
E/NxpHal ( 697): phTmlNfc_Init Failed
E/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调试成功,, 耗时大半天。


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

猜你喜欢

转载自www.cnblogs.com/mynameislinduan/p/12330034.html
今日推荐