Username: Password:

linux设备驱动笔记??字符设备驱动
来源:IT实验室作者:IT实验室 发布时间:2008-04-07 02:54:01

   “全局性”是指,假如打开设备多次,任何打开他的文档描述符共享其中的数据。“持久性”是指,假如设备关闭后再次打开,数据不丢失。

       真实的驱动程式利用中断和他们的设备同步

 

主设备号和次设备号

 

       主设备号标识设备对应的驱动程式;次设备号由内核使用,用于正确确定设备文档所指的设备。我们能够通过次设备号获得一个指向内核设备的直接指针,也可将次设备号当作设备本地数组的索引,不管用哪种方式,除了知道次设备号用来指向驱动程式所实现的设备之外,内核本身基本上不关心关于次设备号的任何其他消息。

       设备编号的内部表达

n         在内核中,dev_t类型(在中定义)用来保存设备编号——包括主设备号和次设备号。

n         MAJOR(dev_t dev);      MINOR(dev_t dev)              MKDEV(int major, int minor)

 

       分配和释放设备编号

n         :

int register_chrdev_region(dev_t first, unsigned int count, char *name);

 

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,

 

                        unsigned int count, char *name);

 

void unregister_chrdev_region(dev_t first, unsigned int count);

 


 

驱动程式需要将设备编号和内部函数连接起来,这些内部函数用来实现设备的操作。

 

 

       动态分配主设备号

n         某些主设备号已静态地分配给了大部分公用设备。在内核源码树的Documentation/device.txt文档中能够找到这些设备的列表。

n         一旦驱动程式被广泛使用,随机选定的主设备号可能造成冲突和麻烦

n         强烈推荐您不要随便选择一个一个当前不用的设备号做为主设备号,而使用动态分配机制获取您的主设备号。

n         动态分配的缺点是,由于分配给您的主设备号不能确保总是相同的,无法事先创建设备节点。然而这不是什么问题,这是因为一旦分配了设备号,您就能够从/proc/devices读到。为了加载一个设备驱动程式,对insmod的调用被替换为一个简单的脚本,他通过/proc/devices获得新分配的主设备号,并创建节点

#!/bin/sh

 

module="scull"

 

device="scull"

 

mode="664"

 


 

# invoke insmod with all arguments we got

 

# and use a pathname, as newer modutils don’t look in . by default

 


 

/sbin/insmod ./$module.ko $* || exit 1

 


 

# remove stale nodes

 


 

rm -f /dev/${device}[0-3]

 

major=$(awk "\\$2=  =\"$module\" {print \\$1}" /proc/devices)

 

mknod /dev/${device}0 c $major 0

 

mknod /dev/${device}1 c $major 1

 

mknod /dev/${device}2 c $major 2

 

mknod /dev/${device}3 c $major 3

 


 

# give appropriate group/permissions, and change the group.

 

# Not all distributions have staff, some have "wheel" instead.

 


 

group="staff"

 

grep -q ’^staff:’ /etc/group || group="wheel"

 


 

chgrp $group /dev/${device}[0-3]

 

chmod $mode  /dev/${device}[0-3]

 

n         分配主设备号的最好方式:默认采用动态分配,同时保留在加载甚至是编译时指定主设备号的余地。

n         Here’s the code we use in scull ’s source to get a major number:

 

if (scull_major) {

 

    dev = MKDEV(scull_major, scull_minor);

 

    result = register_chrdev_region(dev, scull_nr_devs, "scull");

 

} else {

 

    result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull");

 

    scull_major = MAJOR(dev);

 

}
if (result < 0) {

 

    printk(KERN_WARNING "scull: can’t get major %d\n", scull_major);

 

    return result;

 

}

 

 

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