驱动学习1

一、字符设备驱动

1.添加驱动入口和出口
module_init();
module_exit();
MODULE_LICENSE("GPL");
MODULE_AUTHOR("*****");
2.实现函数入口和出口
/函数入口/
static int __init chrdevbase_init(void)
{
int ret;
printk("chrdevbase init!\r\n");

/*注册字符设备*/
ret = register_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME,&chrdevbase_fops);
return ret;

}

/函数出口/
static void __exit chrdevbase_exit(void)
{
printk("chrdevbase exit!\r\n");
unregister_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME);
/注销字符是被/

}

3.实现设备操作函数结构体

static struct file_operations chrdevbase_fops = {
.owner = THIS_MODULE,
.open = chrdevbase_open,
.read = chrdevbase_read,
.write = chrdevbase_write,
.release = chrdevbase_release,
};
4.实现对应的函数

/*
*打开设备
*/
static int chrdevbase_open(struct inode *inode, struct file *filp)
{
printk("open_chrdevbase!\r\n");
return 0;
}

/*
*从设备中读取数据
*/
static ssize_t chrdevbase_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{
printk("Read_chrdevbase!\r\n");
return 0;
}

/*
*写数据到设备
*/
static ssize_t chrdevbase_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{
printk("Write_chrdevbase!\r\n");
return 0;
}

/*
*关闭设备
*/
static int chrdevbase_release(struct inode *inode, struct file *filp)
{
printk("release_chrdevbase!\r\n");
return 0;
}

注:

1.在使用modprobe加载模块之前,一定要使用depmod.
2.如果使用了depmod,并且.ko文件也在/lib/module/内核版本 下但还是提示.ko not found in directory。则需要修改指令去掉.ko
3.如果打印失败,则设置编译内核源码时默认的打印级数。
echo 8 4 1 7 > /proc/sys/kernel/printk

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 13,595评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 9,771评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 127,473评论 2 7

友情链接更多精彩内容