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調試成功,, 耗時大半天。


 結語
耐心,細心,善於搜索過濾網上資料為自己所有,才能讓自己事半功倍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM