首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核驱动编写

大家好,又见面了,我是你们朋友全栈君。 # 前言 开发过单片机小伙伴可以看一下我之前一篇文章从单片机开发到linux内核驱动,以浅显易懂方式带你敲开Linux驱动开发大门。...# 正文 用户空间每个函数(用于使用设备或者文件),在内核空间中都有一个对应功能相似并且可将内核信息向用户空间传递函数。 下表为几种设备驱动事件和它们在内核和用户空间对应接口函数。...这个函数工作在内核空间,用于为该驱动程序缓冲区分配内存。 * 它和我们熟悉malloc函数很相似。 * 最后,如果注册主设备号或者分配内存失败,模块将退出。...但是模块加载到内核中,还是不能用,得有具体设备才能用。 如果驱动模块中有实现自动生成当前设备文件节点代码,那么会使用和热拔插相关代码脚本,自动在/dev下面生成对应设备文件。...当然最终都要运行mknod命令,它会根据你传进去主次设备号和类型。在内核维护设备和驱动列表中寻找你在驱动模块中注册设备和驱动

7.1K20

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

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

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

谈谈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内核驱动模型详解_arduino驱动安装

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

11.1K40

Linux 内核之字符设备驱动

本篇介绍 本篇介绍下如何写字符设备驱动程序。...支持阻塞IO驱动demo Linux设备类型可以大概分为以下几种: 字符设备:以字节为单位传输,传输率低,不支持随机访问,常见设备有鼠标,键盘,触摸屏等 块设备: 以块位单位传输,常见就是磁盘...先看下字符设备结构 struct cdev { struct kobject kobj; // 用于linux设备驱动模型 struct module *owner; // 字符设备驱动所在内核模块对象指针...再介绍下misc 设备,linux 内核将一些不符合预先确定字符设备划分为杂项设备,使用数据结构如下; struct miscdevice { int minor; const char...提到多路复用,就是linux中著名poll,epoll,select机制,在内核中对应文件方法就是: __poll_t (*poll) (struct file *, struct poll_table_struct

4.8K40

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

/****************** * 内核调试技术 ******************/ (1)内核源代码中一些与调试相关配置选项 内核配置选项中包含了一些与内核调试相关选项,都集中在...包括: CONFIG_DEBUG_KERNEL 使其他调试选项可用,应该选中,其本身不会打开所有的调试功能。 具体调试选项说明可参见驱动一书,或通过menuconfighelp说明查看。...有用参数有: -t 显示调用发生时间 -T 显式调用所花费时间 -f 跟踪所有子进程 -p 跟踪特定进程 -o 将输出信息导入特定文件 (5)查看oops消息 oops是内核告知用户有不幸发生最常用方式...在某些情况下,oops会导致内核混乱,而混乱结果就是死机,这些情况可能包括: *oops发生在持有锁代码中 *oops发生在和硬件设备通讯过程中 *oops在中断上下文中发生 *oops发生在idle...进程(0)或init进程(1),因为内核没有这两个进程没法工作 如果oops在其他进程运行时发生,内核会杀死该进程并尝试着继续运行。

2.1K41

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

驱动框架概念 内核驱动部分维护者针对每个种类驱动设计一套成熟、标准、典型驱动实现,并把不同厂家同类硬件驱动中相同部分抽出来自己实现好,再把不同部分留出接口给具体驱动开发工程师来实现,这就叫驱动框架...因此,Linux中LED驱动框架把所有LED设备共性给实现了,把不同地方留给驱动工程师去做。...内核在启动过程中,内核需要按照先后顺序去进行初始化操作。因此,内核给是给启动时要调用所有初始化函数归类,然后每个类按照一定次序去调用执行。...接口 LED设备驱动框架为驱动开发者LED设备驱动卸载接口。...调用led_classdev_unregister()函数卸载LED设备驱动

2.5K10

Linux内核驱动开发EXPORT_SYMBOL

简介 本文主要来讲讲Linux内核驱动中,EXPORT_SYMBOL()宏定义用法。 在阅读Linux内核驱动源码时候,我们会发现很多函数带有EXPORT_SYMBOL()宏定义。...从这个宏定义理解为输出符号。那么他究竟有什么作用。...EXPORT_SYMBOL()宏定义作用 EXPORT_SYMBOL宏定义定义函数或者符号将对内核代码公开,不用修改内核代码就在其他内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号方式导出给其他模块使用...extern int rice_func(void); 先加载定义该函数模块,然后再加载调用该函数模块,先后顺序必须注意。...实验 编写代码 编写两个模块:rice_export.ko 和 rice_import.ko,其中: rice_export.ko:导出定义函数 rice_import.ko:调用导出函数 导出函数模块代码

2.4K20

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

/****************** * linux内核时间管理 ******************/ (1)内核时间概念 时间管理在linux内核中占有非常重要作用。...相对于事件驱动而言,内核中有大量函数是基于时间驱动。 有些函数是周期执行,比如每10毫秒刷新一次屏幕; 有些函数是推后一定时间执行,比如内核在500毫秒后执行某项任务。...要区分: *绝对时间和相对时间 *周期性产生事件和推迟执行事件 周期性事件是由系统系统定时器驱动 (2)HZ值 内核必须在硬件定时器帮助下才能计算和管理时间。...定时器产生中断频率称为节拍率(tick rate)。 在内核中指定了一个变量HZ,内核初始化时候会根据这个值确定定时器节拍率。...定时器处理函数 */ unsigned long data; /* 传给定时器处理函数参数 */ } 内核在中提供了一系列管理定时器接口。

