Linux驱动开发之开篇--HelloWorld
Linux驱动的编写,大致分为两个过程,第一个过程为测试阶段,即为某一具体的设备,添加必要的驱动模块,为了节省编译时间,需要将代码单独放在一处,在编译时,只需要要调用内核的头文件即可;第二个过程为布置阶段,即为某一具体设备,添加完整、可靠的驱动模块,即该过程将驱动模块编译到内核镜像文件中,它需要将驱动模块的代码,添加到内核源码树中,下面将逐一介绍。
阶段一
1 新建一目录,并编写测试代码
mkdir -p develop/drivers/
cd develop/drivers/
vim demo.c
//driver/demo/demo.c
#include "linux/init.h"
#include "linux/module.h" static int hello_init(void)
{
printk(KERN_ALERT"Hello World linux-driver-module\n");//注意,必须是KERN_ALEAT及以上级别,不然不会打印
return ;
} static int hello_exit(void)
{
printk(KERN_ALERT"Goodbye linux-driver-module\n");
return ;
} module_init(hello_init);
module_exit(hello_init); MODULE_LICENSE("GPL");
MODULE_AUTHOR("gjianw217@163.com");
2 添加编译文件Makefile
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
APP_COMPILE=arm-linux-
#obj-m := pwm_test-drv.o
obj-m := hello-drv.o
KDIR := /path/to/kernel/linux/
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
app:hello-app.c
$(APP_COMPILE)gcc -o helloappe hello-app.c
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
3 编译并加载到板上
make
Download thd demo.ko into the Development Board
arm/drivers/demo.ko
4 驱动模块的测试
cd /arm/drivers/
insmod demo.ko
lsmod demo.ko
rmmod demo.ko dmesg
阶段二
1 将驱动代码按类型放到内核源码树相应目录下(drivers/demo/demo.c)
//driver/demo/demo.c
#include "linux/init.h"
#include "linux/module.h" static int hello_init(void)
{
printk(KERN_ALERT"Hello World linux-driver-module\n");
return ;
} static int hello_exit(void)
{
printk(KERN_ALERT"Goodbye linux-driver-module\n");
return ;
} module_init(hello_init);
module_exit(hello_init); MODULE_LICENSE("GPL");
MODULE_AUTHOR("lpj");
2 在当前目录下,分别添加编译文件
driver/demo/Makefile
#driver module demo
obj-$(CONFIG_HELLODRV) += hello.o
driver/demo/Kconfig
menu USER_DEVICE_DRIVERS //4中可以看到它
config HELLODRV
tristate "Hello"
help
This is a demo driver programming.
endmenu
3 修改上层目录文件,将其添加到内核中
driver/Makefile
obj-$(CONFIG_HELLODRV)+=demo/
driver/Kconfig
source drivers/demo/Kconfig
arch/arm/Kconfig
source "drivers/demo/Kconfig"
4进行系统配置并编译
make menuconfig
make
5加载内核镜像文件到板上,使用命令检查
lsmod
dmesg
参考链接
【2】Linux内核驱动学习
Linux驱动开发之开篇--HelloWorld的更多相关文章
- 1. Linux驱动开发之开篇--Makefile
基本Makefile假设现在有3个文件,file2.h是函数声明,file2.c是函数定义,文件file1.c调用file2.c中的函数.则Makefile文件的编写如下: helloworld:fi ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- 嵌入式Linux驱动开发日记
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- 【转】linux驱动开发的经典书籍
原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...
- Linux驱动开发 -- 打开dev_dbg()
Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...
- Linux驱动开发学习的一些必要步骤
1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...
- 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
随机推荐
- 【三板斧】Java定位CPU使用高问题
[三板斧]Java定位CPU使用高问题 1.TOP命令,查询消耗CPU高的进程号 PID,并记录下来,按下键盘"H"键,记录高消耗线程号,并将改线程号转换为十六进制 2.使用 js ...
- oracle PL/SQL(procedure language/SQL)程序设计之游标cursors
游标 Cursors--Conception 每一条被Oracle服务器执行的SQL语句都有一个独立的游标与之相关联:隐式游标 Implicit cursors: 用于所有的DML和PL/SQL的SE ...
- CF Soldier and Badges (贪心)
Soldier and Badges time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- hdu-5690 All X(快速幂+乘法逆元)
题目链接: All X Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Pro ...
- How to Use Rsync to Sync New or Changed/Modified Files in Linux
As a system administrator or Linux power user, you may have probably come across or even on several ...
- 何为 ISAPI
ISAPI即为Internet Server Application Programming Interface ISAPI 服务器扩展 ISAPI 服务器扩展是可以被 HTTP 服务器加载和调用的 ...
- php curl破解防盗链
function get_content($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); $header = array( ...
- NPOI--操作Excel之利器(一)
最近在做一个产品配置的项目,类似于京东上的自主装机,也就是根据自己的需要配置一套完整的产品,只不过我们做的是一个网络产品的配置,如路由器,交换机等网络设备.配置完成后会将配置的信息导出到Excel中, ...
- C# 匿名方法及Lambda表达式
1.匿名方法 定义:匿名方法不能直接在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传递给该委托. 举实例说明: 实例一:无参数,无返回值的一个匿名方法 ...
- 【学习笔记】【C语言】类型说明符
1. short和long 1> short和long可以提供不同长度的整型数,也就是可以改变整型数的取值范围.在64bit编译器环境下,int占用4个字节(32bit),取值范围是-231~2 ...