- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解linux驱动编写(入门)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在我离职之前,工作内容几乎不涉及到驱动方面的知识。我所要做的内容就是把客户对设备的请求拆分成一个一个的接口,调用驱动的设置进行配置就可以了。当然,至于驱动下面是怎么实现那就要根据具体情况而定了。比如说,有的驱动是芯片厂商直接写好的,假设芯片厂商提供了对应平台的sdk函数,那么驱动的工作就是对这些sdk函数进行封装就可以了,另外一种就是自己编写具体平台的驱动接口了。比如说,现在你需要编写串口、i2c、i2s、FLASH、网卡、LCD、触摸屏、USB驱动了。这个时候,你手里面除了一堆芯片手册,啥也没有。能不能调试成功,就看你自己的了。当然,一般情况下,在特定的平台上会有很多同类型的demo代码,你可以依葫芦画瓢修改一下,除了中断、地址、读写等部分注意一下,大部分的逻辑其实差异不大。至于修改的速度快不快就看你自己的了.
我们今天所要说的是linux驱动编写。现在linux驱动比较流行,主要有几个方面的原因:1)linux平台免费,很多芯片厂商希望linux平台支持自己的产品;2)最近android平台很火,这在无形之中帮了linux的忙,搞linux驱动的人也开始多了起来;3)还有就是收入了,按照目前基本行情来说,搞driver驱动的收入要比一般的开发工程师的收入要高一些,这可以从招聘网站上得到答案,因此很多朋友也乐于转到这一行。那么,此时很多朋友可能就有疑问了,搞芯片驱动设计难道真的要懂linux吗?
其实驱动和linux本来就是两码事。就拿一个lcd来说,我们可以在windows ce上编写驱动,也可以利用linux framebuffer编写驱动,当然如果是做通信的朋友,也可以利用vxworks来做驱动。驱动没有限制,但是它也要和具体的操作系统平台联系起来,这样才有意义。当然又有朋友说了,非要操作系统不可吗?其实不要操作系统也可以,做一个简单的while(1)前后台系统系统也可以,只不过这样开发的效率不高,而且可扩展性不好。既然linux已经为我们把框架都搭好了,我们为什么不可以把它直接拿来进行利用处理呢?
熟悉linux平台的朋友都知道。在linux上,所有的设备都可以看成是文件。我们对设备的所有操作基本上都可以简化成open、close、read、write、io control这几个操作。至于这几个操作具体做了什么,那就需要我们自己实现了。现在,linux驱动开发过程已经发展得很成熟了,除了很多的demo代码、书籍,网上还有很多的视频可以学习。其中,我个人比较喜欢的还是宋宝华、韦东山的书。前者偏向于理论多一些,后者的书更加注重于实践部分的内容.
说了这么多,大家可能问怎么做好linux驱动的开发工作呢?对于我自己,一般是这么处理的, 。
(01)找两台电脑,一台电脑安装windows系统,另外一台电脑安装linux系统,至于类型没有限制; 。
(02)查看linux系统的版本类型,输入uname -r即可; 。
(03)根据获取的linux kernel版本,在www.kernel.org上面寻找合适的kernel版本,直接用wget下载即可; 。
(04)用tar解压内核版本,将boot下config文件拷贝到本地,输入make menuconfig,直接保存即可; 。
(05)输入make -j2 & make modules_install & make install即可,系统重启; 。
(06)在linux系统起来后,注意在grub启动的时候选择刚刚编译的内核版本,这样就可以在linux上开发kernel驱动了; 。
(07)在windows 平台安装secureCRT工具,和linux取得连接; 。
(08)输入下面的代码,分别是hello.c和Makefile,其中hello.c内容如下 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/module.h>
MODULE_LICENSE(
"GPL"
);
MODULE_AUTHOR(
"feixiaoxing"
);
MODULE_DESCRIPTION(
"This is just a hello module!\n"
);
static
int
__init hello_init(
void
)
{
printk(KERN_EMERG
"hello, init\n"
);
return
0;
}
static
void
__exit hello_exit(
void
)
{
printk(KERN_EMERG
"hello, exit\n"
);
}
module_init(hello_init);
module_exit(hello_exit);
|
Makefile的内容如下所示 。
1
2
3
4
5
6
7
8
9
10
11
12
|
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
|
(09)编译的时候,直接make即可,当然前提是这两个文件必须在一个目录下; 。
(10)编译后生成hello.ko文件,大家可以把它想象成一个普通的执行文件; 。
(11)如果需要安装,直接insmod hello.ko即可,输入dmesg | tail 可以看到打印的内容,输入lsmod | grep hello也可以看一下模块是否已经安装; 。
(12)如果删除模块,直接输入rmmod hello即可,当然添加和删除的操作都需要在root模式下进行操作.
所以说,linux驱动简单的开发步骤就是这些.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/feixiaoxing/article/details/8533822 。
最后此篇关于详解linux驱动编写(入门)的文章就讲到这里了,如果你想了解更多关于详解linux驱动编写(入门)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试为基于 arm 的板交叉编译驱动程序。在 make 文件中,包含文件的搜索路径是主机内核的路径,即它指向 ubuntu 附带的 linux 头文件。我在主机系统(i7/ubuntu)上也有目
1、准备材料 开发板(正点原子stm32f407探索者开发板V2.4) 。 STM32CubeMX软件(Version 6.10.0) 。 野火DAP仿真器 。 keil µVis
是否可以通过 c# 应用程序“驱动”excel(即从 excel gui 下拉列表中选择某些内容,按下按钮并读取特定单元格的内容)? 这并不是真正用于测试,而是用于类似于 selenium 的数据报废
给定任何具有超过 5 个 View 和 View 模型的中间 MVVM 应用程序,是否有任何推荐的设计模式来说明如何为此类应用程序搭建脚手架? 现在我通常有一个在 App.OnStartup 中创建的
我想知道如何使用曼哈顿距离启发式来驱动 NxN 二维数组中的搜索。我有以下曼哈顿距离: private int manhattan(int[] pos, int tile) { int
我试图了解 CUmodule 在 CUDA 驱动程序 API 函数中实际上代表什么。 许多 CUDA 驱动程序 API 函数都有一个 CUmodule 句柄,但它是什么?它是引导驱动程序调用过程的 d
我正在尝试创建一个 java 程序,它将创建 excel 文件并将其上传到谷歌驱动器中。上传后我需要它来授予权限。我已经完成了所有这些,但问题在于尝试将 excel 文件转换为 google 文件,以
我正在拼命尝试从 Linux(Raspbian 内核 4.4.12-v7+)与使用 TIUSB3410 USB 部件的设备进行通信。 这是 dmesg 的输出: [ 2730.016013] usb
我有一个关于在 PCIe 上使用突发读写的问题。我有一个 fpga,它通过 PCIe 连接到 cpu。我有一个简单的驱动程序,仅用于测试。驱动程序向 FPGA 写入数据以及从 FPGA 读取数据。 f
我有大约 500 条通往特定页面的可能路径,我需要测试所有这些路径。该页面的每个路径看起来都类似于此(使用 PHP 网络驱动程序;通常有大约 10 个步骤): // Navigate to form
如果chrome驱动的版本和当前的chrome版本不同,我想写一个python代码,下载并运行与当前chrome版本匹配的chrome驱动。 这就是我一直在寻找的东西 driver = webdriv
我在 Centos 7 Linux 机器上尝试通过 pyodbc 连接到 SQL 数据库。我了解到您需要设置 DSN,您可以通过安装 freetds 驱动程序并执行以下操作来实现: import py
是否可以使用 NUnit 通过 NDepend 运行 CQL 查询?如果能够将 NDepend dll 包含在 UnitTests 库中并编写如下测试,那就太好了: [Test] public voi
我在 cassandra 中有巨大的表,超过 20 亿行并且还在增加。这些行有一个日期字段,它遵循日期桶模式以限制每一行。 即便如此,对于某个特定日期,我也有超过一百万条条目。 我想尽快读取和处理每一
考虑以下示例,其中一个模块的输出 (inner::out) 应该驱动两个输出(outer::out 和 outer::out2) 的上层层次: #include SC_MODULE(inner) {
我不确定是否可以有一个具有多个 MySQL 根的连接器。当我尝试只使用一根根时,它效果完美。我的有 2 个根的代码如下所示: [ 'locale' => 'es_ES.UTF-8',
我的桌面APP无法注册Mysql JDBC驱动 我下载mysql-connector-java-5.1.16.zip 解压mysql-connector-java-5.1.16-bin.jar并将其放
我有一个无限循环等待输入的 python 脚本,然后输入发生时做一些事情。我的问题是制作 python告诉 emacs 做某事。我只需要一些方法来发送 emacs 输入并让 emacs 评估该输入。
我最初问的没有明确说明我的问题/问题,所以我会更好地解释它。我有一个将 JDialog 设置为可见的 JButton。 JDialog 有一个 WindowListener 将其设置为在 window
假设“doc”是我想插入到 MongoDB 集合中的一些文档,而“collection”是我要将文档插入到的集合。 我有如下内容: try { WriteConcern wc = new Wr
我是一名优秀的程序员,十分优秀!