|
之前实现的一个adc驱动,贴一下
发表于 2017-6-16 14:06:43
浏览:11706
|
回复:2
打印
只看该作者
[复制链接]
楼主
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/delay.h>
- #include <linux/gpio.h>
- #include <linux/fs.h>
- #include <linux/cdev.h>
- #include <linux/slab.h>
- #include <linux/uaccess.h>
- #include <linux/interrupt.h>
- #include <asm/irq.h>
- #include <linux/iio/consumer.h>
- #ifdef CONFIG_OF
- #include <linux/of.h>
- #include <linux/of_gpio.h>
- #include <linux/of_platform.h>
- #endif
- #define DESC(x) 1
- #if DESC("global area")
- static int global_major;
- static struct class *adc0_class;
- static struct device *adc0_device;
- static struct device *adc0_dev = NULL;
- #endif
- static int adc0_probe(struct platform_device *pdev)
- {
- /*Get io channel*/
- adc0_dev = &pdev->dev;
- printk("%s \n", __FUNCTION__);
-
- return 0;
-
- }
- static int adc0_remove(struct platform_device *pdev)
- {
- return 0;
- }
- static const struct of_device_id of_adc0_match[] = {
- { .compatible = "sunrex,adc_test" },
- { /* Sentinel */ }
- };
- static struct platform_driver adc0_driver = {
- .probe = adc0_probe,
- .remove = adc0_remove,
- .driver = {
- .owner = THIS_MODULE,
- .name = "adc0",
- #ifdef CONFIG_OF
- .of_match_table = of_adc0_match,
- #endif
- },
- };
- static ssize_t adc0_read(struct file *filep, char __user *usrbuf, size_t size, loff_t *offset)
- {
-
- int val,ret;
- struct iio_channel *chan; //定义 IIO 通道结构体
- printk("%s \n", __FUNCTION__);
- chan = iio_channel_get(adc0_dev, NULL); //获取 IIO 通道结构体
- ret = iio_read_channel_raw(chan, &val);
- printk("adc0 value = %u \n", val);
- if (ret < 0)
- {
- printk("Read channel failed. \n");
- return EIO;
- }
- copy_to_user(usrbuf, (void *)&val, size);
- return 0;
- }
- static ssize_t adc0_write(struct file *filep, const char __user *usrbuf, size_t size, loff_t *offset)
- {
- return 0;
- }
- static int adc0_open(struct inode *inode, struct file *filep)
- {
- return 0;
- }
- static int adc0_release(struct inode *inode, struct file *filep)
- {
- return 0;
- }
- static struct file_operations motor_fops = {
- .owner = THIS_MODULE,
- .read = adc0_read,
- .write = adc0_write,
- .open = adc0_open,
- .release = adc0_release,
- };
- static int __init adc0_init(void)
- {
- /*system will auto allocate major*/
- global_major = register_chrdev(0, "adc0", &motor_fops);
- /*create class*/
- adc0_class = class_create(THIS_MODULE, "adc0_drv");
- /*create device for app*/
- adc0_device = device_create(adc0_class, NULL, MKDEV(global_major, 0), NULL, "adc0");
-
- //if (ret < 0)
- // return ret;
- platform_driver_register(&adc0_driver);
- return 0;
- }
- static void __exit adc0_exit(void)
- {
- platform_driver_unregister(&adc0_driver);
- device_destroy(adc0_class,MKDEV(global_major, 0));
- class_destroy(adc0_class);
- //unregister_chrdev_region(MKDEV(global_major, 0), 1);
- unregister_chrdev(global_major, "adc0");
- }
- module_init(adc0_init);
- module_exit(adc0_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("zhang jiawei");
复制代码 |
|