kernel-char设备的建立
来源:互联网 发布:mac屏幕边缘红点 编辑:程序博客网 时间:2024/06/03 15:42
kernel下的设备分成了一些类,char block char。。
这里就贴出来一个例子可以建立一个char设备 ,抛砖引玉吧
这是kernel中的 drivers/char/msm_smd_pkt.c
先要启动初始化module
module_init(smd_pkt_init);
smd_pkt_init会在启动之后调用
static int __init smd_pkt_init(void)
{
int i;
int r;
创造char设备的结构体
r = alloc_chrdev_region(&smd_pkt_number, 0,
NUM_SMD_PKT_PORTS, DEVICE_NAME);
if (r) {
pr_err("alloc_chrdev_region() failed %d\n", r);
return r;
}
创造class下的设备机构提
smd_pkt_classp = class_create(THIS_MODULE, DEVICE_NAME);
if (IS_ERR(smd_pkt_classp)) {
r = PTR_ERR(smd_pkt_classp);
pr_err("class_create() failed %d\n", r);
goto unreg_chardev;
}
for (i = 0; i < NUM_SMD_PKT_PORTS; ++i) {
smd_pkt_devp[i] = kzalloc(sizeof(struct smd_pkt_dev),
GFP_KERNEL);
if (IS_ERR(smd_pkt_devp[i])) {
r = PTR_ERR(smd_pkt_devp[i]);
pr_err("kmalloc() failed %d\n", r);
goto clean_cdevs;
}
smd_pkt_devp[i]->i = i;
下面几行都是私有数据的赋值 我们不用关心 不需要可以删掉
init_waitqueue_head(&smd_pkt_devp[i]->ch_read_wait_queue);
smd_pkt_devp[i]->remote_open = 0;
init_waitqueue_head(&smd_pkt_devp[i]->ch_opened_wait_queue);
mutex_init(&smd_pkt_devp[i]->ch_lock);
mutex_init(&smd_pkt_devp[i]->rx_lock);
mutex_init(&smd_pkt_devp[i]->tx_lock);
关键地方就是这里了:
char设备的结构初始化
cdev_init(&smd_pkt_devp[i]->cdev, &smd_pkt_fops);
smd_pkt_devp[i]->cdev.owner = THIS_MODULE;
char设备增加
r = cdev_add(&smd_pkt_devp[i]->cdev,
(smd_pkt_number + i), 1);
if (r) {
pr_err("cdev_add() failed %d\n", r);
kfree(smd_pkt_devp[i]);
goto clean_cdevs;
}
char设备在dev下创造一个节点设备 这个一定要有哦
smd_pkt_devp[i]->devicep =
device_create(smd_pkt_classp, NULL,
(smd_pkt_number + i), NULL,
smd_pkt_dev_name[i]);
if (IS_ERR(smd_pkt_devp[i]->devicep)) {
r = PTR_ERR(smd_pkt_devp[i]->devicep);
pr_err("device_create() failed %d\n", r);
cdev_del(&smd_pkt_devp[i]->cdev);
kfree(smd_pkt_devp[i]);
goto clean_cdevs;
}
}
pr_info("SMD Packet Port Driver Initialized.\n");
return 0;
后面就是错误处理了 不管了
clean_cdevs:
if (i > 0) {
while (--i >= 0) {
mutex_destroy(&smd_pkt_devp[i]->ch_lock);
mutex_destroy(&smd_pkt_devp[i]->rx_lock);
mutex_destroy(&smd_pkt_devp[i]->tx_lock);
cdev_del(&smd_pkt_devp[i]->cdev);
kfree(smd_pkt_devp[i]);
device_destroy(smd_pkt_classp,
MKDEV(MAJOR(smd_pkt_number), i));
}
}
class_destroy(smd_pkt_classp);
unreg_chardev:
unregister_chrdev_region(MAJOR(smd_pkt_number), NUM_SMD_PKT_PORTS);
return r;
}
- kernel-char设备的建立
- 设备节点的动态建立
- 设备节点的动态建立
- 2.6kernel 字符设备驱动的编写
- udev建立设备节点的规则
- 设备节点的动态建立 class
- redhat5中RAW设备的建立
- 设备寄存器静态映射的建立
- linux设备树的建立过程
- linux设备树的建立过程
- linux设备树的建立过程
- linux设备树的建立过程
- gnu3.4.4交叉工具链的建立(kernel-2.6.14.1)
- [linux-kernel] 实现支持poll的驱动设备
- Device namespace简介 - 基于Kernel namespace的设备虚拟化
- [linux-kernel] 实现支持poll的驱动设备
- Device namespace简介 - 基于Kernel namespace的设备虚拟化
- MISC设备和char设备
- hive 函数
- 对于网站的seo来说,做搜索引擎优化
- 控制随机数生成概率的一种解决方法
- reboot与shutdown -r now 区别与联系(又收集了init和halt的小知识)
- 基础网络概念(三)TCP/IP协议、IP、Netmask、子网、CIDR、路由概念
- kernel-char设备的建立
- RabbitMQ的几种应用场景
- Java内联函数
- 45黑名单列表出现的bug---适配器更新不了数据
- 透视投影再理解
- UIScrollview一直显示滚动条,使用UIImageView自定义滚动条
- Mini2440重新烧写supervivi方法
- Android图片裁剪----移动、缩放图片进行裁剪
- ViewPager的setOnPageChangeListener方法详解