Android linux adc驱动(s5pv210)


struct adc_sensor_t{struct s3c_adc_client *client;struct class*class;struct cdev cdev;dev_t devno;intdata;unsigned charchannel;};static struct adc_sensor_t adc_sensor_dev;static ssize_t adc_sensor_read(struct file *file, char __user *buff, size_t count, loff_t *offset){//unsigned data;//unsigned ch;//data = 10;//ch = 0;adc_sensor_dev.data = s3c_adc_read(adc_sensor_dev.client, adc_sensor_dev.channel);DLOG(KERN_INFO "data AIN%d is %d\n", adc_sensor_dev.channel, adc_sensor_dev.data);if(copy_to_user(buff, (char *)&adc_sensor_dev.data, sizeof(int)))return -EFAULT;return 0;}static long adc_sensor_ioctl(struct file *filp,unsigned int cmd,unsigned long arg){if(cmd == ADC_SENSOR_IOCTL_SETCH){if(arg >= ADC_CHANNEL_NUM) return -1;adc_sensor_dev.channel = arg;}return 0;}static int adc_sensor_open(struct inode *inode, struct file *file){return 0;}static int adc_sensor_release(struct inode *inode, struct file *file){return 0;}static struct file_operations adc_sensor_fops = {.owner = THIS_MODULE,.unlocked_ioctl = adc_sensor_ioctl,.read = adc_sensor_read,.open = adc_sensor_open,.release = adc_sensor_release,};static int __devinit adc_sensor_probe( struct platform_device *pdev ){struct device *dev = &pdev->dev;int ret = -EINVAL;DLOG("%s start\n", __func__);adc_sensor_dev.devno = MKDEV(DEVICE_MAJOR, DEVICE_MINOR);ret = register_chrdev_region(adc_sensor_dev.devno, DEVICE_NUMBER, DEVICE_NAME);if(ret < 0){ret = alloc_chrdev_region(&adc_sensor_dev.devno, 0, DEVICE_NUMBER, DEVICE_NAME);if(ret < 0){dev_err(dev, "failed to register device number\n");goto err_register_chrdev_region;}}cdev_init(&adc_sensor_dev.cdev, &adc_sensor_fops);adc_sensor_dev.cdev.owner = THIS_MODULE;ret = cdev_add(&adc_sensor_dev.cdev, adc_sensor_dev.devno, DEVICE_NUMBER);if( ret ){dev_err(dev, "failed to add device\n");goto err_cdev_add;}adc_sensor_dev.client = s3c_adc_register (pdev, NULL, NULL, 0);if(IS_ERR(adc_sensor_dev.client)){dev_err(dev, "failed to register adc client\n");goto err_s3c_adc_register;}adc_sensor_dev.class = class_create(THIS_MODULE, DEVICE_NAME);if(IS_ERR(adc_sensor_dev.class)){DLOG(KERN_ERR "%s:failed to  class_create\n", __func__);goto err_class_create;}device_create(adc_sensor_dev.class, NULL, adc_sensor_dev.devno, NULL, DEVICE_NAME);adc_sensor_dev.channel = 4;adc_sensor_dev.data = 0;return 0;err_class_create:err_s3c_adc_register:cdev_del(&adc_sensor_dev.cdev );err_cdev_add:unregister_chrdev_region(adc_sensor_dev.devno, DEVICE_NUMBER);err_register_chrdev_region:return ret;}static int __devexit adc_sensor_remove(struct platform_device *pdev){s3c_adc_release(adc_sensor_dev.client);cdev_del(&adc_sensor_dev.cdev );device_destroy(adc_sensor_dev.class, adc_sensor_dev.devno);class_destroy(adc_sensor_dev.class);unregister_chrdev_region(adc_sensor_dev.devno, DEVICE_NUMBER);return 0;}static struct platform_driver adc_sensor_driver = {.driver = {.name = "adc",.owner = THIS_MODULE,},.probe = adc_sensor_probe,.remove = __devexit_p(adc_sensor_remove)};static int __init adc_sensor_init(void){return platform_driver_register(&adc_sensor_driver );}static void __exit adc_sensor_exit (void){platform_driver_unregister(&adc_sensor_driver );}module_init(adc_sensor_init);module_exit(adc_sensor_exit);MODULE_AUTHOR("jvaemape");MODULE_DESCRIPTION("S3C2440 ADC Sensor Drive");MODULE_LICENSE("Dual BSD/GPL");


更多相关文章

  1. S5PV210 Android(安卓)触摸按键驱动解析
  2. [6410][android]给android cupcake移植FB、Nand、触摸屏和DM9000
  3. android系统学习笔记二
  4. Android: Android(安卓)Architecture
  5. android 从驱动到应用(二)
  6. android系统学习笔记二
  7. 为Android内核添加新驱动,并添加到menuconfig菜单【实践简记】
  8. Android: Android(安卓)Architecture
  9. Camera驱动开发 - 基于高通MSM8660 + Android(安卓)2.3

随机推荐

  1. mysql 8.0.18 安装配置方法图文教程
  2. MySQL数据库中null的知识点总结
  3. MySQL中sleep函数的特殊现象示例详解
  4. Mysql 8.0.18 hash join测试(推荐)
  5. MySQL 8.0 新特性之哈希连接(Hash Join)
  6. mysql快速获得库中无主键的表实例代码
  7. mysql实现设置定时任务的方法分析
  8. MySQL如何为字段添加默认时间浅析
  9. MySQL InnoDB row_id边界溢出验证的方法
  10. 详解Mysql5.7自带的压力测试命令mysqlsla