2012-06-06 10:40:25 SudoGod 阅读数 19307
  • 驱动应该怎么学-linux驱动开发第1部分

    本课程是linux驱动开发的第一个课程,主要介绍linux驱动的概念、模块化设计理念、分类、安全性要求,后讲解了linux驱动课程的整体学习方法。学习本课程主要是为后续正式学习linux驱动打个基础。

    4748 人正在学习 去看看 朱有鹏

呼呼,好久不见

前一段时间开发了一个linux下的PCI数据采集板卡的驱动,在驱动调试时,一直使用insmod 动态的加载驱动模块(ko文件).

现在驱动基本开发结束,要提交给客户,使用insmod加载时,对客户来说不太好,比较麻烦,所以不能采用这种方法。由于

刚开始做驱动,还不知道如何在linux启动时自动加载自己的驱动模块,就对自动加载模块这方面深入了一下。最终通过与

COT(一个做驱动的家伙,带着眼镜,不知最近瘦了没)交流,通过各种途径,最后通过下列的方法加载成功,呵呵......

环境:ubuntu10.10

模块名:pciAdDrv.ko

步骤:1 打开下面文件

         vi /etc/moudles     添加模块名称:  pciAdDrv(注意不要后缀)

          2 下来就是将模块放到对应的位置,注意将驱动按类别放,我的属于pci就将它放在了drivers下的pci下。

         /lib/modules/2.6.35-22-generic/kernel/drivers/pci/

验证:以上操作完成后重启机器,在终端通过命令lsmod 就可以看到已经加载的模块了

2015-05-14 20:56:38 lihui126 阅读数 30233
  • 驱动应该怎么学-linux驱动开发第1部分

    本课程是linux驱动开发的第一个课程,主要介绍linux驱动的概念、模块化设计理念、分类、安全性要求,后讲解了linux驱动课程的整体学习方法。学习本课程主要是为后续正式学习linux驱动打个基础。

    4748 人正在学习 去看看 朱有鹏

假设要加载的驱动程序模块名为SHT21.ko

加载驱动模块

方法一:
进入SHT21.ko驱动模块文件所在的目录,然后直接
insmod SHT21.ko
即可

方法二:
将SHT21.ko文件拷贝到/lib/module/#uname -r#/目录下,这里,#uname -r#意思是,在终端中输入
uname -r后显示的内核版本及名称,例如mini2440中#uname -r#就是2.6.32.2-FriendlyARM。

