首页
学习
活动
专区
工具
TVP
发布

Linux内核驱动编写

# 前言 开发过单片机的小伙伴可以看一下我之前的一篇文章从单片机开发到linux内核驱动,以浅显易懂的方式带你敲开Linux驱动开发的大门。...# 正文 用户空间的每个函数(用于使用设备或者文件的),在内核空间中都有一个对应的功能相似并且可将内核的信息向用户空间传递的函数。 下表为几种设备驱动事件和它们在内核和用户空间对应的接口函数。...memory.c /** * * 驱动初始化 */ /* Necessary includes for device drivers */ #include <linux...这个函数工作在内核空间,用于为该驱动程序的缓冲区分配内存。 * 它和我们熟悉的malloc函数很相似。 * 最后,如果注册主设备号或者分配内存失败,模块将退出。...在内核维护的设备和驱动列表中寻找你在驱动模块中注册的设备和驱动

7K20

Linux内核设备驱动Linux内核基础笔记整理

Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2....编写内核驱动 #include #include static int __init test_init(void) { return...0; //返回0表示成功, 返加负数退出加载模块 } //__init 当内核驱动初始化完后, 释放此函数的代码指令空间 static void __exit test_exit(void) { ....驱动模块的Makefile obj-m += test.o //源码文件为test.c modules:make -C 内核源码目录 M=驱动代码所在目录 modules modules install...:make -C 内核源码目录 M=驱动代码所在目录 modules_install INSTALL_MOD_PATH=/文件系统路径 clean:make -C 内核源码目录 M=驱动代码所在目录

1.8K51
您找到你想要的搜索结果了吗?
是的
没有找到

linux内核驱动模型详解_arduino驱动安装

转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter Linux SPI驱动分为核心层,控制器驱动层和设备驱动层。...核心层是Linux的SPI核心部分,提供了核心数据结构的定义,总线、设备和驱动的注册、注销管理等,提供与上层的统一接口。...linux将I2C、SPI、USB等总线驱动隔离成控制器驱动和设备驱动,使两者相对独立。 本文以qcom的spi控制器为例,对spi控制器驱动进行解析。kernel代码版本是3.18。...linux驱动与设备是一对多的关系,在spi_master设备注册时,控制器的结构体信息会提供给spi_master作为私有数据。...总线传输涉及到几个重要的结构体,队列,内核工作线程和厂商的总线传输实现几个方面。

11K40

linux内核编译AX99100驱动

linux内核版本:4.14 pcie转四路串口芯片:亚信的AX99100 linux内核里是没有这块芯片的驱动的,这里自己添加驱动进去进行编译。...1.从亚信官网下载该芯片的linux驱动https://www.asix.com.tw/cs/download.php?...sub=driverdetail&PItemID=256 2.在 linux/drivers/tty/serial/的目录下新建一个99xx的目录,把解压之后的文件里除了.cache.mk、Makefile...下的Kconfig,增加 source "drivers/tty/serial/99xx/Kconfig" 7.在linux目录下,使用你自己的编译器进入menuconfig进行内核配置(make menuconfig...Device Drivers > Character devices > Serial drivers目录下,勾选以下两个刚才添加的选项,并把8250的两个选项取消选中 9.进行编译,这样就把AX99100的驱动编译进内核里了

8.1K31

谈谈Linux内核驱动的coding style

最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多。...当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代码的时候在很多细节上会照顾不周。不过, 在不遵守规则的程序员队伍里,我并不是孤独的。...如果去看drivers/staging下的代码,就会发现很多驱动程序都没有严格遵守内核的coding style,而且在很多驱动程序的TODO文件里,都会把"checkpatch.pl fixes"作为自己的目标之一...在Linux内核的coding style里,switch和case要求有相同的缩进。本例的代码很少,错误也只有这一个,手动修改很方便。如果类似的缩紧错误很多怎么办?...比如,Linux内核的coding style要求,行尾不能有空格(包括Tab),去除这些空格就可以借助sed。 我自己的习惯很差,经常在代码的行尾留下一些空格。

1.7K10

Linux内核设备驱动内核的调试技术笔记整理

/****************** * 内核的调试技术 ******************/ (1)内核源代码中的一些与调试相关的配置选项 内核的配置选项中包含了一些与内核调试相关的选项,都集中在...具体的调试选项说明可参见驱动一书,或通过menuconfig的help说明查看。...通常,发送完oops后,内核会处于一种不稳定状态。...在某些情况下,oops会导致内核混乱,而混乱的结果就是死机,这些情况可能包括: *oops发生在持有锁的代码中 *oops发生在和硬件设备通讯的过程中 *oops在中断上下文中发生 *oops发生在idle...进程(0)或init进程(1),因为内核没有这两个进程没法工作 如果oops在其他进程运行时发生,内核会杀死该进程并尝试着继续运行。

2.1K41

Linux内核的LED设备驱动框架【转】

驱动框架的概念 内核驱动部分维护者针对每个种类的驱动设计一套成熟的、标准的、典型的驱动实现,并把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开发工程师来实现,这就叫驱动框架...因此,Linux中LED的驱动框架把所有LED设备的共性给实现了,把不同的地方留给驱动工程师去做。...内核在启动过程中,内核需要按照先后顺序去进行初始化操作。因此,内核给是给启动时要调用的所有初始化函数归类,然后每个类按照一定的次序去调用执行。...内核开发者在编写内核代码时只要将函数设置合适的级别,这些函数就会被链接的时候放入特定的段,内核启动时再按照段顺序去依次执行各个段即可。...详见Linux设备管理:sysfs文件系统的功能及其应用。 led_class_attrs结构体数组设置了leds设备类的属性,即led硬件操作的对象和方法。

