Linux UWB Stack实现——MCPS调度接口(API)

在上一篇文章中,介绍了MCPS调度接口涉及的相关数据结构实现MCPS调度接口(数据结构),本文继续介绍调度相关的方法的实现。

1. 域处理

1.1 域注册与注销

注册/注销一个mcps802154_region,分别在模块加载(module_init)和模块卸载(module_exit)时调用。

int mcps802154_region_register(struct mcps802154_region_ops *region_ops);
void mcps802154_region_unregister(struct mcps802154_region_ops *region_ops);

1.2 域操作

域的操作包括:打开和关闭一个域,域的参数设置,域的调用以及发送域的事件。

// 打开一个域,然后设置参数。需要打开域的名称,底层设备指针
// 返回指向打开域的指针
struct mcps802154_region *
mcps802154_region_open(struct mcps802154_llhw *llhw, const char *name,
		       const struct nlattr *params_attr,
		       struct netlink_ext_ack *extack);
// 关闭一个域		  
void mcps802154_region_close(struct mcps802154_llhw *llhw,
			     struct mcps802154_region *region);

// 设置一个打开域的参数
int mcps802154_region_set_parameters(struct mcps802154_llhw *llhw,
				     struct mcps802154_region *region,
				     const struct nlattr *params_attr,
				     struct netlink_ext_ack *extack);
				     
// 调用域中的一个特定的处理程序,通过域特定的程序的标识符call_id来标识调用的程序
int mcps802154_region_call(struct mcps802154_llhw *llhw,
			   struct mcps802154_region *region, u32 call_id,
			   const struct nlattr *params_attr,
			   const struct genl_info *info);

// 分配缓冲区以发送域的通知,返回已分配且提前填充的buffer
struct sk_buff *
mcps802154_region_event_alloc_skb(struct mcps802154_llhw *llhw,
				  struct mcps802154_region *region, u32 call_id,
				  u32 portid, int approx_len, gfp_t gfp);

// 发送已分配的且已经填充的buffer,需要传递底层硬件指针
int mcps802154_region_event(struct mcps802154_llhw *llhw, struct sk_buff *skb);

2. 调度器

2.1 调度器注册与注销

在模块加载时注册一个mcps802154_scheduler调度器;模块卸载时,注销调度器。与mcps802154_region处理类似。

int mcps802154_scheduler_register(struct mcps802154_scheduler_ops *scheduler_ops);
void mcps802154_scheduler_unregister(struct mcps802154_scheduler_ops *scheduler_ops);

2.2 调度器操作

对于调度器而言,可能更改调度开始的时间、清除或回收当前的调度、向调度中增加新的域、更改调度访问、无效调度等,主要通过以下的外部API调用。

// 改变当前已经更新调度开始时间戳:需要调度计划上下文,同时设置新的时间戳(DTU)
int mcps802154_schedule_set_start(
	const struct mcps802154_schedule_update *schedule_update,
	u32 start_timestamp_dtu);

// 清除或回收当前的调度计划(schedule)
// n_keeps:保留上一调度计划的域数
// last_region_duration_dtu:最后域的持续时间,若为MCPS802154_DURATION_NO_CHANGE则保持不变
int mcps802154_schedule_recycle(
	const struct mcps802154_schedule_update *schedule_update,
	size_t n_keeps, int last_region_duration_dtu);

// 向当前更新的调度计划中增加一个新的域,包括开始时间以及持续时间
int mcps802154_schedule_add_region(
	const struct mcps802154_schedule_update *schedule_update,
	struct mcps802154_region *region, int start_dtu, int duration_dtu);	

// 请求尽可能更改访问
// 当有新的可用数据时,则使用此函数重新评估当前访问的时间。
// 如设备在休眠或等待接收帧,有新的数据需要发送,则需要调用请求重新评估,更改访问。
// 如果设备处于忙碌状态,将忽略请求,这种情况下,当前访问完成后才会检查新的访问。
void mcps802154_reschedule(struct mcps802154_llhw *llhw);

// 请求无效调度计划(schedule)
// 有限状态机锁应该入锁。要无效当前的schedule,将导致调度计划更改。
// 当例如某些参数更改时,应从外部模块调用此API以强制进行调度计划更改。
void mcps802154_schedule_invalidate(struct mcps802154_llhw *llhw);

你可能感兴趣的:(Linux,UWB,Stack,linux,智能硬件,物联网)