applepie 发表于 2003-5-21 16:01:06

请教设备驱动程序

我看了一些关于设备驱动的书 还看了Linux Device Drivers 2nd Edition
我下载了他的例子ldd.samples-2.0-beta3
我编译里面的simple.h 但是编译不通过
我用的是redhat90 2.4.20-8

谁能给我一个例子 一个最简单的 可以编译通过的例子

keenor 发表于 2003-5-21 16:55:55

相信这里有你要的所有东西。以后发帖子先看一下精华区:
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=17245

applepie 发表于 2003-5-21 17:56:02

唉...一声叹息
我要的的是一个字符设备驱动的例子
虽说可加载模块和这也有点关系
但是这种贴子我看了不下10几遍
可方到我机器上还是不能用
有没有谁成功过

redhat90 2.4.20-8

注:我要实际的 别和我说理论   我比较笨

jjww 发表于 2003-5-21 19:38:35

sigh,你这样的提问,才是sigh。
内核driver目录下,你想要什么类型的driver都有萨。这个还不实际??

applepie 发表于 2003-5-21 20:05:23

你是斑竹阿
我可没有这样的水平阿
driver下的文件我看了 因为不知道那个设备驱动是最简单的
我找了cdrom/gscd.c 随便看看

哇 好多define 好多struct阿这样的东西让我这个初学者咋看阿?

我说的实际一点是指 实际的可以学习的代码阿

jjww 发表于 2003-5-21 20:17:23

于linux而言,我接触的时间绝对没有你的时间长,我正式在linuxfans注册,才开始真正玩linux。:(
无论学什么都是急不来的。driver,首先应该从kernel的角度认识它,知道kernel是如何组织、管理device资源:irq,ports,dma。在编写不同类型的driver,需要怎么让内核识别,有了构架,剩下的事情就是根据硬件特性编写控制流程。
实际可用的driver,一般都有很多结构的萨。
今天我什么都不会,明天也许还是什么都不会,但不代表我将来什么都不会。
如果你连内核是怎么组织device的都没有搞清楚,就谈driver编程,未免有点joke吧。
已有的driver就是最好的实例。先有driver的底层构架,才有具体driver的实例。
个人感觉而已。

applepie 发表于 2003-5-21 20:31:55

大概你误会了
我没有我没有在编写一个实用的驱动程序

说白了 我只需要一个每次return 0的最简单的设备
依此来了解device的工作方式注:是驱动程序的工作方式 不是kernel管理驱动的方式

我已经看过一些书了
一些 read write inode file .........之类的东西略知一二
但我觉得一次性理解kernel太困难
所以决定从 设备驱动开始 一步步深入

如果你会写这样一个 啥事都不做 只返回0 的设备驱动请给我一份

jjww 发表于 2003-5-21 20:45:25

嘿嘿,现在我也不会,我以前一直玩FreeBSD的,受axin和dragonfly的感染,开始转向linux :oops:
我给你谈的,只是我以前FreeBSD的经验和一点点linux的认识。
我想你就拿一个实际的driver,把哪些处理都去掉,只是printk。
只留下和kernel probe & attach相关的不就可以了。

applepie 发表于 2003-5-21 20:55:05

试ing

applepie 发表于 2003-5-21 21:00:27

还有一个问题:
设备驱动实用的内存是不是物理内存?

其实我的最终目的是读写物理内存
我曾经在windows里做到过 使用windows的WDM
所以我想linux设备驱动也应该用物理内存吧

jjww 发表于 2003-5-21 21:20:11

可以用memory,也可以用设备自己的存储单元。

applepie 发表于 2003-5-21 21:25:13

xiexie

Dragonfly 发表于 2003-5-21 21:38:01

the scull in ldd sample is a simple one.
driver/char/mem.c is also a simple one. read all functions related with zero only, that is /dev/zero device.

applepie 发表于 2003-5-22 12:58:00

按照Dragonfly 所说的 我改了一下driver/char/mem.c

#include <linux/config.h>
#include <linux/mm.h>
#include <linux/miscdevice.h>
#include <linux/tpqic02.h>
#include <linux/ftape.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/mman.h>
#include <linux/random.h>
#include <linux/init.h>
#include <linux/raw.h>
#include <linux/tty.h>
#include <linux/capability.h>

#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/pgalloc.h>

static ssize_t read_null(struct file * file, char * buf,
                       size_t count, loff_t *ppos)
{
        return 0;
}

static ssize_t write_null(struct file * file, const char * buf,
                          size_t count, loff_t *ppos)
{
        return count;
}

static struct file_operations null_fops = {
        read:                read_null,
        write:                write_null
};

int __init chr_dev_init(void)
{
        devfs_register (NULL, "myzero", DEVFS_FL_NONE,
                        MEM_MAJOR, 255,/*<<=======我不知道这个数该添啥 原来写的是3 */
                        S_IRUGO | S_IWUGO | S_IFCHR,
                        &null_fops, NULL);       
        return 0;
}

__initcall(chr_dev_init);


我把前面的一大堆include都用上了

gcc -c -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4/include chard.c
编译通过

#cp chard.o /lib/modules/2.4.20-8/misc/
#depmod -a
#insmod chard
Using /lib/modules/2.4.20-8/misc/chard.o
/lib/modules/2.4.20-8/misc/chard.o: couldn't find the kernel version the module
was compiled for
又是version的问题 奇怪了 我可是抄mem.c的阿   是不是我编译有问题?
还有 mem.c写的和我看的书上写的不一样书上还要unregister设备

请指教

keenor 发表于 2003-5-22 15:38:44

试试看:

#include <linux/module.h>
#include <linux/kernel.h>
页: [1] 2
查看完整版本: 请教设备驱动程序