温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Linux 嵌入式驱动开发hello world的示例分析

发布时间:2021-10-22 10:30:50 来源:亿速云 阅读:169 作者:柒染 栏目:互联网科技

Linux 嵌入式驱动开发hello world的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、代码编写,只有一个文件,内容如下

文件名为:mini2440_hello_module.c

#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() 驱动加载函数,也是必须的

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

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

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

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

2、驱动安装

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

       这里我就讲讲如何修改相应的配置文件,增加内核的配置菜单选项吧。这里涉及到两个文件一个是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 嵌入式驱动开发hello world的示例分析

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版本号

如图

Linux 嵌入式驱动开发hello world的示例分析

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI