1.驱动调试
1.1 NfcFactoryTestApp测试程序
配置完驱动,可以先用测试程序NfcFactoryTestApp试一下nfc通讯是否成
1.先关闭adb shell svc nfc disable
2 ./NfcFactoryTestApp
1.2 也可以在驱动里添加nfc i2c通讯检测
drivers/nfc/nfc/i2c_drv.c
@@ -101,6 +101,47 @@ static irqreturn_t i2c_irq_handler(int irq, void *dev_id)
return IRQ_HANDLED;
}
+//start add detect nfc ic func by lpz 20230926
+static int nfc_i2c_test(struct i2c_client *client){
+ int ret;
+ char NCICoreReset[] = {0x20, 0x00, 0x01, 0x01};
+ char NCIEnableStandby[] = {0x2F, 0x00, 0x01, 0x01};
+ char Answer[256];
+
+ ret = i2c_master_send(client, NCICoreReset,4);
+ if (ret <= 0) {
+ printk("[lpz]%s: write NCICoreReset failed ret(%d), maybe in standby\n",__func__, ret);
+ return ret;
+ }else{
+ printk("[lpz]%s: write NCICoreReset succeed, ret(%d)\n",__func__, ret);
+ }
+ msleep(100);
+
+ ret = i2c_master_send(client, NCIEnableStandby,4);
+ if (ret <= 0) {
+ printk("[lpz]%s: write NCIEnableStandby failed ret(%d), maybe in standby\n",__func__, ret);
+ return ret;
+ }else{
+ printk("[lpz]%s: write NCIEnableStandby succeed, ret(%d)\n",__func__, ret);
+ }
+ msleep(10);
+
+ /* Read data, Answer[0] = 0x40*/
+ memset(Answer, 0, sizeof(Answer));
+ ret = i2c_master_recv(client, Answer, 256);
+ printk("[lpz]%s: Read Answer[0]=0x%x, Answer[1]=0x%x, Answer[2]=0x%x, Answer[3]=0x%x, ret(%d)\n",
+ __func__, Answer[0],Answer[1],Answer[2],Answer[3],ret);
+ if(ret>0 && Answer[0]!=0x00){
+ printk("[lpz]%s: NXP NFC controller detected succeed\n",__func__);
+ return 1;
+ }else{
+ printk("[lpz]%s: NXP NFC controller detected failed\n",__func__);
+ return -1;
+ }
+ return 1;
+}
+//end add detect nfc ic func by lpz 20230926
+
int i2c_read(struct nfc_dev *nfc_dev, char *buf, size_t count, int timeout)
{
int ret;
@@ -361,31 +402,11 @@ int nfc_i2c_dev_probe(struct i2c_client *client, const struct i2c_device_id *id)
goto err_free_gpio;
}
client->irq = ret;
ret = configure_gpio(nfc_gpio->dwl_req, GPIO_OUTPUT);
if (ret) {
pr_err("%s: unable to request nfc firm downl gpio [%d]\n",
__func__, nfc_gpio->dwl_req);
}
/* copy the retrieved gpio details from DT */
memcpy(&nfc_dev->configs, &nfc_configs,
@@ -413,15 +434,32 @@ int nfc_i2c_dev_probe(struct i2c_client *client, const struct i2c_device_id *id)
goto err_nfc_misc_unregister;
}
i2c_disable_irq(nfc_dev);
+ set_valid_gpio(nfc_gpio->dwl_req, 0);
gpio_set_ven(nfc_dev, 1);
gpio_set_ven(nfc_dev, 0);
+ msleep(10);
gpio_set_ven(nfc_dev, 1);
+ msleep(100);
device_init_wakeup(&client->dev, true);
i2c_set_clientdata(client, nfc_dev);
i2c_dev->irq_wake_up = false;
+//start add detect nfc ic func by lpz 20230926
+ ret = nfc_i2c_test(client);
+ if(ret > 0){
+ printk("[lpz]%s: nfc_i2c_test ok\n",__func__);
+ }else{
+ printk("[lpz]%s: nfc_i2c_test fail\n",__func__);
+ goto i2c_test_fail;
+ }
+//end add detect nfc ic func by lpz 20230926
- pr_info("%s: probing nfc i2c successfully\n", __func__);
+ pr_info("%s: probing i2c nfc-np7160 successfully\n", __func__);
return 0;
+i2c_test_fail:
err_nfc_misc_unregister:
nfc_misc_unregister(nfc_dev, DEV_COUNT);
err_mutex_destroy:
@@ -437,7 +475,7 @@ err_free_read_kbuf:
err_free_nfc_dev:
kfree(nfc_dev);
err:
- pr_err("%s: probing not successful, check hardware\n", __func__);
+ pr_err("%s: probing i2c nfc-np7160 fail, check hardware!!!\n", __func__);
return ret;
}
2.Android层移植
Manifest.xml编译FCM Version报错不通过
报错如下:
patch:
--- a/device/rockchip/common/manifest.xml
+++ b/device/rockchip/common/manifest.xml
@@ -66,6 +66,24 @@
<instance>default</instance>
</interface>
</hal>
+ <hal format="hidl">
+ <name>android.hardware.nfc</name>
+ <transport>hwbinder</transport>
+ <version>1.2</version>
+ <interface>
+ <name>INfc</name>
+ <instance>default</instance>
+ </interface>
+ </hal>
+ <hal format="hidl">
+ <name>vendor.nxp.nxpnfc</name>
+ <transport>hwbinder</transport>
+ <version>1.0</version>
+ <interface>
+ <name>INxpNfc</name>
+ <instance>default</instance>
+ </interface>
+ </hal>