同步操作将从 Phytium嵌入式软件/Phytium-Standalone-SDK 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
此处提到的中断,主要是面向与Armv8 架构中异步异常IRQ 这个中断这个概念进行对齐,本模块主要为开发者提供软件层面管理中断相关接口,具体实现了以下这些特性: 1.基于中断id 的开关功能 2.中断生命周期中需要使用到的,模式切换函数。(sdk 自动调用,一般不需要开发者操作) 3.核间中断触发接口 4.中断优先级相关接口(优先级设置、优先级掩码、优先级抢占分组设置) 5.提供两种角色选择初始化中断
驱动组成由以下所示 . ├── finterrupt.c └── finterrupt.h
为用户提供两种初始化中断的方式: 1.不使用默认初始化的方式,在参数配置项选择“Not use default interrupt configuration”,参数配置如下:
用户在这种模式下手动编写初始化代码,具体可以参考 例程
2.使用默认初始化的方式,此时默认以CORE0 作为主核,默认会初始化中断驱动中的所有组件,非0核 将只会初始化与多核特性相关的部分组件。具体配置如下:
typedef void (*IrqHandler)(s32 vector, void *param); /* IRQ 中断回调函数的类型 */
struct IrqDesc
{
IrqHandler handler; /* IRQ 中断回调函数的指针 */
void *param; /* IRQ 中断回调函数的变量 */
};
#define INTERRUPT_CPU_ALL_SELECT 0xffffffffffffffffULL /* 当进行核间,发送给所有核心时需要用到的参数 */
#define INTERRUPT_CPU_TARGET_ALL_SET 0xffffffffUL /* 设置SPI 中断亲和度时,此值默认SPI 中断发送给所有人 */
#define IRQ_MODE_TRIG_LEVEL (0x00) /* Trigger: level triggered interrupt */
#define IRQ_MODE_TRIG_EDGE (0x01) /* Trigger: edge triggered interrupt */
typedef enum
{
INTERRUPT_ROLE_MASTER = 0 , /* 作为主核模式进行中断初始化,会初始化中断驱动中的所有组件 */
INTERRUPT_ROLE_SLAVE, /* 作为从核模式进行中断初始化,会初始化与多核特性相关的部分组件 */
}INTERRUPT_ROLE_SELECT; /* 此枚举应用于手动初始化中断的接口中 */
#define IRQ_GROUP_PRIORITY_3 3 /* group priority valid mask is bit[7:3],subpriority valid mask is bit[4:0] */
#define IRQ_GROUP_PRIORITY_4 4 /* group priority valid mask is bit[7:4],subpriority valid mask is bit[3:0] */
#define IRQ_GROUP_PRIORITY_5 5 /* group priority valid mask is bit[7:5],subpriority valid mask is bit[4:0] */
#define IRQ_GROUP_PRIORITY_6 6 /* group priority valid mask is bit[7:6],subpriority valid mask is bit[5:0] */
#define IRQ_GROUP_PRIORITY_7 7 /* group priority valid mask is bit[7],subpriority valid mask is bit[6:0] */
IRQ_GROUP_PRIORITY_* 用于定义组优先级的有效位。 当存在抢占中断时,group priority 为抢占优先级,subpriority 为子优先级,如果某个中断的组优先级的值比当前正在运行中断的组优先级要小,则此中断将会抢占当前运行的优先级 。
#define IRQ_PRIORITY_VALUE_0 0
#define IRQ_PRIORITY_VALUE_1 0x10
#define IRQ_PRIORITY_VALUE_2 0x20
#define IRQ_PRIORITY_VALUE_3 0x30
#define IRQ_PRIORITY_VALUE_4 0x40
#define IRQ_PRIORITY_VALUE_5 0x50
#define IRQ_PRIORITY_VALUE_6 0x60
#define IRQ_PRIORITY_VALUE_7 0x70
#define IRQ_PRIORITY_VALUE_8 0x80
#define IRQ_PRIORITY_VALUE_9 0x90
#define IRQ_PRIORITY_VALUE_10 0xa0
#define IRQ_PRIORITY_VALUE_11 0xb0
#define IRQ_PRIORITY_VALUE_12 0xc0
#define IRQ_PRIORITY_VALUE_13 0xe0
#define IRQ_PRIORITY_VALUE_14 0xf0
IRQ_PRIORITY_VALUE_* 中断优先级一共支持以上这16个挡位,优先级的值越低优先级越高。
#define IRQ_PRIORITY_MASK_0 0
#define IRQ_PRIORITY_MASK_1 0x10
#define IRQ_PRIORITY_MASK_2 0x20
#define IRQ_PRIORITY_MASK_3 0x30
#define IRQ_PRIORITY_MASK_4 0x40
#define IRQ_PRIORITY_MASK_5 0x50
#define IRQ_PRIORITY_MASK_6 0x60
#define IRQ_PRIORITY_MASK_7 0x70
#define IRQ_PRIORITY_MASK_8 0x80
#define IRQ_PRIORITY_MASK_9 0x90
#define IRQ_PRIORITY_MASK_10 0xa0
#define IRQ_PRIORITY_MASK_11 0xb0
#define IRQ_PRIORITY_MASK_12 0xc0
#define IRQ_PRIORITY_MASK_13 0xe0
#define IRQ_PRIORITY_MASK_14 0xf0
IRQ_PRIORITY_MASK_* 中断优先级掩码一共支持以上这16个挡位,当设置掩码之后,中断优先级的值必须比此值小,才能被CPU进行响应
#define FINT_SET_TARGET_ERR /* 涉及到CPU id 的配置时,CPU 不具有此ID 信息 / #define FINT_INT_NUM_NOT_FIT / 使用中断号不符合当前实际情况 */
例程 gic与interrupt 特性例程
InterruptInit(&interrupt_instance,INTERRUPT_DRV_INTS_ID,INTERRUPT_ROLE_MASTER);
InterruptSetPriorityGroupBits(IRQ_GROUP_PRIORITY_*);
InterruptSetPriorityMask(IRQ_PRIORITY_MASK_*);
InterruptSetPriority(INT_NUM,priority);
InterruptSetTargetCpus(INT_NUM,CPU_ID)
InterruptInstall(INT_NUM,int_handler,int_args,"int_name")
InterruptUmask(INT_NUM)
InterruptCoreInterSend(INT_NUM,CPU_MASK)
InterruptMask(INT_NUM)
void InterruptInit(InterruptDrvType * int_driver_p,u32 instance_id,INTERRUPT_ROLE_SELECT role_select)
初始化中断模块的接口函数
无
void InterruptMask(int int_id)
基于中断ID关闭对应的中断
无
void InterruptUmask(int int_id)
基于中断ID开启对应的中断
无
FError InterruptSetTargetCpus(int int_id,u32 cpu_id)
将中断路由给特定的CPU,或者路由给所有的CPU
FError FINT_SUCCESS:设置成功,FINT_INT_NUM_NOT_FIT:使用中断号不符合当前实际情况 ,FINT_SET_TARGET_ERR: 涉及到CPU id 的配置时,CPU 不具有此ID 信息
FError InterruptGetTargetCpus(int int_id,u32 *cpu_p)
基于中断ID 获取中断的路由信息
FError FINT_SUCCESS:设置成功,FINT_INT_NUM_NOT_FIT:使用中断号不符合当前实际情况 ,FINT_SET_TARGET_ERR: 涉及到CPU id 的配置时,CPU 不具有此ID 信息
void InterruptSetTrigerMode(int int_id, unsigned int mode)
基于中断ID 设置中断的触发方式
无
unsigned int InterruptGetTrigerMode(int int_id)
基于中断ID 获取中断的触发方式
void InterruptSetPriority(int int_id, unsigned int priority)
基于中断ID 设置中断的触发方式
无
unsigned int InterruptGetPriority(int int_id)
基于中断ID获取中断的触发方式
无
void InterruptSetPriorityMask(unsigned int priority)
设置中断优先级掩码
无
void InterruptGetPriorityMask(void)
获取中断优先级掩码
void InterruptSetPriorityGroupBits(unsigned int bits)
设置中断优先级分组位
无
IrqHandler InterruptInstall(int int_id, IrqHandler handler,void *param, const char *name)
本函数将自定义的中断回调函数与回调参数注册至对应中断id数据结构中
无
void InterruptCoreInterSend(int ipi_vector, u64 cpu_mask)
核心间中断触发函数
无
void InterruptEarlyInit(void)
中断提前初始化函数,此函数一般在汇编代码时被调用,当用户设置默认初始化模式时,本函数将会使用CORE0为主核心并且初始化中断驱动中所有组件,其他CORE为从属核心将初始化中断驱动中必备的组件。
无
无
u8 InterruptGetPriorityConfig(void)
根据uboot差异,返回是否需要对ICC_PMR和ICC_RPR的值进行转换。
无
u8 需要转换返回1,不需要转换返回0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。