字符设备驱动框架

更新时间:
2024-01-10
下载文档

字符设备驱动框架

SylixOS 中字符设备驱动框架主要包括字符设备驱动注册、设备创建及管理。

字符设备驱动安装

字符设备驱动安装接口相关信息位于“libsylixos/SylixOS/system/ioLib/ioSys.c”文件中,SylixOS 为驱动安装提供了三组接口。驱动安装函数主要作用是在内核驱动程序表中找到空闲位置,并注册对应的驱动程序。

API_IosDrvInstall

#include <SylixOS.h> 
INT  API_IosDrvInstall (LONGFUNCPTR         pfuncCreate,
                        FUNCPTR             pfuncDelete,
                        LONGFUNCPTR         pfuncOpen,
                        FUNCPTR             pfuncClose,
                        SSIZETFUNCPTR       pfuncRead,
                        SSIZETFUNCPTR       pfuncWrite,
                        FUNCPTR             pfuncIoctl);

函数 API_IosDrvInstall 原型分析:

  • 此函数成功返回驱动程序索引号 iDrvNum,失败返回 PX_ERROR
  • 参数 pfuncCrea te 是驱动程序中的建立函数 (如果非符号链接, 则不可更改 name 参数内容)。
  • 参数 pfuncDelete 是驱动程序中的删除函数。
  • 参数 pfuncOpen 是驱动程序中的打开函数 (如果非符号链接, 则不可更改 name 参数内容)。
  • 参数 pfuncClose 是驱动程序中的关闭函数。
  • 参数 pfuncRead 是驱动程序中的读函数。
  • 参数 pfuncWrite 是驱动程序中的写函数。
  • 参数 pfuncIoctl 是驱动程序中的IO控制函数。

API_IosDrvInstallEx

#include <SylixOS.h> 
INT  API_IosDrvInstallEx (struct file_operations  *pfileop);

函数 API_IosDrvInstallEx 原型分析:

  • 此函数成功返回驱动程序索引号 iDrvNum,失败返回 PX_ERROR
  • 参数 pfileop 是驱动程序中设备文件操作块。

设备文件操作块 file_operations 详细描述如下:

#include <SylixOS.h> 
typedef struct file_operations {
    struct module               *owner;
    long                         (*fo_create)();
    int                          (*fo_release)();
    long                         (*fo_open)();
    int                          (*fo_close)();
    ssize_t                      (*fo_read)();
    ssize_t                      (*fo_read_ex)();
    ssize_t                      (*fo_write)();
    ssize_t                      (*fo_write_ex)();
    int                          (*fo_ioctl)();
    int                          (*fo_select)();
    int                          (*fo_lock)();
    off_t                        (*fo_lseek)();
    int                          (*fo_fstat)();
    int                          (*fo_lstat)();
    int                          (*fo_symlink)();
    ssize_t                      (*fo_readlink)();
    int                          (*fo_mmap)();
    int                          (*fo_unmap)();
    ULONG                        fo_pad[16];
} FILE_OPERATIONS;
  • fo_create :设备创建函数。
  • fo_release :设备释放函数。
  • fo_open :设备打开操作函数。
  • fo_close :设备关闭函数。
  • fo_read(ex) :读设备(扩展)函数。
  • fo_write(ex) :写设备(扩展)函数。
  • fo_ioctl :设备控制函数。
  • fo_select :select 功能函数。
  • fo_lock :lock 功能函数。
  • fo_lseek :lseek 功能函数。
  • fo_fstat :fstat 功能函数。
  • fo_lstat :lstat 功能函数。
  • fo_symlink :建立链接文件。
  • fo_readlink :读取链接文件。
  • fo_mmap :文件映射。
  • fo_unmap :映射结束。
  • fo_pad :保留项。

API_IosDrvInstallEx2

#include <SylixOS.h> 
INT  API_IosDrvInstallEx2 (struct file_operations      *pfileop, 
                           INT                          iType);

