© 2000 Wind River Systems, Inc.

Slides:



Advertisements
Similar presentations
1 I/O 设备访问方式和类型. 2 Overview n The two main jobs of a computer: l I/O (Input/Output) l processing n The control of devices connneted to the computer is.
Advertisements

什么是SOPC: SOPC是英文System On a Programmable Chip的缩写,称为片上可编程系统。SOPC将传统的EDA技术、计算机系统、嵌入式系统、数字信号处理等融为一体,综合了各自的优势,且在结构上形成一块芯片。 为什么用SOPC:SOPC是现代电子技术和电子系统设计的发展趋势,建立了电子系统设计的新模式。用户利用SOPC开发平台,自行设计高速、高性能的DSP处理器、特定功能的CPU及其外围接口电路,创建结构最为简洁的电子系统。
Linux 安裝入門與基本管理 課程目標: 學習Linux平台下的安裝設定 與 建置一個基本的Linux伺服器
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
行程(process).
第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.
第2章 SOPC硬件开发环境及流程.
单片机应用技术 项目一 循环彩灯装置 第7讲 Keil软件的使用 《单片机应用技术》精品课程组 湖北职业技术学院机电工程系.
操作系统结构.
基于ARM和linux的开发 华中科技大学 武汉创维特 2017/3/20.
UClinux在3000平台上的移植.
基于操作系统的编程复习 张玉宏
Chapter 13 輸入/輸出系統 (I/O Systems)
Linux Further.
Linux.
嵌入式操作系统 陈香兰 Fall 2009.
高雄應用科技大學 有線網路建置實習(I) 聯易科技股份有限公司 Ben 李政勳
C File System.
中国科学技术大学计算机系 陈香兰(0512- ) spring 2011
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
PIC16F1827介紹 以微控器為基礎之電路設計實務-微處理器實驗室.
Linux设备驱动 (基于Linux2.6.xx内核).
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
单片机原理与应用 C/C++在现代数字计算机上的实现.
5 Computer Organization (計算機組織).
第七章. 文件系统 (lab5).
第7章 Linux环境编程.
第三章 系统的启动和初始化 (include lab1)
VxWorks基础培训.
第十章 应用程序测试.
多进程编程.
STRUCTURE 授課:ANT 日期:2010/5/12.
Ch 9: Input/Output System 输入/输出系统
CH.8 硬體管理.
模块五: 数控系统参数的备份与恢复 本章学习内容.
第2章 電腦硬體的架構及功能.
在專用的嵌入式板子運行 GNU/Linux 系統已經變得越來越流行。一個嵌入式 Linux 系統從軟體的角度看通常可以分為四個層次:
u-boot环境变量和常用命令 广州创龙电子科技有限公司
嵌入式系统及应用.
60秒内完成网络设备密码恢复 安博亚威:谢湘豫
第8章 記憶體管理的概念.
操作系统实验 lab1-系统引导
程式設計 博碩文化出版發行.
嵌入式系统的Boot Loader技术 陈文智 浙江大学计算机学院 2009年5月.
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
Ch9 Communicating with Hardware
Linux 文件操作——系统调用和标准 IO 库
第3章 認識處理元.
Author:BobZhang Copy Right 2007
合泰半导体股份有限公司 技术讲座 - Holtek V3 C Compiler介绍 主讲人:王幼端 2017/06/15.
第13章 计算机的保养.
Advister: Quincy Wu Speaker: Chenglin Tsai Date:3/26
Holtek C Compiler V3--advanced
(第2版).
Chapter 7 掌控記憶體.
嵌入式Linux开发流程 成都研究所操作系统团队.
嵌入式系统实验 ● 交叉开发实验 ● 仿真开发实验.
面向非连接的 SOCKET编程 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
Chapter 7 掌控記憶體.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
第二章ADS1.2开发环境创建与简介.
Go 语言编程 —— 平台研发部 吴植民.
VxWorks软硬件设计及实例分析
Arguments to the main Function and Final Project
《操作系统设计与实现》 第5章 文件系统.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

