Presentation is loading. Please wait.

Presentation is loading. Please wait.

© 2000 Wind River Systems, Inc.

Similar presentations


Presentation on theme: "© 2000 Wind River Systems, Inc."— Presentation transcript:

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

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

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

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

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

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

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

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

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

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

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

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

13 © 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.

14 © 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.

15 © 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.

16 © 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.

17 © 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.

18 © 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.

19 © 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.

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

21 © 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.

22 © 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.

23 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.

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

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

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

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

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

29 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

48 © 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.

49 © 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.

50 © 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.

51 © 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.

52 © 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.

53 © 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 = FE # ROM entry address ROM_SIZE = # number of bytes of ROM space RAM_LOW_ADRS = # RAM text/data address RAM_HIGH_ADRS = # RAM text/data address 2018/9/17 © 2000 Wind River Systems, Inc.

54 © 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.

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

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

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

58 © 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.

59 © 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.

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

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

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

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

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

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

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

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

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

69 © 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.

70 © 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.

71 © 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.

72 © 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.

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

74 © 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.

75 © 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.

76 © 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.

77 © 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.

78 © 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.

79 © 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.

80 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.

81 © 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.

82 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.

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

84 © 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.

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

86 © 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.

87 © 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.

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

89 © 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.

90 © 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.

91 © 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.

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

93 © 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.

94 © 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.

95 © 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.

96 © 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.

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

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

99 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.

100 © 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.

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


Download ppt "© 2000 Wind River Systems, Inc."

Similar presentations


Ads by Google