linux字符设备驱动 教程,linux字符设备驱动步骤

linux 字符设备驱动步骤

1.创建设备结构体:

Struct XXX_dev

{

Struct cdev cdev;

Unsigned value;

/* other values */

};

2.编写设备初始化函数:

Int XXX_init(void);

a.根据主设设备号创建设备:dev_t dev = MKDEV(XXX_major, 0);

b.注册创建的设备:

手动注册result = register_chrdev_region(dev, 1, “DEVICE NAME”); or

自动注册result = alloc_chrdev_region(&dev, 0, 1, “DEVICE NAME”);

c.为注册成功的设备分配内存:

XXX_devp = kmalloc(sizeof(struct XXX_dev), GFP_KERNEL);

d.初始化注册成功的内存:

Memset(XXX_devp, 0, sizeof(struct XXX_dev));

设置设备的设备结构体:

XXX_setup_cdev(XXX_devp, 0);

i.初始化设备结构体的操作函数:

Struct XXX_dev *dev = XXX_devp;

Cdev_init(&dev -> cdev, &XXX_fops);

Dev -> cdev.owner = “THIS_MODULE”;

Dev -> cdev.ops = &XXX_fops;

ii.初始化后将设备结构体加入设备中

Cdev_add(&dev -> cdev, devno, 1);

设置设备操作函数结构体:

Struct file_operations XXX_fops =

{

.owner = THIS_MODULE,

.read = XXX_read,/*函数指针*/

.write = XXX_write,

.ioctl = XXX_ioctl,

.open = XXX_open,

.release = XXX_release,

};

编写设备操作函数结构体中的函数:

intXXX_open(struct inode *inode, struct file *filp);

int XXX_release(struct inode *inode, struct file *filp);

ssize_t XXX_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos);

ssize_tXXX_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos);

int XXX_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);

3.编写设备注销函数:

XXX_cleanup();

a.删除设备结构体:

Cdev_del(&XXX_devp -> cdev);

b.释放设备内存:

Kfree(XXX_devp);

c.注销设备

Unregister_chrdev_region(MKDEV(XXX_major, 0), 1);

4.设备模块与系统接口函数:

Module_init(XXX_init);

Module_exit(XXX_cleanup);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值