© 2000 Wind River Systems, Inc. VxWorks BSP Basics 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP概念 BSP功能 BSP构成 BSP启动序列 BSP开发 BSP部分代码 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP概念 BSP(Board Support Packet): 是介于底层硬件和上层软件之间的底层软件开发包,它主要用来屏蔽底层硬件,进行硬件系统的初始化并调用外设的驱动程序接口管理系统外设。 BSP由两部分组成:初始化和驱动程序 初始化:指系统从上电复位开始直到wind kernel和usrRoot根任务启动的这段系统的执行过程。包括寄存器操作、直接I/O操作。 驱动程序:调用某具体硬件设备的驱动程序的接口对该硬件初始化的过程。如串口驱动,网口驱动等。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP主要完成: 单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持; 为操作系统提供设备驱动程序和系统中断服务程序; 定制操作系统的功能,为软件系统提供一个实时多任务运行环境; 初始化操作系统,为操作系统的正常运行做好准备。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP跟Driver区别: BSP不等同与Driver; 操控设备(如lan控制器,串口控制器)的驱动程序可以从一个目标机环境移到另一个目标机环境 BSP集成了许多通用设备的驱动程序,它一般是针对某一硬件系统的整合 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP概念 BSP功能 BSP构成 BSP启动序列 BSP开发 BSP部分代码 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP功能 BSP功能简介 BSP与VxWorks的关系 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP功能简介 1 系统加电后的硬件初始化 加电后PC指针跳到特定的存储空间位置 设置处理器 初始化内存和内存地址 禁止中断 执行附加引导代码 将VxWorks载入RAM 载入VxWorks内核 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP功能简介 2 提供操作系统对硬件驱动的访问 一些驱动的支持是由BSP完成的,如驱动程序中定义了中断服务程序(ISR),BSP完成了中断服务程序与中断向量表的挂接 一些偏移常量是由BSP定义的,但供驱动程序使用 简化了驱动程序的安装 设备的配置管理 3 屏蔽上层软件和底层硬件以及硬件驱动 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP与VxWorks的关系 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP概念 BSP功能 BSP构成 BSP启动序列 BSP开发 BSP部分代码 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP构成 BSP目录结构 BSP文件介绍 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP目录结构 BSP的组成文件主要包含在四个目录下: …\target\config\all:所有BSP公共使用的代码 …\target\config\comps\vxworks:基本模块描述文件(*.cdf) …\ target\config\comps\src:操作系统模块的配置文件(usrConfig.c使用) …\target\config\bspname:与具体目标板相关的代码部分 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 文件介绍 Config\all: bootConfig.c:所有 bootrom的主要初始化与控制文件。bootConfig.c是usrConfig.c的一个子集。只提供完整Image中的部分功能。在集成环境下修改工程相关的配置信息不会影响Boot Image,只有直接修改config.h,configAll.h,bootConfig.c和bootInit.c文件才会影响到Boot Image; 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 文件介绍 bootInit.c:定义了romStart()函数,用于bootrom的第二阶段初始化。将bootrom从ROM拷贝到RAM中,然后跳转sysInit()或者userInit() usrConfig.c:包含VxWorks的主要初始化代码,其部分功能跟bootConfig.c里面的功能类似,例如对硬件设备的初始化。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 文件介绍 Config\bspname: makefile:Image的编译规则,其中定义了一些宏,如:RAM_LOW_ADRS,RAM_HIGH_ADRS。 config.h:包含所有的头文件和与CPU相关的宏定义,如:对Cache和MMU的配置,RAM和ROM的定位以及大小配置,外部总线地址映射,PCI地址宏。 configNet.h:网络驱动的主要配置文件,主要对END驱动设置 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 文件介绍 romInit.s:该文件包含bootrom和rom-based vxworks Image的初始化入口汇编代码(romInit())。目标板上电开始执行romInit,主要完成三部份工作: 屏蔽中断,初始化CPU; 配置内存系统,通常包括关闭cache,初始化内存控制器; 初始化堆栈指针和其它寄存器以执行C语言,然后跳到romStart()。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 文件介绍 sysALib.s:包含目标板或系统相关的汇编语言函数,实现了_sysInit()。是bootrom起来以后执行的第一段代码,sysInit是loadable VxWorks映像调用的入口,是在RAM中执行的第一个函数。 sysLib.c:包含目标板或系统相关的C语言函数,该文件提供板级接口,通过该接口,VxWorks和应用程序的实现与目标系统无关,sysLib.c包含target\src\drv目录下的驱动程序子文件,驱动程序的安装和初始化在子文件中完成。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 文件介绍 sysSerial.c:用于串口设置和初始化 bspname.h:包含与板子相关的宏定义。要把src\drv下的某驱动程序移植到目标板上,必须在bspname.h文件开始包含目录src\drv下该驱动程序对应的头文件。 bspname.h应该定义:中断向量或中断号;I/O设备地址;设备寄存器位的含义定义;系统时钟和辅助时钟最大和最小时钟速率。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP概念 BSP功能 BSP构成 BSP启动序列 BSP开发 BSP部分代码 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP启动序列 映像类型 Loadable VxWorks image启动序列 ROM-Based VxWorks image启动序列 ROM-Resident VxWorks image启动序列 Bootrom Image 启动序列 启动列表 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 映像类型 Loadable VxWorks image:是由bootrom装入RAM中执行的VxWorks 映像 ROM-Based VxWorks image-compressed/uncompressed:烧录到ROM或Flash里的VxWorks 映像,在RAM中运行 ROM-Resident VxWorks image:在内存资源较少的情况下,可以让代码在Rom或Flash里面运行,只把必要的数据段装入RAM Bootrom Image/ ROM-Resident Boot image:引导映像 2018/9/17 © 2000 Wind River Systems, Inc.

