Linux 嵌入式驱动开发:hello world

一、代码编写,只有一个文件,内容以下java

文件名为:mini2440_hello_module.clinux

#include <linux/kernel.h>
#include <linux/module.h>

static int __init mini2440_hello_module_init(void)
{
    printk("Hello, Mini2440 module is installed !\n");
    return 0;
}

static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good-bye, Mini2440 module was removed!\n");
}

module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");

注解:安全

A、两个头文件是必须的,不要问为何函数

B、mini2440_hello_module_init() 驱动加载函数,也是必须的spa

C、mini2440_hello_module_cleanup()驱动卸载函数,也是必须的操作系统

D、module_init(mini2440_hello_module_init) 你想让你的驱动运行起来,就必须有这个命令行

E、module_exit(mini2440_hello_module_cleanup) 和 module_init 的意义恰好相反code

B、MODULE_LICENSE("GPL"); 用于声明模块的许可证开发

二、驱动安装
rem

驱动程序的安装有两种方式,第一种是模块方式,第二种是直接编译进内核

       这里我就讲讲如何修改相应的配置文件,增长内核的配置菜单选项吧。这里涉及到两个文件一个是makefile和kconfig,makefile的做用就是编译,具体的来讲就是写好一个程序你就必须写好它的makefile文件。kconfig的做用就是使得写好的驱动能增长到图形配置菜单中,简单来讲,就是你想在内核配置菜单中看到你的内核选项,你就必须修改kconfig文件。

      ,下面咱们就来说讲如何修改makefile文件以及kconfig文件吧。假如咱们写好了一个驱动程序,而后呢放在了drivers/char目录下,并且文件名为mini2440_hello_module.c。首先,咱们先修改同目录下的makefile文件吧,如何修改呢?不少时候一打开一看怎么密密麻麻的呢,其实不要紧的,你没看到吗?大部分的格式实际上是一摸同样的,这就简单了,咱们也依葫芦画瓢吧,咱们加这一句: obj-$(CONFIG_MINI2440_HELLO)  += mini2440_hello_module.o

对于这个语句是什么意思,我也不想在这里说的太详细了,最右边那个是咱们的驱动文件的文件名,至于右边那个CONFIG是必须的,而那个MINI2440_HELLO呢,是咱们等一下在Kconfig文件中要用到的。接着咱们修改同目录下的Kconfig文件,找到menu“Character devices”在这下面开始添加吧,添加的内容以下:

config MINI2440_HELLO
	tristate "MINI2440 BOARD HELLO TEST"
	depends on ARCH_S3C2440
	default m if ARCH_S3C2440
	help
	  MINI2440 Board First module test.

在这里我也简单讲解一下上面这几条语句吧,最上面的config是必须的,这是它的格式这样说吧。下面一句呢,是它在内核配置单上显示的文字了,下面的那句是它的依赖,也就是说只有ARCH_S3C2440配置好了,咱们才能配置这一驱动。最后的是它的帮助信息,之后你按照它的格式照着写就行了。懂了吧! 

     接着就是照着以前讲的如何编译内核编译一下内核了。输入:make menuconfig,将刚刚的模块选择为M吧,而后编译内核,把内核镜像烧进开发板。最后使用命令make SUBDIR=drivers/char/

modules再编译。获得mini2440_hello_module.ko这个就是咱们要的驱动模块了,咱们把它加到开发板,加载的方式有不少种,我通常是用串口加进开发板的。在开发板的lib目录下输入rz便可下载了。  

  ok,假如你已经成功下载驱动模块到开发板了,这时候你须要作的是加载驱动模块了,为了形象生动点,我就截图了吧:

注意:在执行make menuconfig,图形化界面中

Device Drivers -->....Character devices -->

下可能不会出现

MINI2440 BOARD HELLO TEST

选项,

须要进行如下动做,则会出现此选项

 #make menuconfig命令进入内核配置界面,进入到“System Type”选项配置菜单,将S3C2440 Machines选项下作以下选择:只选择SMDK2440和SMDK2440 withS3C2440 CPU module两个选项。


Linux操做系统中模块操做相关命令解释
lsmod  查看已经安装好的模块, 也能够查看/proc/modules文件的内容. 实际上,lsmod读命令就是经过查看/proc/modules的内容来显示模块信息的.
modinfo 显示模块信息
modprobe  不须要指定路径,它会到默认路径下寻找模块。模块也存在依赖性问题: 好比你要加载msdos.ko, 须要先加载fat.ko. modprobe查看/lib/module/version/modules.dep得知模块的依赖关系
rmmod 卸载模块,可是内核会认为卸载模块不安全,能够添加命令强制卸载。
depmod 检查系统中模块之间的依赖关系,并把依赖关系信息存于/lib/modules/2.6.18-1.2798/modules.dep中。 通常加载模块后,要命令行下先执行 depmod -a后,在系统加载模块时候会查看modules.dep中模块依赖及路径信息,这样子才能够成功加载须要模块。
insmod 加载模块,须要指定完整的路径和模块名字。


注:本人遇到的问题

模块须要上传到:

/lib/modules/2.6.32.2

下,rmmod命令才会起做用,【2.6.32.2】为linux kernel版本号

如图