【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

在我离职之前,工作内容几乎不涉及到驱动方面的知识。我所要做的内容就是把客户对设备的请求拆分成一个一个的接口,调用驱动的设置进行配置就可以了。当然,至于驱动下面是怎么实现那就要根据具体情况而定了。比如说,有的驱动是芯片厂商直接写好的,假设芯片厂商提供了对应平台的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内容如下

#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的内容如下所示

ifneq ($(KERNELRELEASE),)
obj-m := hello.oelse
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

注意,如果是arm芯片,稍作修改即可

ifneq ($(KERNELRELEASE),)
obj-m := hello.oelse
PWD  := $(shell pwd)
KDIR := /your/kernel/lib/path
all:$(MAKE) -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
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驱动简单的开发步骤就是这些。

linux驱动编写(入门)相关推荐

  1. Linux驱动编写入门-新解

    1.驱动编写后是一个C文件,通过make命令对其进行编译,生成 .KO文件,这个文件就是可执行的驱动文件,通过使用insmod xx.ko即可执行此驱动文件.如下为一个完整的驱动程序C文件.(用的是讯 ...

  2. Linux驱动快速入门

    本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如果错漏,欢迎留言指正 应用层:<LUNIX环境高级编程第二版> <Linux程序设计(第四版)> 内核层:< ...

  3. linux驱动编写--2--应用程序控制led闪烁

    本系列教程的上一篇:  linux驱动编写--1--点亮led 目标:编写一个驱动程序,实现上一篇没写的 "接口".并编写一个测试程序,透过驱动来控制led闪烁. 硬件:micro ...

  4. linux驱动编写(虚拟字符设备编写)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关 ...

  5. linux驱动编写(设备树)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于linux的开发者来说,设备树其实比较熟悉.但是为什么要有设备树,很多人不了解,其实本质来说 ...

  6. linux驱动编写(看门狗)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 看门狗是linux驱动的一个重要环节.某些特殊的设备,有时候需要放在一些环境恶劣的地方,比如电信 ...

  7. linux驱动编写(platform总线和网卡驱动)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于linux驱动来说,一般的架构还是按照bus-host-device的形式来进行的.比如就拿 ...

  8. disk磁盘管理与Linux驱动编写

    磁盘管理 一.关于硬盘接口 安装linux red hat系统,到分区时发现硬盘驱动器设备 /dev/sda            #sata接口设备名 /dev/sda1#sda对应的物理分区 /d ...

  9. linux 驱动编写(sd卡驱动)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多.那下面我们可以看一下,linux驱动 ...

最新文章

  1. Jvm 系列(六):Java 服务 GC 参数调优案例
  2. python序列类型举例说明_Python基础__Python序列基本类型及其操作(1)
  3. Linux驱动之内核加载模块过程分析
  4. 不要和Java“结婚”
  5. Intellij导入子项目时,maven列表子项目灰色不可用---解决方法
  6. 《sql语句练习1》
  7. 通往大神之路,百度Java面试题前200页。
  8. python37安装失败_Linux 安装Python37
  9. python 交易日_Python判断某天是否为A股“交易日”?
  10. java大数 bigin_Java大数操作
  11. Ubuntu 搭建Facebook ATC弱网测试环境 使用路由器搭建ATC
  12. C#租房管理系统(课程设计)
  13. [软件更新]CuteFTP 8.3.3.0054
  14. InputDispatcher: Untrusted touch due to occlusion by
  15. three.js 05-04 之 BoxGeometry 几何体
  16. trinitycore MySQL模块_TrinityCore MMORPG服务器设计分析
  17. 客制化键盘编程_最全最细客制化键盘指南!(上)
  18. LCHub:vika维格表将 70 万行代码开源了
  19. Windows10 中 Apple 云盘 iCloud Drive 默认在 C 盘下的存储目录迁移到其他盘符的指定目录
  20. STM32 定时器中断函数

热门文章

  1. IDEA 运行maven命令时报错: -Dmaven.multiModuleProjectDirectory system propery is not set
  2. SCONS如何集成工具
  3. 【WPF】关于XAML Parse Exception,无法创建XXX的实例异常的一点小心得
  4. ssl介绍以及双向认证和单向认证原理 (转)
  5. oracle数组的使用
  6. 《VMware虚拟机实用宝典》繁体中文版封面
  7. Oracle 10g 高级安装图文教程(一)
  8. python处理txt文件的一种情况
  9. spring boot 自定义过滤器链
  10. 反射(3)—动态、静态代理