Loadable VxWorks image启动序列 VxWorks在RAM中运行,如果写入ROM中的boot或VxWorks image是压缩的,需要先解压copy所有的text和data到RAM的LOCAL_LOW_ADRS中,系统直接跳到RAM的首地址,运行VxWorks 2018/9/17 © 2000 Wind River Systems, Inc.

Loadable VxWorks image启动序列 系统执行图示 2018/9/17 © 2000 Wind River Systems, Inc.

Loadable VxWorks image启动序列 系统代码空间转移图示 2018/9/17 © 2000 Wind River Systems, Inc.

ROM-Based VxWorks image启动序列 VxWorks ROM版本首先从系统上电的时候提供的入口地址开始执行,然后系统会自动把ROM中的版本加载到RAM中执行。 2018/9/17 © 2000 Wind River Systems, Inc.

ROM-Based VxWorks image启动序列 系统执行图示 2018/9/17 © 2000 Wind River Systems, Inc.

ROM-Based VxWorks image启动序列 系统代码空间转移图示 2018/9/17 © 2000 Wind River Systems, Inc.

ROM-Resident VxWorks image启动序列 VxWorks在ROM中运行,系统直接跳到ROM的首地址,运行VxWorks。 VxWorks 在ROM中的运行是为了节省RAM空间,以便应用程序有更大的空间运行。只需要把VxWorks image的data和BSS复制到RAM的LOCAL_LOW_ADRS,text留在ROM并在中执行。缺点是运行速度慢。 2018/9/17 © 2000 Wind River Systems, Inc.

ROM-Resident VxWorks image启动序列 系统执行图示 2018/9/17 © 2000 Wind River Systems, Inc.

