77范文网 - 专业文章范例文档资料分享平台

NXP恩智浦 PN544 driver驱动程序(2)

来源:网络收集 时间:2020-08-23 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

204 pr_err(\, 205 __func__, ret); 206 return -EIO; 207 }

208 209 if (copy_to_user(buf, tmp, ret)) { 210 pr_err(\, __func__); 211 return -EFAULT; 212 } 213 }

214 215 return ret;

216 217 fail: 218 mutex_unlock(&pn544_dev->read_mutex);

219 220 return ret; 221 }

222 223 static ssize_t pn544_dev_write(struct file *filp, const char __user *buf, 224 size_t count, loff_t *offset) 225 { 226 struct pn544_dev *pn544_dev; 227 char tmp[MAX_BUFFER_SIZE]; 228 int ret;

229 230 pn544_dev = filp->private_data;

231 232 #if NFC_DEBUG 233 pr_info(\); 234 #endif

235 236 if (count > MAX_BUFFER_SIZE) 237 count = MAX_BUFFER_SIZE;

238 239 if (copy_from_user(tmp, buf, count)) { 240 pr_err(\, __func__); 241 return -EFAULT; 242 }

243 244 pr_debug(\, __func__, count);

245 /* Write data */ 246 ret = i2c_master_send(pn544_dev->client, tmp, count);

247 248 #if NFC_DEBUG 249 pr_info(\); 250 #endif

251 252 if (ret != count) { 253 pr_err(\, __func__, ret); 254 ret = -EIO; 255 }

256 257 return ret; 258 }

259 260 static int pn544_dev_open(struct inode *inode, struct file *filp) 261 { 262 struct pn544_dev *pn544_dev = container_of(filp->private_data, 263 struct pn544_dev, 264 pn544_device);

265 266 filp->private_data = pn544_dev;

267 268 pr_debug(\, __func__, imajor(inode), iminor(inode));

269 270 return 0; 271 }

272 273 static int pn544_dev_ioctl(struct inode *inode, struct file *filp, 274 unsigned int cmd, unsigned long arg) 275 { 276 struct pn544_dev *pn544_dev = filp->private_data;

277 278 switch (cmd) {

case PN544_SET_PWR: 279 280 if (arg == 2) { 281 /* power on with firmware download (requires hw reset) 282 */ 283 pr_info(\, __func__); 284 gpio_set_value(pn544_dev->ven_gpio, 1); 285 gpio_set_value(pn544_dev->firm_gpio, 1);

286 msleep(10); 287 gpio_set_value(pn544_dev->ven_gpio, 0); 288 msleep(10); 289 gpio_set_value(pn544_dev->ven_gpio, 1); 290 msleep(10); 291 } else if (arg == 1) { 292 /* power on */ 293 pr_info(\, __func__); 294 gpio_set_value(pn544_dev->firm_gpio, 0); 295 gpio_set_value(pn544_dev->ven_gpio, 1); 296 msleep(10); 297 } else if (arg == 0) { 298 /* power off */ 299 pr_info(\, __func__); 300 gpio_set_value(pn544_dev->firm_gpio, 0); 301 gpio_set_value(pn544_dev->ven_gpio, 0); 302 msleep(10); 303 } else { 304 pr_err(\, __func__, arg); 305 return -EINVAL; 306 } 307 break; 308 default: 309 pr_err(\, __func__, cmd); 310 return -EINVAL; 311 }

312 313 return 0; 314 }

315 316 static const struct file_operations pn544_dev_fops = { 317 .owner = THIS_MODULE, 318 .llseek = no_llseek, 319 .read = pn544_dev_read, 320 .write = pn544_dev_write, 321 .open = pn544_dev_open, 322 .ioctl = pn544_dev_ioctl, 323 };

324 325 static int pn544_probe(struct i2c_client *client, 326 const struct i2c_device_id *id)

327 { 328 int ret; 329 struct pn544_i2c_platform_data *platform_data; 330 struct pn544_dev *pn544_dev;

331 332 platform_data = client->dev.platform_data;

333 334 if (platform_data == NULL) { 335 pr_err(\, __func__); 336 return -ENODEV; 337 }

338 339 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 340 pr_err(\, __func__); 341 return -ENODEV; 342 }

343 344 ret = gpio_request(platform_data->irq_gpio, \); 345 if (ret) 346 return -ENODEV; 347 ret = gpio_request(platform_data->ven_gpio, \); 348 if (ret) 349 goto err_ven; 350 ret = gpio_request(platform_data->firm_gpio, \); 351 if (ret) 352 goto err_firm;

353 354 pn544_dev = kzalloc(sizeof(*pn544_dev), GFP_KERNEL); 355 if (pn544_dev == NULL) { 356 dev_err(&client->dev, 357 \); 358 ret = -ENOMEM; 359 goto err_exit; 360 }

361 362 pr_info(\, __func__, client->irq);

363 364 pn544_dev->irq_gpio = platform_data->irq_gpio; 365 pn544_dev->ven_gpio = platform_data->ven_gpio; 366 pn544_dev->firm_gpio = platform_data->firm_gpio; 367 pn544_dev->client = client;

368 369 /* init mutex and queues */ 370 init_waitqueue_head(&pn544_dev->read_wq); 371 mutex_init(&pn544_dev->read_mutex); 372 spin_lock_init(&pn544_dev->irq_enabled_lock);

373 374 pn544_dev->pn544_device.minor = MISC_DYNAMIC_MINOR; 375 pn544_dev->pn544_device.name = \; 376 pn544_dev->pn544_device.fops = &pn544_dev_fops;

377 378 ret = misc_register(&pn544_dev->pn544_device); 379 if (ret) { 380 pr_err(\, __FILE__); 381 goto err_misc_register; 382 }

383 384 /* request irq. the irq is set whenever the chip has data available 385 * for reading. it is cleared when all data has been read. 386 */ 387 pr_info(\, __func__, client->irq); 388 pn544_dev->irq_enabled = true; 389 gpio_direction_input(pn544_dev->irq_gpio); 390 ret = request_irq(client->irq, pn544_dev_irq_handler, 391 IRQF_TRIGGER_RISING, \, pn544_dev); 392 if (ret) { 393 dev_err(&client->dev, \); 394 goto err_request_irq_failed; 395 } 396 pn544_disable_irq(pn544_dev); 397 #ifdef CONFIG_TARGET_LOCALE_KOR 398 enable_irq_wake(client->irq); 399 #endif 400 i2c_set_clientdata(client, pn544_dev);

401 402 return 0;

403 404 err_request_irq_failed: 405 misc_deregister(&pn544_dev->pn544_device); 406 err_misc_register: 407 mutex_destroy(&pn544_dev->read_mutex); 408 kfree(pn544_dev);

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库NXP恩智浦 PN544 driver驱动程序(2)在线全文阅读。

NXP恩智浦 PN544 driver驱动程序(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/1144764.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: