z3j6w9 发表于 2017-6-16 14:06:43

之前实现的一个adc驱动,贴一下

#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");

raindy_s 发表于 2017-6-23 11:13:29

正在看这方面的内容,先收藏!谢谢!

cheng_86 发表于 2017-7-14 10:44:30

ADC   MARK
页: [1]
查看完整版本: 之前实现的一个adc驱动,贴一下