ROM-Resident VxWorks image启动序列 系统代码空间转移图示 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Bootrom Image 启动序列 目标板硬件系统引导代码启动,一般bootrom都是烧到ROM或者Flash里面,可以调到RAM里面运行或者在ROM里面运行,只初始化必要的硬件。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Bootrom Image 启动序列 系统执行图示 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 启动列表(cont’) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP概念 BSP功能 BSP构成 BSP启动序列 BSP开发 BSP部分代码 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP开发 BSP开发过程概述 写BSP文件 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP开发过程概述 得到合适的参考BSP或BSP模板代码 准备开发调试环境(仿真器、仿真软件) 修改编写VxWorks预初始化代码(基本硬件环境配置,寄存器,I/O,内存) 加载串口驱动(为使用串口调试) 一旦内核激活后,连接系统中断 使能系统时钟 完成BSP需要支持的其他特性 测试、文档 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP开发过程概述(cont’) no Yes 烧ROM Build 最简IMAGE Build BSPlib Modify BSP 串口OK Bsp其他部分ok download Build ram 类型image Build image 验证其他部分 增加bsp 其他部分 yes START Bsp完成 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 写BSP文件 Makefile Bspname.h Config.h sysLib.c romInit.s sysALib.s Config/all/usrConfig.c 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Makefile CPU 目标机CPU,须跟选定的参考BSP的CPU一样 TOOL 工具链如gnu(tool chain),需要跟参考BSP的一样 TGT_DIR target目录的路径,缺省$(WIND_BASE)/target TARGET_DIR BSP目录名 VENDOR 板子制造商名 BOARD 板子名称 ROM_TEXT_ADRS bootrom的入口地址,对大部分板子来说,设为rom地址区的开始值 ROM_WARM_ADRS bootrom热启动地址入口,通常是冷启动入口ROM_TEXT_ADRS偏移8个字节,使用sysToMonitor()热启的时候,PC指针强制跳转到ROM_WARM_ADRS 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Makefile(cont’) ROM_SIZE ROM区大小 RAM_LOW_ADRS 载入VxWorks的地址 RAM_HIGH_ADRS 拷贝bootrom时候用的地址 HEX_FLAGS_WRS 产生HEX文件专用标志,需要跟参考BSP一样 MACH_EXTRA 外部依赖文件 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Makefile(cont’) CPU = PPC860 TOOL = gnu TGT_DIR = $(WIND_BASE)/target include $(TGT_DIR)/h/make/defs.bsp #include $(TGT_DIR)/h/make/make.$(CPU)$(TOOL) #include $(TGT_DIR)/h/make/defs.$(WIND_HOST_TYPE) ## Only redefine make definitions below this point, or your definitions will ## be overwritten by the makefile stubs above. 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Makefile(cont’) TARGET_DIR = mbx860 VENDOR = Motorola BOARD = MBX860 ## The constants ROM_TEXT_ADRS, ROM_SIZE, and RAM_HIGH_ADRS are defined ## in config.h and Makefile. All definitions for these constants must be ## identical. #这里的值要和Config.h里面一样 ROM_TEXT_ADRS = FE000100 # ROM entry address ROM_SIZE = 00080000 # number of bytes of ROM space RAM_LOW_ADRS = 00010000 # RAM text/data address RAM_HIGH_ADRS = 00200000 # RAM text/data address 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Makefile(cont’) USR_ENTRY = usrInit BOOT_EXTRA = mbxI2c.o mbxALib.o MACH_EXTRA = mbxALib.o RELEASE += bootrom.bin 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Bspname.h 定义了用来一些系统板专有的,常量型的信息,对板子来说,这些信息都是固定的,如果不是固定的需要定制的宏或值,在config.h里面定义就可以: 中断向量表/中断级别; I/O地址:这些I/O是系统固定的 寄存器各位的意义:为了控制板上的寄存器,定义了每个寄存器以及各位的意义 系统以及辅助时钟参数 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Config.h 该文件中应该包含(当中有可选) BSP版本号,版本ID号 包含configAll.h(#included) 存储器、缓存、MMU的配置 共享内存网络定义(SM_?) 板上内存地址、大小定义 ROM地址、大小定义 NVRAM参数定义 缺省引导参数定义 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Config.h 时间戳驱动支持 外部总线地址映射 网络设备宏定义、中断向量 串行口 调试通道 包含bspname.h文件(#included) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Config.h 内存方面: LOCAL_MEM_LOCAL_ADRS 板子内存起始地址 LOCAL_MEM_SIZE 板子固定内存大小 LOCAL_MEM_AUTOSIZE 动态内存 USER_RESERVED_MEM 保留内存大小 RAM_HIGH_ADRS 拷贝bootrom的地址,跟makefile里面的一致 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Config.h PCI方面 PCI_MSTR_MEM_SIZE Size of the window onto PCI memory space PCI_MSTR_MEM_BUS Bus address of PCI memory window PCI_MSTR_MEM_LOCAL Local address mapped into PCI memory window PCI_MSTR_IO_SIZE Size of the window onto PCI I/O space PCI_MSTR_IO_BUS Bus address of PCI I/O window PCI_MATR_IO_LOCAL Local address mapped into PCI I/O window PCI_MATR_MEMIO_SIZE Size of the window onto PCI memory (no- prefetched) PCI_MATR_MEMIO_BUS Bus address of PCI non-prefetchd memory PCI_MATR_MEMIO_LOCAL Local address mapped into non-prefeched window 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. sysLib.c 包括sysModel(),sysBspRev(),sysHwInit(),sysHwInit2()函数,大部分的硬件初始化工作在sysHwInit()中完成。 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. sysLib.c 内存映射代码 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. romInit.s 运行的开始,系统加电后,执行romInit(),用汇编语言完成。 判断启动类型,保存启动方式 配置内存和外围设备的读写时序 根据具体目标配置内核和非内核寄存器 配置指向STACK_ADRS的指针 根据板的需要初始化其他寄存器 屏蔽中断 初始化cache,屏蔽cache 指针跳转到romStart()函数并执行 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. romInit.s 这部分代码无法进行调试,只能通过闪灯实现运行正确与否的判断,使用闪灯定位程序的运行位置。 判断启动类型和配置寄存器,这部分一般不需要改动 配置内存和外围设备读写时序,这一部分的SDRAM,ROM,FLASH,FPGA有相应的模块参考。其实现是通过宏定义来实现的。一般是改动空间大小的屏蔽位,读写位数,以及片选寄存器 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. sysALib.s 包含RAM-BASE VxWorks映像入口函数sysInit() 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. usrConfig.c 内核启动与VxWorks组件配置 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP概念 BSP功能 BSP构成 BSP启动序列 BSP开发 BSP部分代码 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. BSP部分代码 Config.h文件 Makefile文件 romInit.s文件 2018/9/17 © 2000 Wind River Systems, Inc.

