device
device 提供操作系统设备抽象层功能,支持设备的创建、注册、注销及用户空间访问,提供低功耗管理、异步通知、poll 等待唤醒、内存重映射及 SMC (Secure Monitor Call) 调用等能力。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| osal_pm_lowpower_enter | 调用所有设备的低功耗进入回调函数 |
| osal_pm_lowpower_exit | 调用所有设备的低功耗退出回调函数 |
| osal_dev_create | 创建设备并申请内存,返回osal_dev指针 |
| osal_dev_destroy | 释放由osal_dev_create创建的设备内存 |
| osal_dev_register | 注册设备到系统 |
| osal_dev_unregister | 注销已注册的设备 |
| osal_device_set_async | 设置设备异步唤醒 |
| osal_poll_wait | 将当前进程添加到指定等待队列 |
| osal_notify_poll | 唤醒指定等待队列中的进程 |
| osal_remap_pfn_range | 将内核物理页重映射到用户空间 |
| osal_try_to_freeze | 尝试冻结当前任务 |
| osal_set_freezable | 设置当前任务可冻结并尝试冻结 |
| osal_kobject_uevent_env | 发送带环境数据的uevent事件 |
| osal_fasync_helper | 设置字符设备驱动的fasync队列 |
| osal_fasync_notify | 发送异步通知信号 |
| osal_pgprot_noncached | 获取非缓存页属性 |
| osal_pgprot_cached | 获取缓存页属性 |
| osal_pgprot_writecombine | 获取写合并页属性 |
| osal_smccc_smc | 执行SMC调用 |
| osal_opendev | 打开设备文件 |
| osal_closedev | 关闭设备文件 |
| osal_readdev | 读取设备数据 |
| osal_writedev | 写入设备数据 |
| osal_ioctldev | 对设备执行ioctl操作 |
| osal_init | OSAL Linux用户空间初始化 |
| osal_exit | OSAL Linux用户空间退出 |
Functions
osal_pm_lowpower_enter
头文件清单
功能说明
- 调用所有已注册设备的低功耗进入回调函数
- 用于系统进入低功耗模式前,通知各设备执行低功耗准备操作
- 仅支持Linux系统
前置条件
- 已有设备通过osal_dev_register注册到系统
- 设备的pmops中已设置pm_lowpower_enter回调函数
osal_pm_lowpower_exit
头文件清单
功能说明
- 调用所有已注册设备的低功耗退出回调函数
- 用于系统退出低功耗模式后,通知各设备恢复正常工作状态
- 仅支持Linux系统
前置条件
- 已有设备通过osal_dev_register注册到系统
- 设备的pmops中已设置pm_lowpower_exit回调函数
osal_dev_create
头文件清单
功能说明
- 申请osal_dev类型内存并返回指针,用于创建设备对象
- 创建的设备须通过osal_dev_register注册到系统后方可使用
- 创建的设备须通过osal_dev_destroy释放内存,调用者需将dev指针置NULL
前置条件
- name参数不为NULL
- 系统内存充足,能够分配osal_dev结构体所需空间
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| name | const char * | 设备名称 | 不为NULL,长度小于OSAL_DEV_NAME_LEN(32) |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL指针 | 设备创建成功 | 内存分配成功 |
| NULL | 设备创建失败 | name为NULL或内存分配失败 |
osal_dev_destroy
头文件清单
功能说明
- 释放由osal_dev_create创建的设备内存
- 调用后调用者应将dev指针置NULL,避免悬空指针
- dev参数必须来自osal_dev_create的返回值
前置条件
- dev指针由osal_dev_create创建获得
- 设备已通过osal_dev_unregister注销
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| dev | osal_dev * | 待销毁的设备指针 | 由osal_dev_create创建,不为NULL |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 释放成功 | dev不为NULL |
| OSAL_FAILURE(-1) | 释放失败 | dev为NULL |
osal_dev_register
头文件清单
功能说明
- 将设备注册到系统,注册后设备可通过用户空间接口访问
- 注册前须通过osal_dev_create创建设备并设置fops回调
- dev的fops成员不可为NULL
前置条件
- dev由osal_dev_create创建,且dev->dev为NULL
- dev->fops不为NULL,已设置文件操作回调函数
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| dev | osal_dev * | 待注册的设备指针 | 由osal_dev_create创建,fops不为NULL |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 注册成功 | 设备注册成功 |
| OSAL_FAILURE(-1) | 注册失败 | dev为NULL、dev->dev不为NULL、fops为NULL或平台注册失败 |
osal_dev_unregister
头文件清单
功能说明
- 注销已注册的设备,注销后设备不再可通过用户空间访问
- dev参数必须由osal_dev_create创建且已通过osal_dev_register注册
- 注销后dev->dev被置NULL
前置条件
- dev由osal_dev_create创建且已通过osal_dev_register注册
- dev->dev不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| dev | osal_dev * | 待注销的设备指针 | 由osal_dev_create创建且已注册,dev->dev不为NULL |
osal_device_set_async
头文件清单
功能说明
- 设置设备为异步唤醒模式
- 通过设备次设备号指定目标设备
- 仅支持Linux系统
前置条件
- 设备已通过osal_dev_register注册到系统
- minor对应有效的已注册设备
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| minor | unsigned int | 设备次设备号 | 已注册设备的有效次设备号 |
osal_poll_wait
头文件清单
功能说明
- 将当前进程添加到指定等待队列中,用于poll机制
- 配合osal_notify_poll使用,实现设备的poll等待与唤醒
- 仅支持Linux和LiteOS系统
前置条件
- table不为NULL且table->data、table->poll_table不为NULL
- wait不为NULL且wait->wait不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| table | osal_poll * | poll表指针 | 不为NULL,data和poll_table成员不为NULL |
| wait | osal_wait * | 等待队列指针 | 不为NULL,wait成员不为NULL |
osal_notify_poll
头文件清单
功能说明
- 唤醒指定等待队列中的进程
- 配合osal_poll_wait使用,实现设备的poll等待与唤醒
- 仅支持LiteOS系统
前置条件
- wait不为NULL且wait->wait不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| wait | osal_wait * | 等待队列指针 | 不为NULL,wait成员不为NULL |
osal_remap_pfn_range
头文件清单
功能说明
- 将内核物理页帧重映射到用户空间地址
- 用于设备mmap操作,使用户空间可直接访问设备内存
- 仅支持Linux和LiteOS系统
前置条件
- vm不为NULL
- addr为有效的用户空间对齐地址
- pfn为有效的物理页帧号
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| vm | osal_vm * | 虚拟内存结构指针 | 不为NULL |
| addr | unsigned long | 用户空间起始地址 | 有效的对齐地址 |
| pfn | unsigned long | 物理页帧号 | 有效的物理页帧号 |
| size | unsigned long | 映射大小(字节) | 大于0 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 映射成功 | 重映射操作成功 |
| 非0值 | 映射失败 | 重映射操作失败 |
osal_try_to_freeze
头文件清单
功能说明
- 尝试冻结当前任务,用于系统休眠流程
- 返回true表示冻结成功,返回false表示冻结失败
- 仅支持Linux和LiteOS系统
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| true(非0) | 冻结成功 | 当前任务成功冻结 |
| false(0) | 冻结失败 | 当前任务无需冻结或冻结失败 |
osal_set_freezable
头文件清单
功能说明
- 标记当前任务可冻结并尝试冻结,用于系统休眠流程
- 先设置任务为可冻结状态,再尝试执行冻结操作
- 仅支持Linux和LiteOS系统
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| true(非0) | 冻结成功 | 任务标记可冻结并成功冻结 |
| false(0) | 冻结失败 | 任务冻结失败 |
osal_kobject_uevent_env
头文件清单
功能说明
- 发送带环境数据的uevent事件到用户空间
- 用于设备热插拔等事件通知
- 仅支持Linux和LiteOS系统
前置条件
- dev不为NULL且已注册到系统
- action为有效的osal_kobject_action枚举值
- envp数组以NULL结尾
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| dev | osal_dev * | 设备指针 | 不为NULL,已注册设备 |
| action | osal_kobject_action | 事件动作类型 | OSAL_KOBJ_ADD(0) / OSAL_KOBJ_REMOVE(1) / OSAL_KOBJ_CHANGE(2) / OSAL_KOBJ_MOVE(3) / OSAL_KOBJ_ONLINE(4) / OSAL_KOBJ_OFFLINE(5) / OSAL_KOBJ_BIND(6) / OSAL_KOBJ_UNBIND(7) |
| envp | char *[] | 环境变量字符串数组 | 以NULL结尾的字符串数组 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 发送成功 | kobject_uevent_env执行成功 |
| 非0值 | 发送失败 | kobject_uevent_env执行失败 |
osal_fasync_helper
头文件清单
功能说明
- 设置字符设备驱动的fasync队列,管理异步通知的注册与注销
- mode非0时注册异步通知,mode为0时注销异步通知
- 仅支持Linux系统
前置条件
- fapp指向有效的fasync_struct指针
- 设备已注册且文件已打开
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| fd | int | 文件描述符 | 有效的文件描述符 |
| filp | void * | 文件结构指针 | 不为NULL |
| mode | int | 模式标志 | 非0为注册,0为注销 |
| fapp | void ** | fasync结构指针的地址 | 不为NULL |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 负值 | 操作错误 | 参数错误 |
| 0 | 无变更 | 未做任何修改 |
| 正值 | 操作成功 | 成功添加或删除条目 |
osal_fasync_notify
头文件清单
功能说明
- 向应用层发送SIGIO异步通知信号
- 应用层通过注册SIGIO信号处理函数接收通知
- 仅支持Linux系统
前置条件
- fapp不为NULL且已通过osal_fasync_helper注册
- 应用层已注册SIGIO信号处理函数
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| fapp | void ** | fasync结构指针的地址 | 不为NULL,已注册 |
| sig | int | 信号编号 | 有效的信号编号 |
| band | int | 事件带宽 | 有效的带宽值 |
osal_pgprot_noncached
头文件清单
功能说明
- 设置页属性为非缓存模式
- 用于设备mmap操作中设置用户空间映射的非缓存属性
- 仅支持Linux系统
前置条件
- vm不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| vm | osal_vm * | 虚拟内存结构指针 | 不为NULL |
osal_pgprot_cached
头文件清单
功能说明
- 设置页属性为缓存模式
- 用于设备mmap操作中设置用户空间映射的缓存属性
- 仅支持Linux系统
前置条件
- vm不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| vm | osal_vm * | 虚拟内存结构指针 | 不为NULL |
osal_pgprot_writecombine
头文件清单
功能说明
- 设置页属性为写合并模式
- 用于设备mmap操作中设置用户空间映射的写合并属性
- 仅支持Linux系统
前置条件
- vm不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| vm | osal_vm * | 虚拟内存结构指针 | 不为NULL |
osal_smccc_smc
头文件清单
功能说明
- 按照SMC Calling Convention执行SMC调用
- 用于安全世界与非安全世界之间的通信
- 仅支持Linux系统
前置条件
- info不为NULL
- res不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| info | const osal_smccc_info * | SMC调用输入参数 | 不为NULL |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| res | osal_smccc_res | SMC调用返回结果,包含a0~a3寄存器值 |
osal_opendev
头文件清单
功能说明
- 打开设备文件,返回设备文件描述符
- 内部调用设备驱动注册的open回调函数
- 仅支持Linux用户空间
前置条件
- path不为NULL且对应设备已注册
- 设备驱动已设置open回调函数
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| path | const char * | 设备文件路径 | 不为NULL,如/dev/xxx |
| flag | int | 打开标志 | 有效的文件打开标志 |
| ... | 可变参数 | 与flag相关的可变参数,具体约束见源码实现 | - |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非负整数 | 设备文件描述符 | 打开成功 |
| OSAL_FAILURE(-1) | 打开失败 | 设备不存在或打开失败 |
osal_closedev
头文件清单
功能说明
- 关闭设备文件,内部调用设备驱动注册的release回调函数
- 关闭后fd不再有效
- 仅支持Linux用户空间
前置条件
- fd为有效的设备文件描述符
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| fd | int | 设备文件描述符 | osal_opendev返回的有效fd |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 关闭成功 | 设备文件关闭成功 |
| OSAL_FAILURE(-1) | 关闭失败 | fd无效或关闭失败 |
osal_readdev
头文件清单
功能说明
- 从设备读取数据,内部调用设备驱动注册的read回调函数
- 返回实际读取的字节数,或-1表示失败
- 仅支持Linux用户空间
前置条件
- fd为有效的设备文件描述符
- buf不为NULL且已分配足够空间
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| fd | int | 设备文件描述符 | osal_opendev返回的有效fd |
| buf | void * | 读取数据缓冲区 | 不为NULL,空间不小于count |
| count | unsigned long | 请求读取的字节数 | 大于0 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 正整数 | 实际读取字节数 | 读取成功 |
| OSAL_FAILURE(-1) | 读取失败 | fd无效或读取失败 |
osal_writedev
头文件清单
功能说明
- 向设备写入数据,内部调用设备驱动注册的write回调函数
- 返回实际写入的字节数,或-1表示失败
- 仅支持Linux用户空间
前置条件
- fd为有效的设备文件描述符
- buf不为NULL且包含待写入数据
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| fd | int | 设备文件描述符 | osal_opendev返回的有效fd |
| buf | const void * | 写入数据缓冲区 | 不为NULL |
| count | unsigned long | 请求写入的字节数 | 大于0 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 正整数 | 实际写入字节数 | 写入成功 |
| OSAL_FAILURE(-1) | 写入失败 | fd无效或写入失败 |
osal_ioctldev
头文件清单
功能说明
- 对设备执行ioctl操作,内部调用设备驱动注册的cmd_list中对应的handler
- cmd值须在设备驱动注册的cmd_list中存在
- 仅支持Linux用户空间
前置条件
- fd为有效的设备文件描述符
- 设备驱动已设置cmd_list且cmd_cnt大于0
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| fd | int | 设备文件描述符 | osal_opendev返回的有效fd |
| cmd | unsigned int | ioctl命令字 | 在设备驱动cmd_list中定义的有效命令 |
| ... | 可变参数 | ioctl命令的附加参数,具体约束见源码实现 | - |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 操作成功 | ioctl操作成功 |
| OSAL_FAILURE(-1) | 操作失败 | fd无效、cmd未找到或handler执行失败 |
osal_init
头文件清单
功能说明
- OSAL Linux用户空间初始化
- 在使用其他OSAL用户空间接口前须调用此接口
- 仅支持Linux用户空间
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 初始化成功 | 初始化成功 |
| OSAL_FAILURE(-1) | 初始化失败 | 初始化失败 |
osal_exit
头文件清单
功能说明
- OSAL Linux用户空间退出,释放初始化资源
- 程序退出前调用,与osal_init配对使用
- 仅支持Linux用户空间
前置条件
- 已通过osal_init完成初始化
Enumerations
osal_kobject_action
typedef enum osal_kobject_action_ {
OSAL_KOBJ_ADD,
OSAL_KOBJ_REMOVE,
OSAL_KOBJ_CHANGE,
OSAL_KOBJ_MOVE,
OSAL_KOBJ_ONLINE,
OSAL_KOBJ_OFFLINE,
OSAL_KOBJ_BIND,
OSAL_KOBJ_UNBIND,
OSAL_KOBJ_MAX
} osal_kobject_action;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| OSAL_KOBJ_ADD | 0 | 设备添加事件 |
| OSAL_KOBJ_REMOVE | 1 | 设备移除事件 |
| OSAL_KOBJ_CHANGE | 2 | 设备属性变更事件 |
| OSAL_KOBJ_MOVE | 3 | 设备移动事件 |
| OSAL_KOBJ_ONLINE | 4 | 设备上线事件 |
| OSAL_KOBJ_OFFLINE | 5 | 设备下线事件 |
| OSAL_KOBJ_BIND | 6 | 设备绑定事件 |
| OSAL_KOBJ_UNBIND | 7 | 设备解绑事件 |
| OSAL_KOBJ_MAX | 8 | 枚举最大值,无效动作 |
Structures
osal_poll
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| poll_table | void * | poll等待表指针 |
| data | void * | 私有数据指针,通常指向file结构 |
osal_ioctl_cmd
typedef struct osal_ioctl_cmd_ {
unsigned int cmd;
int (*handler)(unsigned int cmd, void *arg, void *private_data);
} osal_ioctl_cmd;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| cmd | unsigned int | ioctl命令字 |
| handler | int ()(unsigned int cmd, void arg, void *private_data) | ioctl命令处理函数指针 |
osal_vm
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| vm | void * | 虚拟内存结构指针 |
osal_fileops
typedef struct osal_fileops_ {
int (*open)(void *private_data);
int (*read)(char *buf, int size, long *offset, void *private_data);
int (*write)(const char *buf, int size, long *offset, void *private_data);
long (*llseek)(long offset, int whence, void *private_data);
int (*release)(void *private_data);
unsigned int (*poll)(osal_poll *osal_poll, void *private_data);
int (*mmap)(osal_vm *vm, unsigned long start, unsigned long end, unsigned long vm_pgoff, void *private_data);
int (*fasync)(int fd, void *filp, int mode);
osal_ioctl_cmd *cmd_list;
unsigned int cmd_cnt;
} osal_fileops;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| open | int ()(void private_data) | 设备打开回调函数 |
| read | int ()(char buf, int size, long offset, void private_data) | 设备读取回调函数 |
| write | int ()(const char buf, int size, long offset, void private_data) | 设备写入回调函数 |
| llseek | long ()(long offset, int whence, void private_data) | 设备seek回调函数 |
| release | int ()(void private_data) | 设备释放回调函数 |
| poll | unsigned int ()(osal_poll osal_poll, void *private_data) | 设备poll回调函数 |
| mmap | int ()(osal_vm vm, unsigned long start, unsigned long end, unsigned long vm_pgoff, void *private_data) | 设备mmap回调函数 |
| fasync | int ()(int fd, void filp, int mode) | 设备fasync回调函数 |
| cmd_list | osal_ioctl_cmd * | ioctl命令列表 |
| cmd_cnt | unsigned int | ioctl命令数量 |
osal_pmops
typedef struct osal_pmops_ {
int (*pm_suspend)(void *private_data);
int (*pm_resume_early)(void *private_data);
int (*pm_resume)(void *private_data);
int (*pm_lowpower_enter)(void *private_data);
int (*pm_lowpower_exit)(void *private_data);
int (*pm_poweroff)(void *private_data);
void *private_data;
} osal_pmops;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| pm_suspend | int ()(void private_data) | 设备挂起回调函数 |
| pm_resume_early | int ()(void private_data) | 设备早期恢复回调函数 |
| pm_resume | int ()(void private_data) | 设备恢复回调函数 |
| pm_lowpower_enter | int ()(void private_data) | 设备低功耗进入回调函数 |
| pm_lowpower_exit | int ()(void private_data) | 设备低功耗退出回调函数 |
| pm_poweroff | int ()(void private_data) | 设备关机回调函数 |
| private_data | void * | 私有数据指针 |
osal_dev
#define OSAL_DEV_NAME_LEN 32
typedef struct osal_dev_ {
char name[OSAL_DEV_NAME_LEN];
int minor;
unsigned int parent_minor;
osal_fileops *fops;
osal_pmops *pmops;
void *dev;
void *owner;
} osal_dev;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| name | char[OSAL_DEV_NAME_LEN] | 设备名称,最大长度32 |
| minor | int | 次设备号 |
| parent_minor | unsigned int | 父设备次设备号 |
| fops | osal_fileops * | 文件操作回调集合 |
| pmops | osal_pmops * | 电源管理回调集合 |
| dev | void * | 设备内部信息指针 |
| owner | void * | 模块所有者指针 |
osal_wait
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| wait | void * | 等待队列内核结构指针 |
osal_smccc_info
typedef struct {
unsigned long a0;
unsigned long a1;
unsigned long a2;
unsigned long a3;
unsigned long a4;
unsigned long a5;
unsigned long a6;
unsigned long a7;
} osal_smccc_info;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| a0 | unsigned long | SMC调用参数0 |
| a1 | unsigned long | SMC调用参数1 |
| a2 | unsigned long | SMC调用参数2 |
| a3 | unsigned long | SMC调用参数3 |
| a4 | unsigned long | SMC调用参数4 |
| a5 | unsigned long | SMC调用参数5 |
| a6 | unsigned long | SMC调用参数6 |
| a7 | unsigned long | SMC调用参数7 |
osal_smccc_res
typedef struct {
unsigned long a0;
unsigned long a1;
unsigned long a2;
unsigned long a3;
} osal_smccc_res;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| a0 | unsigned long | SMC调用返回值0 |
| a1 | unsigned long | SMC调用返回值1 |
| a2 | unsigned long | SMC调用返回值2 |
| a3 | unsigned long | SMC调用返回值3 |