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)在线全文阅读。
相关推荐: