Aubr.Cool
Aubr.Cool
This guy hasn't written anything yet

注册于 6 years ago

回答
0
文章
0
关注者
0

RT_CAN_USING_HDR 使用这个宏,可以在驱动层上开启多线程接收,每个线程可以挂在一个hdrno上,这样一旦收到一个hdrno号的消息,就能立即唤醒等待的线程。
如上所说,actived的作用是,过滤器可以开启,也可以关闭,适用于动态开启关闭过滤器的情况。

这个硬件过滤器的程序,逻辑,是有点复杂,也有点乱,主要是为了能在用户层给硬件过滤器实现统一的接口,屏闭底层硬件的细节,这样就能在多种CAN控制器上实现代码统一。

怎么能简化一下逻辑,规范一下接口,大家可以一块讨论一下。
对bxcan的过滤器接口,大概是这样定义的


struct stm_bxcanfiltermap
{
rt_uint32_t id32mask_cnt;//32位标识符屏闭过滤器数量
rt_uint32_t id32bit_cnt; //32位标识符列表过滤器数量
rt_uint32_t id16mask_cnt; //16位标识符屏闭过滤器数量
rt_uint32_t id16bit_cnt; //16位标识符列表过滤器数量
};
struct stm_bxcanfilter_masks
{
rt_uint32_t id32maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE]; // 可用的32位标识符屏闭过滤器掩码
rt_uint32_t id32bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];//可用的32位标识符列表过滤器掩码
rt_uint32_t id16maskm[BX_CAN_FILTER_MAX_ARRAY_SIZE]; //可用的16位标识符屏闭过滤器掩码
rt_uint32_t id16bitm[BX_CAN_FILTER_MAX_ARRAY_SIZE];// //可用的16位标识符列表过滤器掩码
rt_uint32_t id32maskshift[2];// 32位标识符屏闭过滤器起始偏移 每个对应一个FIFO FIFO0 FIFO1
rt_uint32_t id32bitshift[2];//32位标识符列表过滤器起始偏移
rt_uint32_t id16maskshift[2];// 16位标识符屏闭过滤器起始偏移
rt_uint32_t id16bitshift[2];// 16位标识符列表过滤器起始偏移
};
struct stm_bxcan
{
CAN_TypeDef *reg;
void *mfrbase;
IRQn_Type sndirq;
IRQn_Type rcvirq0;
IRQn_Type rcvirq1;
IRQn_Type errirq;
struct stm_bxcanfilter_masks filtermask;
rt_uint32_t alocmask[BX_CAN_FILTER_MAX_ARRAY_SIZE]; //已分配的过滤器索引的掩码,每一位对应一个过滤器
const rt_uint32_t filtercnt;
const rt_uint32_t fifo1filteroff;
const struct stm_bxcanfiltermap filtermap[2];//每个元素对应一个FIFO0 FIFO1
struct rt_can_hdr *hdrhead;
};


bxcan.c实现了对过滤器的管理简单说明,bxcan共有两个过滤器FIFO, FIFO0 和FIFO1
为了方便管理把两个FIFO在软件上合并成一个,每个过滤器对应一个索引值,FIFO1索引值在原有的基础上统一加上一个偏移,这个偏移值为FIFO0的索引值的最大值。
最终过滤器的排列方式如下:
id32mask0个32位屏闭过滤器 FIFO0
id32bit0个32位列表过滤器
id16mask0个16位屏闭过滤器
id16bit0个16位列表过滤器

id32mask1个32位屏闭过滤器 FIFO1
id32bit1个32位列表过滤器
id16mask1个16位屏闭过滤器
id16bit1个16位列表过滤器

你是用一个串口发,3个收,然后串口调试助手看,第一个发的发出来了,然后收不到吗?

u-boot以后应该支持上,wifi,这样tftp直接下程序了,还有内置flash文件系统支持上

然并卵,每个芯片需要自己读参考手册,去设置过滤器。
手册看明白了,设置过滤器轻而易举,没看明白,有规范也白搭。

这个规范就是要对用户隐藏过滤器实现的细节,对于不同的平台,应用调用相同的接口。

我尝试一下实现成socket方式试试

这里会有个新问题

就是APP设置的过滤器编号如何得到?
是设置后由驱动分配或给出?还是APP指定使用某个过滤器?

编号有可能是动态变化的,由回调通过hdr参数传出来:
static rt_err_t  lpccanind(rt_device_t dev,  void *args, rt_int32_t hdr, rt_size_t size)
{
  .............
return RT_EOK;
}

这个回调在设置过滤器时传入:
struct rt_can_filter_item filter1item[] =
{
LPC_CAN_AF_STD_GRP_INIT(8, 9, lpccanind, RT_NULL),
LPC_CAN_AF_STD_GRP_INIT(10, 11, lpccanind, RT_NULL),
LPC_CAN_AF_STD_GRP_INIT(6, 7, lpccanind, RT_NULL),
..................
LPC_CAN_AF_EXT_INIT(4, lpccanind, RT_NULL),
};

那就改成以pos传入,然后有可能会对个别芯片的过滤器编号进行转换

在candev里增加can过滤器信息

这个是如何实现?

仔细想了一下,第三个方法实现不了,目前想到的就两个方法:
1、增加rt_can_read接口,该接口传入过滤器编号。
代码: 全选
2、
rt_size_t rt_device_read(rt_device_t dev,
rt_off_t pos,
void *buffer,
rt_size_t size)


  把pos作为过滤器编号传入。

回到
顶部

发布
问题

投诉
建议