2.5K31

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

通常,主设备号标示设备对应驱动程序,linux允许多个驱动共用一个主设备号; 而次设备号用于确定设备文件所指设备。 在内核中,用dev_t类型保存设备编号。...2.4内核中采用16位设备号(8位主,8位从),而2.6采用32位,12位主,20位从。 在驱动中访问设备号应该用中定义宏。...见和驱动p54 2.6内核结构初始化: struct file_operations my_fops = { .owner = THIS_MODULE, .llseek =...cdev { struct kobject kobj; //内核用于管理字符设备驱动 struct module *owner; //通常设为THIS_MODULE, 用于防止驱动在使用中时卸载驱动模块...卸载模块时, 要把设备驱动内核里移除, 并把设备号反注册 cdev_del(&mycdev); ///////////创建设备文件 mknod /dev/设备文件名 c 主设备号 次设备号 /////

4.6K20

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

复习总线设备驱动模型,做了一点小笔记,大牛略过。 一、Linux系统驱动框架基础很大一部分是围绕着总线设备驱动模型展开。...   void   *platform_data;    // 平台特定数据,一般我们移植内核时需填充该结构体(如支持mini2440nandflash,dm9000等)    dev_t          ..., pci_dev,usb_device,i2c_device, spi_device等)都包含一个struct device结构体,当这些驱动内核注册各式各样设备时,其实最终都会调用到: intdevice_register...等)都包含一个structdevice_driver结构体,当这些驱动内核注册各式各样驱动时,最终都会调用到: int driver_register(structdevice_driver *drv...(drv); } 无论是调用driver_register()注册驱动, 还是用device_register注册设备, 内核都会调用总线match函数来探测是否有合适device_driverdevice

1.9K30

Linux驱动开发-内核定时器

内核定时器介绍 内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数一种机制,相关函数位于 和 kernel/timer.c 文件中...每当时钟中断发生时,全局变量jiffies(一个32位unsigned long 变量)就加1,因此jiffies记录了linux系统启动后时钟中断发生次数,驱动程序常利用jiffies来计算不同事件间时间间隔...删除定时器*/ del_timer_sync(&timer); printk("驱动测试: 驱动卸载成功\n"); } module_init(tiny4412_linux_timer_init...); /*驱动入口--安装驱动时候执行*/ module_exit(tiny4412_linux_timer_cleanup); /*驱动出口--卸载驱动时候执行*/ MODULE_LICENSE...内核提供延时函数 Linux 内核中提供了进行纳秒、微秒和毫秒延迟。

2.7K50

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

内核工作队列 工作队列常见使用形式是配合中断使用,在中断服务函数里无法调用会导致休眠相关函数代码,有了工作队列机制以后,可以将需要执行逻辑代码放在工作队列里执行,只需要在中断服务函数里触发即可,...;内核使用这个结构来描述一个工作,一个工作简单理解就是对应于一个函数,可以通过内核调度函数来调用work_struct中func指针所指向函数。...案例代码 3.1 共享工作队列-按键驱动 下面这份代码是在一个按键驱动代码,在按键中断服务函数里调度共享队列,最终在工作函数里完成按键值检测打印。工作队列采用是共享工作队列。...); /*许可证*/ MODULE_LICENSE("GPL"); 3.2 自定义工作队列-按键驱动 工作队列除了可以使用内核共享队列以外,也可以自己创建队列,下面这份代码就演示如何自己创建队列,并完成初始化...内核分配给设备主设备号和设备名字 /*动态分配cdev结构体,返个cdev结构;如果执行失败,将返回NULL。

1.9K50

49 使用linux内核源码里矩阵键盘驱动

大家好,又见面了,我是你们朋友全栈君。 这个设备驱动适用于,矩阵键盘每行,每列都是接到一个IO口, 行线接IO口有中断功能. 需要在linux内核配置里选上相关配置。...在内核源码目录下: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Device Drivers --->...,再使用新内核镜像启动系统 使用新内核启动后,可以查看出设备驱动是否已选择上: /sys/bus/platform/drivers/目录下应有”matrix-keypad”目录 驱动源码在”drivers.../input/keyboard/matrix_keypad.c”, 里面是一个平台驱动,我们只要写平台设备描述硬件资源与此驱动匹配即可. 488 static struct platform_driver...//再确定结构体matrix_keypad_platform_data每个成员作用即可,如不清楚具体用途,可以在驱动代码里通过查看对成员值访问推出用途.

2.3K10

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

用户空间和内核空间命令号要一致。 (2)选择ioctl命令号 在编写ioctl代码之前,要选择对应不同命令编号。...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

3.4K31
领券