2.5K10

Linux内核平台总线设备驱动模型浅析

复习总线设备驱动模型,做了一点小笔记,大牛略过。 一、Linux系统的驱动框架的基础很大一部分是围绕着总线设备驱动模型展开的。...二、涉及3个重要结构体: struct bus_type:总线 struct device :设备 struct device_driver:驱动 三、结构体核心代码分析(2.6.38内核) structbus_type..., pci_dev,usb_device,i2c_device, spi_device等)都包含一个struct device结构体,当这些驱动内核注册各式各样的设备时,其实最终都会调用到: intdevice_register...structdevice_driver结构体,当这些驱动内核注册各式各样的驱动时,最终都会调用到: int driver_register(structdevice_driver *drv) {    ...; } 无论是调用driver_register()注册驱动, 还是用device_register注册设备, 内核都会调用总线的match函数来探测是否有合适device_driver的device或者是否有合适

1.9K30

Linux驱动开发-内核共享工作队列

,一个工作简单理解就是对应于一个函数,可以通过内核调度函数来调用work_struct中func指针所指向的函数。...案例代码 3.1 共享工作队列-按键驱动 下面这份代码是在一个按键驱动代码,在按键中断服务函数里调度共享队列,最终在工作函数里完成按键值的检测打印。工作队列采用的是共享工作队列。...); /*许可证*/ MODULE_LICENSE("GPL"); 3.2 自定义工作队列-按键驱动 工作队列除了可以使用内核共享队列以外,也可以自己创建队列,下面这份代码就演示如何自己创建队列,并完成初始化...*中断IO口定义*/ #include /*内核定时器相关*/ #include /*等待队列相关*/ #include...内核分配给设备的主设备号和设备名字 /*动态分配cdev结构体,返个cdev结构;如果执行失败,将返回NULL。

1.9K50

Linux内核设备驱动内核的时间管理笔记整理

/****************** * linux内核的时间管理 ******************/ (1)内核中的时间概念 时间管理在linux内核中占有非常重要的作用。...相对于事件驱动而言,内核中有大量函数是基于时间驱动的。 有些函数是周期执行的,比如每10毫秒刷新一次屏幕; 有些函数是推后一定时间执行的,比如内核在500毫秒后执行某项任务。...要区分: *绝对时间和相对时间 *周期性产生的事件和推迟执行的事件 周期性事件是由系统系统定时器驱动的 (2)HZ值 内核必须在硬件定时器的帮助下才能计算和管理时间。...*使用 u64 j2; j2 = get_jiffies_64(); (4)获得当前时间 驱动程序中一般不需要知道墙钟时间(也就是年月日的时间)。但驱动可能需要处理绝对时间。...为此,内核提供了两个结构体,都定义在: struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec

2.5K31

Linux内核设备驱动之高级字符设备驱动笔记整理

linux内核采用约定方法为驱动程序选择ioctl号,可以参考include/asm/ioctl.h和Documentation/ioctl-number.txt。...一个ioctl号为32位,linux将其分成4个部分,构建一个ioctl号码所需要的宏都定义在: type 8位幻数。其实就是为你的驱动选定一个号码。...不是所有的设备都支持异步通知,应用程序通常假设只有套接字和终端才有异步通知能力. (5)驱动程序中如何实现异步通知 a.用户空间操作在内核的对应 01.当设定F_SETOWN时,对file->f_owner...03.当数据到达时,由内核发送一个SIGIO信号给所有注册为异步通知的进程 b.在设备结构体中加入fasync_struct的指针 该结构在中定义: struct fasync_struct...linux/fs.h>中声明。

3.4K31

Linux内核设备驱动之内存管理笔记整理

/********************** * linux的内存管理 **********************/ 到目前为止,内存管理是unix内核中最复杂的活动。...无论是应用程序还是驱动程序,我们在程序中使用的地址都是虚拟地址。 *物理地址(physical address) 32位无符号整数,与从CPU的地址引脚发送到存储器总线上的电信号相对应。...这些特性包括: *一些硬件只能用某些特定的内存地址来执行DMA *一些体系结构其内存的物理寻址范围远大于虚拟寻址范围,这样,就有一些内存不能永久地映射到内核空间 针对这些限制,linux采用了三种区(中的struct zone。...注意,kmalloc不能分配高端内存 b.释放 #include void kfree(const void *ptr); 如果要释放的内存已经被释放了,或者释放属于内核其他部分的内存

1.6K20

Linux内核模块驱动加载与dmesg调试

因为近期用到了Linux内核的相关知识,下面随笔将给出内核模块的编写记录,供大家参考。...1、运行环境   Ubuntu 版本:20.04   Linux内核版本:5.4.0-42-generic   gcc版本:gcc version 9.3.0   驱动和一般应用程序的执行方式很大不同...2、内核模块模型说明 (1)驱动和一般应用程序的执行方式很大不同   一般应用由main函数开始执行,流程基本由程序自身控制   驱动程序没有main函数,由回调方式驱动运行 (2)回调方式:   先向内核注册函数...,然后应用程序触发这些函数的执行   例如:驱动程序在初始化时,向内核注册处理某个设备写操作的函数   当应用程序使用write系统调用写该设备时,内核就会调用注册的上述函数 3、内核模型常见的回调函数举例...$ sudo rmmod PrintModule命令来卸载驱动,也是通过dmesg来查看内核驱动信息(也可通过输出调试信息的函数printk来进行调试): image.png

6.3K20
领券