linux设备驱动程序开发--并口控制LED的驱动源码

本文详细介绍了如何在Linux系统中编写并口控制LED的驱动程序,包括设备注册、文件操作、驱动初始化和退出等关键步骤。
摘要由CSDN通过智能技术生成

linux设备驱动程序开发--并口控制LED的驱动源码

并口编程一些重要的函数

编写并行接口字符驱动程序

truct pardevice *pdev;
parport_claim_or_block(pdev);请求并口
parport_write_data(pdev->port,buf);
parport_release(pdev);释放并口

parport_register_device();
parport_register_driver();
parport_unregister_driver();

并口控制LED的驱动源码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/parport.h>
#include <asm/uaccess.h>
#include <linux/platform_device.h>
#include <linux/pci.h>
#include <linux/device.h> //class

#define DEVICE_NAME "led"

static dev_t dev_number; /* Allotted device number */
static struct class *led_class; /* Class to which this device
                                   belongs */
struct cdev led_cdev; /* Associated cdev */
struct pardevice *pdev; /* Parallel port device */

/* LED open */
int led_open(struct inode *inode, struct file *file)
{
    return 0;
}

/* Write to the LED */
ssize_t led_write(struct file *file, const char *buf,size_t count, loff_t *ppos)
{
    char kbuf;
    if (copy_from_user(&kbuf, buf, 1)) return -EFAULT;
    /* Claim the port */
    parport_claim_or_block(pdev);
    /* Write to the device */
    parport_write_data(pdev->port, kbuf);
    /* Release the port */
    parport_release(pdev);
    return count;
}

/* Release the device */
int led_release(struct inode *inode, struct file *file)
{
    return 0;
}

/* File Operations */
static struct file_operations led_fops = {
    .owner = THIS_MODULE,
    .open = led_open,
    .write = led_write,
    .release = led_release,
};

static int
led_preempt(void *handle)
{
    return 1;
}

/* Parport attach method */
static void led_attach(struct parport *port)
{
    /* Register the parallel LED device with parport */
    pdev = parport_register_device(port, DEVICE_NAME,
         led_preempt, NULL,
         NULL, 0, NULL);
    if (pdev == NULL) printk("Bad register\n");
}

/* Parport detach method */
static void led_detach(struct parport *port)
{
    /* Do nothing */
}

/* Parport driver operations */
static struct parport_driver led_driver = {
    .name = "led",
    .attach = led_attach,
    .detach = led_detach,
};

/* Driver Initialization */
int __init led_init(void)
{
    /* Request dynamic allocation of a device major number */
    if (alloc_chrdev_region(&dev_number, 0, 1, DEVICE_NAME)< 0)
    {
        printk(KERN_DEBUG "Can't register device\n");
        return -1;
    }
    printk("alloc_chrdev_region..ok.\n");

    /* Create the led class */
    led_class = class_create(THIS_MODULE, DEVICE_NAME);
    if(IS_ERR(led_class))
        printk("Bad class create\n");
    else
        printk("class_create ok.\n");

    /* Connect the file operations with the cdev */
    cdev_init(&led_cdev, &led_fops);
    led_cdev.owner = THIS_MODULE;
    /* Connect the major/minor number to the cdev */
    if (cdev_add(&led_cdev, dev_number, 1))
    {
        printk("Bad cdev add\n");
        return 1;
    }
    else
        printk("cdev_add ok.\n");

    //class_device_create(led_class, NULL, dev_number,
    //     NULL, DEVICE_NAME);
    device_create(led_class, NULL, dev_number,
         NULL, DEVICE_NAME);

    /* Register this driver with parport */
    if(parport_register_driver(&led_driver))
    {
        printk(KERN_ERR "Bad Parport Register\n");
        return -EIO;
    }
    else
        printk("parport_register_driver ok\n");

    printk("LED Driver Initialized.\n");
    return 0;
}

/* Driver Exit */
void __exit led_cleanup(void)
{
    unregister_chrdev_region(dev_number, 1);
    //parport_unregister_driver();
    device_destroy(led_class,dev_number);
    class_destroy(led_class);
    return;
}

module_init(led_init);
module_exit(led_cleanup);
MODULE_LICENSE("GPL");



附件: parport.rar 将rar修改为tar.bz2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华为奋斗者精神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值