fl2440hello world模块驱动编写
许多语言,例如C,C++,JAVA等等都是从hello world开始的,因此我们的驱动程序的开发也要从hello world入手。
首先来看下我们的代码:
/*********************************************************************************
* Copyright: (C) 2016
* All rights reserved.
*
* Filename: hello.c
* Description: This file
*
* Version: 1.0.0(2016年05月01日)
* Author: xiaohexiansheng <wcchz@hotmail.com>
* ChangeLog: 1, Release initial version on "2016年05月01日 19时08分42秒"
*
********************************************************************************/
#include <linux/init.h> //只能用Linux里的头,所有的库函数都不能用,所有的Linux驱动必须包含的
#include <linux/module.h> //所有的内核模块都要包含的 MODULE_LICENSE("Dual BSD/GPL"); //是用来告知内核, 该模块带有一个自由的许可证; 没有这样的说明, 在模块加载时内核会抱怨。 static __init int hello_init(void)
{
printk(KERN_ALERT "hello world\n"); //KERN_ALERT是消息的优先级
//u-boot里有在bootargs设置loglevel=7,就是设置的打印级别,打印级别比7小的都可以打印
return ;
} static __exit void hello_exit(void)
{
printk(KERN_ALERT "goodbye!\n");
} module_init(hello_init); //所有的驱动程序都是从module_init开始的
module_exit(hello_exit);
上面的代码所有的程序都是从module_init函数开始的,module_init的使用是强制性的,这个宏会在模块的目标代码中增加一个特殊的段,用于说明内核初始化函数所在的位置。没有这个定义,初始化函数永远不会被调用
看起来so easy,代码写好了要编译了。就像当初改u-boot,内核一样,编译的时候要用到Makefile文件。
[xiaohexiansheng@centos6 hello]$ vim Makefile
obj-m := hello.o //这个就是编译命令,不过这里的hello.o的文件名一定要与要编译的hello.c的文件名一致 modules:
//sudo make -C /lib/modules/内核版本/build/ M=`pwd` modules
sudo make -C /lib/modules/`uname -r`/build/ M=`pwd` modules
make clean //编译出来有很多中间文件,而我们只需要.ko的文件所以要把其他多余的文件删掉
clean:
rm -f *.ko.* *.o *.mod.c *.order *.symvers //清除多余的中间文件
[xiaohexiansheng@centos6 hello]$ make
make之后就可以看到一个hello.ko的文件
[xiaohexiansheng@centos6 hello]$ sudo insmod hello.ko
此时我们就装载好了我们的hello world的驱动,用lsmod命令即可查看:
[xiaohexiansheng@centos6 hello]$ lsmod
Module Size Used by
hello 559 0
fuse 62472 0
ip6table_filter 2245 0
ip6_tables 10301 1 ip6table_filter
......
如果想要移除驱动模块,则用rmmod命令
[xiaohexiansheng@centos6 hello]$ sudo rmmod hello.ko
如果我们想要这个驱动在开发板上运行就要编译适用于开发板的hello.ko文件:
[xiaohexiansheng@centos6 hello]$ vim Makefile
CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc //指定交叉编译器的位置
KDIR?=/home/xiaohexiansheng/fl2440/kernel/mylinux //指定内核的位置
obj-m = hello.o default:
sudo $(MAKE) -C $(KDIR) M=`pwd` modules
make clean clean:
rm -f *.ko.* *.o *.mod.c *.order *.symvers
make之后跟上面的步骤一样,唯一的区别是装载驱动模块和移除驱动模块是不要加.ko的后缀。
fl2440hello world模块驱动编写的更多相关文章
- liunx中字符驱动编写的简单模板
下面是关于字符驱动两个程序,主要是说明驱动编写的思想,理解驱动是怎么一步一步被实现的. 驱动的第一个实现程序,是相对于裸机编程的,主要是体会一下驱动编程思想: cdev.h: 所包含的头文件 #ifn ...
- AM335x(TQ335x)学习笔记——触摸屏驱动编写
前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱 ...
- linux模块驱动之led(ioremap)
一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...
- Linux驱动之按键驱动编写(中断方式)
在Linux驱动之按键驱动编写(查询方式)已经写了一个查询方式的按键驱动,但是查询方式太占用CPU,接下来利用中断方式编写一个驱动程序,使得CPU占有率降低,在按键空闲时调用read系统调用的进程可以 ...
- Linux驱动之按键驱动编写(查询方式)
在Linux驱动之LED驱动编写已经详细介绍了一个驱动的编写过程,接着来写一个按键驱动程序,主要是在file_operations结构中添加了一个read函数.还是分以下几步说明 1.查看原理图,确定 ...
- ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程
ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程 原文地址:http://www.cnblogs.com/NickQ/p/9026545.html 一.开发板与ds18b20的入门 ...
- v4l2驱动编写篇【转】
转自:http://blog.csdn.net/michaelcao1980/article/details/53008418 大部分所需的信息都在这里.作为一个驱动作者,当挖掘头文件的时候,你可能也 ...
- nand flash详解及驱动编写
https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...
- linux驱动学习笔记---实现中断下半部以及驱动编写规范(七)【转】
转自:https://blog.csdn.net/weixin_42471952/article/details/81609141 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协 ...
随机推荐
- UpdateData的用法(转)
原文转自 https://blog.csdn.net/ddjj_1980/article/details/51452289 UpdateData(TRUE)——刷新控件的值到对应的变量.(外部输入值交 ...
- Linux MMC介绍
1. 介绍 Linux中,将包括MMC.SD.SDIO统称为MMC子系统 MMC子系统从功能上可分为三个层次 - card层: Card驱动, 或称client驱动 - core层: MMC的核心层, ...
- RabbitMQ消息队列(一): 简单队列
1. 示例选用python的pika模块进行测试,需要预先安装pika模块: https://pypi.python.org/pypi/pika/0.10.0#downloads 上述地址下载源码,加 ...
- 【uva11421】玩纸牌
数学期望. #include<bits/stdc++.h> ; using namespace std; double d[N][N],p; int main(){ ;double p;s ...
- 【bzoj2212&3702】二叉树
线段树合并入门题. 分别计算左子树的逆序对,右子树的逆序对,合并的时候计算贡献. #include<bits/stdc++.h> #define N 8000005 using names ...
- vue+axios下载文件的实现
HTML代码: <el-button size="medium" @click="download">下载表格</el-button> ...
- 1.hadoop环境搭建以及配置
提前说明一下:由于环境的配置搞得我很头疼,所以记录下来.并不是零基础,像hadoop的由来.发展史.结构.各个组件,这里都没有介绍,只是为了自己能够在忘了的时候回忆起来,所以记录下来 如何在linux ...
- HDU-3221
Brute-force Algorithm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU 6273.Master of GCD-差分数组 (2017中国大学生程序设计竞赛-杭州站-重现赛(感谢浙江理工))
Super-palindrome 题面地址:http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 这道题是差分数组的题目,线 ...
- ZOJ 3380 Patchouli's Spell Cards
方案数,$dp$. 总的方案数有$n^m$种,符合要求的直接算不好算,可以算反面,即不符合要求的. 设$dp[i][j]$表示前$i$种等级填了$j$个位置,那么$dp[i][j]=sum(dp[i- ...