然后
depmod(会在/lib/modules/#uname -r#/目录下生成modules.dep和modules.dep.bb文件,表明模块的依赖关系)
最后
modprobe SHT21(注意这里无需输入.ko后缀)
即可

两种方法的区别:

modprobe和insmod类似,都是用来动态加载驱动模块的,区别在于modprobe可以解决load module时的依赖关系,它是通过/lib/modules/#uname -r/modules.dep(.bb)文件来查找依赖关系的;而insmod不能解决依赖问题。

也就是说,如果你确定你要加载的驱动模块不依赖其他驱动模块的话,既可以insmod也可以modprobe,当然insmod可以在任何目录下执行,更方便一些。而如果你要加载的驱动模块还依赖其他ko驱动模块的话,就只能将模块拷贝到上述的特定目录,depmod后再modprobe。

查看已加载的驱动模块列表

在任何目录下,
lsmod
即可

卸载驱动模块

在任何目录下,
rmmod <module_name>
即可
注意其中”module_name”是lsmod显示的模块名称,而不是对应的ko文件名

参考资料
.ko内核模块文件以及载入模块命令modprobe insmod

2017-10-29 00:17:01 Blazar 阅读数 6212
  • 驱动应该怎么学-linux驱动开发第1部分

    本课程是linux驱动开发的第一个课程,主要介绍linux驱动的概念、模块化设计理念、分类、安全性要求,后讲解了linux驱动课程的整体学习方法。学习本课程主要是为后续正式学习linux驱动打个基础。

    4748 人正在学习 去看看 朱有鹏

0x00  前期准备

主机/work/mydrv/目录下,已经写好了驱动层的C文件:mydrv.c,应用层的C文件:mytest.c,以及用来把mydrv.c生成驱动模块(.ko文件)的Makefile
本实验的目的是:把已经写好的LED的驱动程序mydrv.c编译后加载到开发板上;mytest.c编译及运行,实现通过对设备文件的操作来控制开发板上LED的亮灭。

0x01  编译出驱动模块

先进入/work/mydrv/目录查看一下
$ cd /work/mydrv
$ ls
Makefile  mydrv.c mytest.c

输入make,开始编译驱动模块

$ make

等待编译完成,再查看一下
$ ls
Makefile  Module.symvers mydrv.c mydrv.ko mydrv.mod.c mydrv.mod.o mydrv.o mytest.c

0x02  编译应用层程序

$ arm-linux-gcc mytest.c -o mytest

查看一下目录下是否生成mytest:

$ ls
Makefile  Module.symvers mydrv.c mydrv.ko mydrv.mod.c mydrv.mod.o mydrv.o mytest mytest.c

可见经过以上两步已经编译出来了驱动模块mydrv.ko和用来测试的应用层程序mytest

0x03  把驱动模块和测试程序转移到开发板上

这里,我们使用/work/nfs_root/作为网络根文件系统来,所以我们只需要把程序放到这个目录,就相当于放到开发板上面去了。

$ cp ./mydrv.ko ./mytest /work/nfs_root

$ cd /work/nfs_root

$ ls mydrv.ko mytest -l


现在,这两个文件已经放上去了,我们就可以通过串口控制开发板来使用它们了!

0x04  加载驱动

先加载驱动模块,然后查看是否已加载,命令如下:

# insmod mydrv.ko

# lsmod


通常我们还会经常使用到这样两个命令:cat /proc/devices”,以及“ls /dev/$(DRVICE) -l”,它们分别用来查看向内核注册的设备、设备下的设备文件(应用程序操作的就是 这些文件)。比如说,在这个例子中,我在mydrv.c里面就创建了一个名为“mydrv”的设备,同时创建了一个名为“Hamburger”的设备文件,所以这里的$(DRVICE)应该换为Hamburger
我们来试一下:

# cat /proc/devices


我们可以看到mydrv就在其中了,它前面的“252”这个数字表示的就是它的“主设备号”。

# ls /dev/Hamburger -l


以上就可以得知驱动模块已加载好了。

0x05  卸载驱动

卸载驱动用的是rmmod这个命令,这里先卸载后查看:

# rmmod mydrv

# lsmod


可见驱动已经卸载了。再来查看一下/proc/devices和设备文件:

# cat /proc/devices

# ls /dev/Hamburger -l




以上就可以得知驱动已经卸载成功了。 

0x06  测试驱动

现在先把驱动模块加载上去:

# insmod mydrv.ko

接着运行测试程序mytest

# ./mytest on  

可以看见开发板上面的LED点亮了

# ./mytest off

执行之后LED灭了

以上说明我们的驱动模块符合我们的预期,测试成功!

0x07  mknod

说一下mknod这个命令,它其实就是在/dev/目录下创建一个设备文件,同时指定设备类型,主设备号,次设备号,比如:

# mknod /dev/Coke c 252 1

这时我们就创建了一个名为Coke的设备文件,并指定为字符类设备,主设备号为252,次设备号为1

/dev/目录查看一下:

# ls /dev/Coke /dev/Hamburger -l


如果要删除它,就像操作普通的文件一样:
# rm -f /dev/Coke
再说一下次设备号,它其实是可以由我们任意分配的,比如说:把Coke的次设备号也设为0

# mknod /dev/Coke c 252 0

# ls /dev/Coke /dev/Hamburger -l


可见两者并不冲突。

0x08  两个问题

/dev/Hamburger这个设备文件,我们并没有使用mknod命令去创建它,那它是怎么来的呢?

是这样的,在mydrv.c的代码,有下面两行,它调用了内核的class_createclass_device_create函数,创建了一个名为“mydrv”的class,并且在这个class之下创建了一个名为“Hamburger”的class_dev

mydrv_class = class_create(THIS_MODULE, "mydrv");
mydrv_class_dev = class_device_create(mydrv_class, NULL, MKDEV(major, 0), NULL, "Hamburger");

那么当mydrv_classmydrv_class_dev这两个数据结构传入到内核后,内核busyboxmdev(把它看作内核的一个工具就可以)就会自动帮我们去做“mknod /dev/Hamburger c 252 0”了!

主设备号为252,它又是怎么来的呢?
它是系统给我们分配的,同样,在驱动代码里调用了内核的register_chrdev这个函数向内核注册驱动,函数的返回值就是主设备号

major = register_chrdev(0, "mydrv", &mydrv_fops);

0x09  总结

这个例子总结的框图如下:


从中我们也可以看出嵌入式开发的特点:代码都是在Linux主机上编译的,而加载、卸载和执行都被放到了嵌入式系统(开发板)上。

 

 

2014-07-02 16:33:43 u010787933 阅读数 521
  • 驱动应该怎么学-linux驱动开发第1部分

    本课程是linux驱动开发的第一个课程,主要介绍linux驱动的概念、模块化设计理念、分类、安全性要求,后讲解了linux驱动课程的整体学习方法。学习本课程主要是为后续正式学习linux驱动打个基础。

    4748 人正在学习 去看看 朱有鹏


【原创】Linux驱动入门之以模块方式加载驱动


构建驱动模块之前两点注意:

one:内核版本号要完全一致

two:构建模块之前首先要编译内核


构建模块有两种方式

1. 在内核代码外构建模块

详细示例连接  http://blog.csdn.net/geng823/article/details/36425655

或者 http://blog.csdn.net/xdw1985829/article/details/6832525


2. 在内核源码内构建模块

参考示例详见 

Tiny6410 Linux开发指南    ---》  1.10.1 Hello,Module最简单的嵌入式Linux驱动模块





2016-12-19 14:46:30 weijory 阅读数 1929
  • 驱动应该怎么学-linux驱动开发第1部分

    本课程是linux驱动开发的第一个课程,主要介绍linux驱动的概念、模块化设计理念、分类、安全性要求,后讲解了linux驱动课程的整体学习方法。学习本课程主要是为后续正式学习linux驱动打个基础。

    4748 人正在学习 去看看 朱有鹏
在完成驱动调试后,一直使用insmod 动态的加载驱动模块(ko文件).会非常麻烦。找到以下办法:
步骤:1 、打开下面文件


         sudo vim /etc/moudles     添加模块名称:  *****(注意不要后缀)


         2 、将模块放到对应的位置,注意将驱动按类别放,我的属于pci就将它放在了drivers下的pci下。


         /lib/modules/****/




验证:以上操作完成后重启机器,在终端通过命令lsmod 就可以看到已经加载的模块了
没有更多推荐了,返回首页