7.设备驱动开发的基本函数

2023-11-07

7.1.I/O口函数

无论驱动程序多么复杂,归根结底,无非还是向某个端口或者某个寄存器位赋值,这个值只能是0或1。接收值的就是I/O口。与中断和内存不同,使用一个没有 申请的I/O端口不会使处理器产生异常,也就不会导致诸如“segmentationfault”一类的错误发生。由于任何进程都可以访问任何一个I/O 端口,此时系统无法保证对I/O端口的操作不会发生冲突,甚至因此而使系统崩溃。因此,在使用I/O端口前,也应该检查此I/O端口是否已有别的程序在使 用,若没有,再把此端口标记为正在使用,在使用完以后释放它。

这样需要用到如下几个函数:

int check_region(unsigned int from,unsigned int extent);

void request_region(unsigned int from,unsigned int extent,const char *name);

void release_region(unsigned int from, unsignedint extent);

调用这些函数时的参数为:

— from表示所申请的I/O端口的起始地址;

— extent为所要申请的从from开始的端口数;

— name为设备名,将会出现在/proc/ioports文件里;

— check_region返回0表示I/O端口空闲,否则为正在被使用。

在申请了I/O端口之后,可以借助asm/io.h中的如下几个函数来访问I/O端口:

inline unsigned int inb(unsigned shortport);

inline unsigned int inb_p(unsigned shortport);

inline void outb(char value, unsigned shortport);

inline void outb_p(char value,unsigned short port);

其中inb_p和outb_p插入了一定的延时以适应某些低速的I/O端口。

7.2.时钟函数

在设备驱动程序中,一般都需要用到计时机制。在Linux系统中,时钟是由系统接管的,设备驱动程序可以向系统申请时钟。与时钟有关的系统调用有:

#include <asm/param.h>

#include <linux/timer.h>

void add_timer(struct timer_list * timer);

int del_timer(struct timer_list * timer);

inline void init_timer(struct timer_list *timer);

struct timer_list的定义为:

struct timer_list {

struct timer_list *next;

struct timer_list *prev;

unsigned long expires;

unsigned long data;

void (*function)(unsigned long d);

};

其中,expires是要执行function的时间。系统核心有一个全局变量jiffies表示当前时间,一般在调用add_timer时 jiffies=JIFFIES+num,表示在num个系统最小时间间隔后执行function函数。系统最小时间间隔与所用的硬件平台有关,在核心里 定义了常数HZ表示一秒内最小时间间隔的数目,则num*HZ表示num秒。系统计时到预定时间就调用function,并把此子程序从定时队列里删除, 可见,如果想要每隔一定时间间隔执行一次的话,就必须在function里再一次调用add_timer。function的参数d即为timer里面的 data项。

7.3.内存操作函数

作为系统核心的一部分,设备驱动程序在申请和释放内存时不是调用malloc和free,而代之以调用kmalloc和kfree,它们在linux/kernel.h中被定义为:

void * kmalloc(unsigned int len, intpriority);

void kfree(void * obj);

参数len为希望申请的字节数,obj为要释放的内存指针。priority为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般由取值GFP_KERNEL解决即可。

7.4.复制函数

在用户程序调用read、write时,因为进程的运行状态由用户态变为核心态,地址空间也变为核心地址空间。由于read、write中参数buf是指向用户程序的私有地址空间的,所以不能直接访问,必须通过下面两个系统函数来访问用户程序的私有地址空间。

#include <asm/segment.h>

void memcpy_fromfs(void * to,const void *from,unsigned long n);

void memcpy_tofs(void * to,const void *from,unsigned long n);

memcpy_fromfs由用户程序地址空间往核心地址空间复制,memcpy_tofs则反之。参数to为复制的目的指针,from为源指针,n为要复制的字节数。