字符设备驱动程序 Character Device Drivers 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 模块结构 I/O系统可以管理若干个设备驱动程序 I/O系统和设备驱动程序之间的接口模型就是字符设备驱动程序接口 一个驱动程序处理所有同类型的设备,这些设备可能只是参数不同,例如I/O地址,中断号等 应用程序 I/O System 字符设备驱动程序接口 char. driver 1 char. driver 2 char. driver n dev 1 dev 2 dev n 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 模块初始化 启动过程中, 调用iosInit()初始化I/O系统 调用xxDrv()初始化设备驱动程序 调用xxDevCreate()创建设备(可能有若干个) 系统启动代码即 config/all/bootConfig.c,对于boot ROM prjConfig.c,对于Tornado project 系统 启动 代码 I/O System iosInit() xx Device Driver xxDrv() xxDevCreate() 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. iosInit() – 初始化I/O系统 在usrRoot()里调用 NUM_DRIVERS是最多能安装的设备驱动程序的个数 在configAll.h中定义为20 NUM_FILES是同时能够打开的最多的文件(设备)的个数 在configAll.h中定义为50 以上两个参数可以在WindConfig中修改 “/null”是空设备名称 iosInit (NUM_DRIVERS, NUM_FILES, "/null"); 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. xxDrv() – 初始化驱动程序 它是设备驱动程序的初始化函数(注意:不是设备的初始化函数!) 参数是7个函数指针 需要调用iosDrvInstall()向I/O系统注册自己 iosDrvInstall()成功后返回一个非0的驱动号(driver number) 模板如下 static int xxDrvNum = 0; STATUS xxDrv(void) { if (xxDrvNum > 0) return OK; /* todo: 驱动特定的初始化代码 */ if ((xxDrvNum = iosDrvInstall(xxCreat, 0, xxOpen, 0, xxRead, xxWrite, xxIoctl)) == ERROR) return ERROR; } 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 驱动程序表 I/O系统用一个driver table保存驱动程序的信息 7个函数指针 空指针表示驱动无该项操作 表项的索引就是驱动程序号(driver number) 表的大小固定,有NUM_DRIVERS项 creat remove open close read write ioctl 1 xxOpen 0 xxOpen 0 xxRead xxWrite xxIoctl 2 3 driver table 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. xxDevCreate() – 创建设备 STATUS xxDevCreate(char *devName, ...) { XX_DEV *pXxDev; if (xxDrvNum == 0) { errno = S_ioLib_NO_DRIVER; return ERROR; } if ((pXxDev = (XX_DEV *)malloc(sizeof(XX_DEV))) == NULL) /* todo: 将设备信息保存到pXxDev结构中 */ /* todo: 设备特定的初始化代码 */ if (iosDevAdd((DEV_HDR *)pXxDev, devName, xxDrvNum) == ERROR) { /* un-initialize code here */ free(pXxDev); return OK; 初始化该设备 设备信息由函数参数传入 向I/O系统注册该设备 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. XX_DEV结构 XX_DEV结构一般定义在驱动程序的头文件中,例如xxDrv.h XX_DEV结构头部是一个DEV_HDR结构(类似OO中继承),所以XX_DEV*类型的指针同时也是一个DEV_HDR*类型的指针 XX_DEV结构的剩下部分被驱动程序用来保存设备信息 I/O系统使用DEV_HDR数据结构来维护设备 DEV_HDR结构作为双向链表的节点 xxDrv.h typdef struct { DEV_HDR devHdr; /* 设备特定的成员 */ } XX_DEV; iosLib.h typdef struct { DL_NODE node; short drvNum; char *name; } DEV_HDR; dllLib.h: typdef struct dlnode { struct dlnode *next; struct dlnode *previous; } DL_NODE; 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 设备列表 I/O系统使用一个设备列表(device list)维护设备 使用iosDevAdd()添加设备,例如 iosDevAdd(pDev0, “/xx0”, 2); iosDevAdd(pDev1, “/xx1”, 2); XX_DEV XX_DEV “/tyCo/0” 1 “/xx0” 2 “/xx1” 2 device list driver table 1 2 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. open() – 打开设备 fd = open(“/xx0/yy”, O_RDONLY, 0); 1. 根据设备名搜索设备列表,找到结点xxDev xxDev “/tyCo/0” 1 “/xx0” 2 “/xx1” 2 2. 在FD_table中取得一个未用的项 drvNum value 3. 根据驱动号调用驱动表中的xxOpen() devId = xxOpen(xxDev, “/yy”, O_RDONLY, 0); 1 2 1 3 2 devId 2 xxOpen 4 4. 把驱动号和devId放入FD_table中 5. 返回FD_table该项的索引(fd) FD_table有NUM_FILES项 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. FD – 文件描述符 FD_table的索引,是一个小整数;由creat()或open()返回,由read(),write(),ioctl()和close()使用 可以用来标识: 字符设备(设备描述符?) 文件系统上的文件 socket 对于字符设备,fd用来标识该设备 对于文件系统,fd可以用来标识整个文件系统,也可以用来标识文件,例如: fd = open(“/dosFs”, …); - 打开文件系统 fd = open(“/dosFs/text.txt”, …); - 打开一个文件 对于socket,用socket()函数得到fd: fd = socket(…); 在Shell下可以使用iosFdShow显示当前打开的文件 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. read() – 读设备 nbytes = read(fd, buf, len); int read( int fd, char *buf, size_t nbytes ); int write( drvNum value 1. 根据fd从FD_table中取得驱动号和值(devId) 1 2 3 2 devId 4 2. 根据驱动号调用驱动表中的xxRead() nbytes = xxRead(devId, buf, len); 1 2 xxRead I/O系统只负责调用相应的xxRead()/xxWrite(), 具体如何读写是driver的责任! 2018/9/17 © 2000 Wind River Systems, Inc.

creat()和open() – 创建和打开 creat()原先被用来在文件系统上创建一个文件,现在open()也可以创建文件。一般的字符设备驱动程序中xxCreat=xxOpen VxWorks下只有NFS驱动程序使用mode参数 int creat(const char *name, int flag); flag: O_RDONLY(0) O_WRONLY(1) O_RDWR(2) int open(const char *name, int flags, int mode); flags: O_CREAT(0x0200) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. remove() - 删除文件 remove()通常用来删除一个文件;通常的字符设备驱动程序并不使用(即xxRemove=0) remove()不是用来删除设备或驱动程序的! 删除设备使用iosDevDelete() 删除驱动程序使用iosDrvRemove() 使用remove()的2个驱动程序: 文件系统,例如dosFsLib,使用它来删除文件系统中的一个文件 网络文件系统,例如netDrv,使用它来请求删除一个远程文件 int remove(const char *name); 2018/9/17 © 2000 Wind River Systems, Inc.

close()和ioctl() – 关闭设备和I/O控制 ioctl()对设备执行I/O控制。它调用xxIoctl(devId, function, arg);由(function, arg)参数指定的功能是由驱动程序规定的 ioLib.h中预定义了一些功能号和参数 STATUS close(int fd); int ioctl(int fd, int function, int arg); 2018/9/17 © 2000 Wind River Systems, Inc.

字符设备驱动程序编写指南 Character Device Driver Programmer’s Guide 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 什么情况下需要标准接口的设备驱动程序? 以下情况使用标准接口的驱动程序: 需要向应用程序提供通用的接口,即I/O系统的接口(open(), close(), read(), write(), …) 需要进行I/O重定向 需要支持select() 以下情况不使用标准接口的驱动程序: 设备很简单,例如LED,A/D端口 设备不满足I/O系统要求的模型 对速度要求很高的场合 系统设备由BSP负责(它们一般不是I/O设备),例如 中断控制器 定时器 总线控制器 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 常见的字符设备 文件系统 dosFs, rawFs, rt11Fs, tapeFs, cdromFs 文件系统本身是“字符设备” 通常建立在块设备上(需要块设备驱动程序的支持) tty 终端设备 本身是字符设备 通常建立在串行设备上(需要串行设备驱动程序的支持) PC console 键盘+显示设备 管道(pipe) 不对应物理设备的字符设备 使用消息队列(message queue)实现 声卡(WindML) 一种复合设备 http://www.opensound.com 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 字符设备驱动程序接口 需要驱动程序提供以下接口函数: xxDrv() - 必须,初始化驱动程序 xxDevCreate() - 必须,初始化设备并添加到I/O系统 xxCreat() - 可选,通常不提供(指针由xxOpen代替) xxRemove() - 可选,通常不提供 xxOpen() - 可选,打开设备 xxClose() - 可选,关闭设备 xxRead() - 可选,读设备 xxWrite() - 可选,写设备 xxIoctl() - 可选,设备的I/O控制函数 驱动程序一般定义一个XX_DEV结构类型(从DEV_HDR继承),用来存储设备信息 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. xxOpen() pDevHdr是open()查找设备得到DEV_HDR结构,它等于iosDevAdd()注册设备时的XX_DEV name是open()在匹配设备名完成后剩下的部分 flags和mode由open()传递 出错返回ERROR(-1),成功返回一个设备标识符(devId),通常就是pDevHdr 应该避免多次打开 int xxOpen(DEV_HDR *pDevHdr, const char *name, int flags, int mode); { iosDevAdd((DEV_HDR *)pXxDev, devName, xxDrvNum); } 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. xxClose() 关闭设备 devId是xxOpen()的返回值 如果在xxOpen()中分配了资源,在这里释放 很多设备驱动程序没有xxClose() STATUS xxClose(int devId); 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. xxRead(), xxWrite() devId是xxOpen()的返回值 函数成功返回实际读取或写入的字节数 失败应返回ERROR(-1),或 0:表示end-of-file/end-of-device(如果有意义的话) int xxWrite(int devId, char *pBuf, nbytes); int xxRead (int devId, char *pBuf, nbytes); 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. xxIoctl() devId是xxOpen()的返回值 要执行的功能及相关的参数由(function, arg)指定,具体的取值和含义是由驱动程序规定的 函数的返回值根据fuction参数而定;或返回ERROR(-1)表示出错,并设置errno 对于未知的命令返回ERROR,并设置errno=S_ioLib_UNKNOWN_REQUEST int xxIoctl(int devId, int function, int arg); 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 开发支持 I/O系统提供的函数 iosDevDelete() - 删除一个设备 iosDrvRemove() - 删除一个驱动程序 iosDevFind() - 根据设备名查找设备结构(DEV_HDR) iosFdValue() - 将fd转换为devId Shell命令/函数 iosDrvShow() - 显示当前安装的所有驱动程序 devs()/iosDevShow() - 查看当前所有设备 iosFdShow() - 查看当前所有打开的设备/文件/socket 2018/9/17 © 2000 Wind River Systems, Inc.

支持select Support Select 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. Overview 创建设备时,xxDevCreate()调用selWakeupListInit() 应用程序执行select(),select()通过I/O系统调用xxIoctl() 驱动程序在设备可读或可写时(例如在ISR中)调用selWakeupAll() selectLib char. driver selWakeupListInit() selNodeAdd() selWakeup() selNodeDelete() selWakeupAll(…,SELWRITE) selWakeupAll(…,SELREAD) xxDevCreate() xxIoctl(…,FIOSELECT,…); xxIoctl(…,FIOUNSELECT,…); ready to write(可写) ready to read(可读) select() 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. select初始化 driver定义一个SEL_WAKEUP_LIST类型的结构变量,通常是在XX_DEV结构中 在xxDevCreate()里调用selWakeupListInit() typedef struct { DEV_HDR devHdr; SEL_WAKEUP_LIST selWakeupList; ... } XX_DEV; STATUS xxDevCreate(char *devName, ...) pXxDev = (XX_DEV *)malloc(sizeof(XX_DEV)); selWakeupListInit(&pXxDev->selWakeupList); } 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. select执行ioctl 当应用程序执行select()时,select()对要监视的所有fd执行ioctl(),即执行xxIoctl(fd, FIOSELECT, …); select()返回前执行xxIoctl(fd, FIOUNSELECT, …) xxIoctl需要支持FIOSELECT和FIOUNSELECT switch (function) { ... case FIOSELECT: if ((retval = selNodeAdd(&pXxDev->selWakeupList, (SEL_WAKEUP_NODE *)arg)) == OK) { if ((selWakeupType(arg) == SELREAD && ‘当前可读’) || (selWakeupType(arg) == SELWRITE && ‘当前可写’)) selWakeup(arg); } return retval; case FIOUNSELECT: return selNodeDelete(&pXxDev->selWakeupList, (SEL_WAKUP_NODE *)arg); 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 任务与VxWorks的接口: ·fd =open (filename, flags, mode) ·fd=creat (filename, flags) ·read (fd, &buf, nBytes) ·write (fd, &buf, nBytes) ·ioctl (fd, command, arg) ·close (fd) ·remove (filename) 2018/9/17 © 2000 Wind River Systems, Inc.

驱动程序表:(I/O System Driver Table: iosDrvShow()) 2018/9/17 © 2000 Wind River Systems, Inc.

设备表:(Devs List: devs() 2018/9/17 © 2000 Wind River Systems, Inc.

Driver的操作规整,参数规整和I/O管理: xxOpen(pDevHdr, pName, flags, mode):返回设备Id号; xxClose(deviceId) xxRead(deviceId, pBuf, nBytes) xxWrite(deviceId, pBuf, nBytes) xxIoctl(deviceId, cmd, arg) 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. xxDrv(args,…):iosDrvInstall (xxCreat, xxDelete, xxOpen,xxClose, xxRead, xxWrite, xxIoctl) 往I/O系统驱动程序表添加Driver。xxDrv()在设备初始化阶段被调用,而且只能调用一次,输入参数是设备相关的; xxDevCreate(devName,arg,…) :为设备描述结构分配内存,执行设备相关的初始化,调用iosDevAdd(pDevHdr,devName,drvNum)往设备列表内添加设备描述符,并用设备名字(drvName)和驱动程序号(drvNum)初始化DEV_HDR; 2018/9/17 © 2000 Wind River Systems, Inc.

© 2000 Wind River Systems, Inc. 2018/9/17 © 2000 Wind River Systems, Inc.