开发字符设备例如键盘鼠标

什么是字符设备

字符设备(Character Device)是一种按字符(字节)为单位进行数据传输的设备。这类设备通常不支持随机访问数据,数据传输是顺序的,常见的字符设备包括键盘、鼠标、串口等。字符设备的主要特点是可以进行字节流的输入输出操作,通常操作如读写是阻塞的。

示例的字符设备

一个典型的字符设备是计算机的串口。串口设备允许字符数据按序传输到或从外部设备传输回计算机。在Linux系统中,串口设备通常表示为 /dev/ttyS0, /dev/ttyS1 等设备文件。

用来开发驱动的字符设备

开发字符设备驱动涉及创建一个设备文件和一个设备驱动程序,设备驱动程序会定义设备的操作方法,如打开、读取、写入和关闭等。Linux内核提供了一套标准的接口用于开发这些驱动程序。

例如,开发一个简单的字符设备驱动程序可能包括以下步骤:

  1. 定义设备的主要和次要号:主设备号用于标识驱动程序的类型,次设备号用于标译同一类型中的不同设备。

  2. 注册字符设备:使用 register_chrdev() 函数注册设备,指定设备名称和相关操作函数。

  3. 实现设备操作函数:如 open, read, write, release 等。

  4. 创建设备文件:通常使用 mknod 命令手动创建或通过udev系统自动创建。

下面是一个简单的字符设备驱动程序的代码示例:

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>

#define MY_MAJOR 100
#define MY_MINOR 0
#define DEVICE_NAME "example_char_dev"

static struct cdev my_cdev;
static int device_open = 0;

static int my_open(struct inode *inode, struct file *file) {
    if (device_open)
        return -EBUSY;
    device_open++;
    return 0;
}

static int my_release(struct inode *inode, struct file *file) {
    device_open--;
    return 0;
}

static ssize_t my_read(struct file *file, char __user *buffer, size_t length, loff_t *offset) {
    return 0; // Just a dummy read
}

static ssize_t my_write(struct file *file, const char __user *buffer, size_t length, loff_t *offset) {
    return length; // Just a dummy write
}

static struct file_operations fops = {
    .owner = THIS_MODULE,
    .open = my_open,
    .release = my_release,
    .read = my_read,
    .write = my_write,
};

static int __init my_init(void) {
    int ret;
    dev_t dev_no = MKDEV(MY_MAJOR, MY_MINOR);

    ret = register_chrdev_region(dev_no, 1, DEVICE_NAME);
    if (ret < 0) {
        printk("Unable to allocate major number %d\n", MY_MAJOR);
        return ret;
    }

    cdev_init(&my_cdev, &fops);
    my_cdev.owner = THIS_MODULE;

    ret = cdev_add(&my_cdev, dev_no, 1);
    if (ret < 0) {
        unregister_chrdev_region(dev_no, 1);
        printk("Unable to add cdev\n");
        return ret;
    }

    return 0;
}

static void __exit my_exit(void) {
    cdev_del(&my_cdev);
    unregister_chrdev_region(MKDEV(MY_MAJOR, MY_MINOR), 1);
}

module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");

这个驱动程序创建了一个字符设备,该设备不执行实际的数据读写操作,只是示例性地展示了字符设备驱动的结构。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值