在设备驱动程序里,可以调用printk来打印一些调试信息,printk的用法与printf类似。printk打印的信息不仅出现在屏幕上,同时还记录在文件syslog里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7.设备驱动开发的基本函数 的相关文章

  • 继电器、并联的二极管和驱动三极管选型实战演练

    继电器选型原则 继电器的选用原则参见下表 在表中 必须确定 栏中有 号的项目被确定之后 就可选定一款继电器 如果有进一步的要求 需要进一步考虑 参考 栏中有 号的相应项目 下面对表格中的所有参数进行详细说明 触点 1触点负载 确定继电器所能
  • 初学树莓派——(六)树莓派安装OpenCV及USB摄像头配置

    目录 1 安装OpenCV 1 1前言 1 2换源及源内容更新 1 3安装依赖 1 4下载whl包 1 5安装OpenCV 1 6检查安装 2 USB摄像头配置 同时检查OpenCV安装情况 2 1前言 2 2Python调用cv2库来检查
  • Eclipse搭建stm32+jlink开发环境全攻略(高级篇)

    Eclipse搭建stm32 jlink开发环境全攻略 高级篇 一 问题概况 通过初级篇的学习 我们知道了一个Eclipse工程的配置以及调试 貌似使用也没什么问题 然而 当我们抛弃掉Eclipse自带的工程模版是 也抛弃的他的一些其他的功
  • STM32的CAN过滤器

    最近开始给足底压力设备加外设 这里外设个主设备之间通过can总线连接 之前使用过can总线 但是对can的过滤器不是很理解 所以这里就借机整理一下 原文地址 再谈STM32的CAN过滤器 bxCAN的过滤器的4种工作模式以及使用方法总结 S
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • LCD笔记(4)分析内核自带的LCD驱动程序

    1 驱动程序框架 Linux驱动程序 驱动程序框架 硬件编程 在前面已经基于QEMU编写了LCD驱动程序 对LCD驱动程序的框架已经分析清楚 核心就是 分配fb info 设置fb info 注册fb info 硬件相关的设置 1 1 入口
  • iOS逆向工程之App脱壳

    本篇博客以微信为例 给微信脱壳 砸壳 在iOS逆向工程中是经常做的一件事情 因为从AppStore直接下载安装的App是加壳的 其实就是经过加密的 这个 砸壳 的过程就是一个解密的过程 未砸壳的App是无法在Class dump Hoppe
  • stm32USB之模拟U盘

    STMF0 W25Q32模拟U盘 1 第一次写博客 如有错误 请及时指正 如有表达不通顺的地方 敬请谅解 2 本篇文章主要描述如何使用STM32cube配置USB 使用的主控为STM32F072 Flash为W25Q32 使用的主控RAM只
  • 计算机毕业设计项目大全

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件 又称为脉冲电机 在驱动电源的作用下 步进电机受到脉冲的控制 其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比 步进电机每接收一个电脉冲 转
  • MSP430嵌入式接口编程(惯性测量单元温湿度双音多频磁力计LCD显示等)

    Energia IDE编程MSP430 GPIO 串口通讯 定时中断 添加库 嵌入式器件接口编程 加速度计 include
  • connect函数的用法

    作者 曾宏安 华清远见嵌入式学院讲师 在网络编程中 connect函数经常用来在套接字上初始化连接 无论是流式套接字还是数据报套接字都可以使用connect函数 但含义却不一样 下面我们分别来讨论一下 一 流式套接字 流式套接字通常使用的是
  • keil mdk代码提示与代码补全设置

    主要参考https blog csdn net w5862338 article details 50520423 结合自己的实际问题 一旦习惯了一些实用的功能 当进入到类似的环境中而没有熟悉的功能 会觉得很不方便 代码提示与补全就是这样实
  • U-Boot启动过程完全分析

    1 1 U Boot工作过程 U Boot启动内核的过程可以分为两个阶段 两个阶段的功能如下 1 第一阶段的功能 硬件设备初始化 加载U Boot第二阶段代码到RAM空间 设置好栈 跳转到第二阶段代码入口 2 第二阶段的功能 初始化本阶段使
  • 通过External Tools在STM32CubeIDE下使用DAP-LINK

    目录 一 文章背景 二 准备工作 2 1 Stm32CubeIDE 2 2 DAP LINK 2 3 STM32目标板 三 配置过程 3 1 连接目标板 3 2 配置仿真器 3 3 更改调试设置为远程调试 3 4 新建OpenOcd扩展工具
  • 步进电机基础(5.6)-步进电机的驱动与控制-闭环控制

    步进电机基础 5 6 步进电机的驱动与控制 闭环控制 前言 基本信息 前言说明 5 6 闭环控制 前言 基本信息 名称 描述说明 教材名称 步进电机应用技术 作者 坂本正文 译者 王自强 前言说明 根据我读的 步进电机应用技术 这本书 进行
  • [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL s...

    Err 1064 You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the rig
  • 属性,服务,事件

    属性 即设备支持的可读和 或可设置的参数功能 以一个灯为例 灯的开关就可以定义为一个属性 用户可以读取该属性的当前数值来得知灯的开关状态 也可以通过对该属性进行设置来打开或者关闭这个灯 服务 如果设备的某个功能只能设置 不能获取 那么可以将
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • Linux值得学习吗?打工人利用业务时间学习Linux需要多长时间?

    nbsp Linux值得学习吗 打工人利用业务时间学习Linux需要多长时间 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Linux的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评

随机推荐