函数 API_IosDrvInstallEx2 原型分析:

  • 此函数成功返回驱动程序索引号 iDrvNum,失败返回 PX_ERROR
  • 参数 pfileop 是驱动程序中设备文件操作块。
  • 参数 iType 是设备驱动类型。

注意:
API_IosDrvInstall 和 API_IosDrvInstallEx 注册的驱动类型默认是 LW_DRV_TYPE_ORIG 型驱动,API_IosDrvInstallEx2 则可以根据需要选择注册 LW_DRV_TYPE_ORIG、LW_DRV_TYPE_NEW_1 或者 LW_DRV_TYPE_SOCKET 型驱动。

字符设备的创建及管理

每个具体的字符设备控制块根据各设备特点由驱动开发者自行封装,但其中都应包含一个设备头,且设备头为设备控制块第一个成员,用来对该设备进行管理。设备头结构体 LW_DEV_HDR 详细描述如下:

#include <SylixOS.h>
typedef struct {
    LW_LIST_LINE                   DEVHDR_lineManage;          /*  设备头管理链表           */
    UINT16                         DEVHDR_usDrvNum;            /*  设备驱动程序索引号        */
    PCHAR                          DEVHDR_pcName;              /*  设备名称                */
    UCHAR                          DEVHDR_ucType;              /*  设备 dirent d_type     */
    atomic_t                       DEVHDR_atomicOpenNum;       /*  打开的次数              */
    PVOID                          DEVHDR_pvReserve;           /*  保留                   */
} LW_DEV_HDR;
  • DEVHDR_lineManage :设备头管理链表,可将其链入系统中设备管理链表。
  • DEVHDR_usDrvNum :设备驱动程序索引号。
  • DEVHDR_pcName :设别名称。
  • DEVHDR_ucType :设备类型,字符设备默认选择 DT_CHR 类型。
  • DEVHDR_atomicOpenNum :设备打开次数。
  • DEVHDR_pvReserve :保留项。

根据具体设备的设备头,调用 API_IosDevAdd 或者 API_IosDevAddEx 将设备添加进设备管理链表进行管理。设备添加函数位于“libsylixos/SylixOS/system/ioLib/ioSys.c”文件中。

设备添加函数详细介绍如下:

API_IosDevAdd

#include <SylixOS.h>
ULONG  API_IosDevAdd (PLW_DEV_HDR     pdevhdrHdr,
                      CPCHAR          pcName,
                      INT             iDrvNum);

函数 API_IosDevAdd 原型分析:

  • 此函数成功返回 ERROR_NONE ,失败返回 PX_ERROR。
  • 参数 pdevhdrHdr 是设备头指针。
  • 参数 pcName 是设备名。
  • 参数 iDrvNum 是驱动程序索引号,该索引号即为“字符设备驱动安装”小节字符设备驱动安装函数返回值。

API_IosDevAddEx

#include <SylixOS.h>
ULONG  API_IosDevAddEx (PLW_DEV_HDR         pdevhdrHdr,
                        CPCHAR              pcName,
                        INT                 iDrvNum,
                        UCHAR               ucType);

函数 API_IosDevAdd 原型分析:

  • 此函数成功返回 ERROR_NONE ,失败返回 PX_ERROR。
  • 参数 pdevhdrHdr 是设备头指针。
  • 参数 pcName 是设备名。
  • 参数 iDrvNum 是驱动程序索引号,该索引号即为“字符设备驱动安装”小节字符设备驱动安装函数返回值。
  • 参数 ucType 是设备类型,如字符设备选择 DT_CHR 类型。

调用上述两个函数即可将设备添加进设备头管理链表中进行管理。应用程序根据设备名打开设备,通过设备名和驱动程序索引号在链表中找到对应的设备控制块,获取到设备驱动函数,最终即可对设备进行读写和I/O控制等操作。

文档内容是否对您有所帮助?
有帮助
没帮助