On Tue, Feb 11, 2020 at 11:48 PM Peter Van Der Perk
<peter.vanderp...@nxp.com> wrote:
>
> >I believe that both sides would be the same.  Both would use BSD sockets, 
> >SocketCAN would be added to the network stacks, and the CAN drivers would be 
> >a network drivers.
> >
> >Your picture shows the existing implementation using character drivers.
> >SocketCAN is intended to be integrated into the network.
>
> Thanks for the quick response, indeed you're right the CAN drivers would 
> become network drivers and in the BSD sockets layer we can add the PF_CAN 
> protocol. However my question is then, would there still be a need for need 
> for CAN using character drivers (and userspace api)? If so, do we have to 
> make 2 separate HW drivers, one for CAN using character devices and one for 
> CAN using SocketCAN? Or does the current infrastructure support both? The 
> reason why I'm asking this is to think about trade-offs between 
> compatibility, realtime performance and maintainability.
>
> >I amn't familiar with CAN, but is it possible to implement a general CAN MAC 
> >driver on top of CAN CHAR driver like this?
> >+-------------------------------+
> >|     NuttX Network driver      |
> >| +------------+ +------------+ |
> >| |Syscall glue| |BSD Socket  | |
> >| |            | |glue        | |
> >| +------------+ +------------+ |
> >+-------------------------------+
> >+-------------------------------+ file_*    +-------------------------------+
> >|     Hardware MAC driver       |---------->|   NuttX CAN Driver (can.c)    |
> >+-------------------------------+           | +------------+
> >+-------------------------------+ +------------+ |
> >                                            | |Syscall glue| |Char driver | |
> >                                            | |            | |glue        | |
> >                                            | +------------+ +------------+ |
> >                                            +-------------------------------+
> >                                            +-------------------------------+
> >                                            |     Hardware CAN driver       |
> >                                            
> > +-------------------------------+ So we just need write one CAN driver, but 
> > the user can select socket or char as they want.
>
> From ease-of-implementation perspective that would be the way to go. However 
> this would mean that a CAN frame would go through the CAN driver -> Char 
> driver -> VFS -> Socket -> user space. This would add unnecessary delay and 
> jitter which would be certainly worse. Ideally I would implement it as shown 
> below. The question is though then how do deal with existing CAN character 
> device implementation?
>

The performance may not bad as your thinking: all kernel side VFS
functions(file_*)  simplely forward to the function pointers inside
file_operations, so the real sequence is:
CAN MAC 
driver->file_*(fs/vfs)->file_operations->*(drivers/can/can.c)->can_ops_s(CAN
lowhalf driver)
If the performance is still unacceptable, we can bypass VFS and
implement CAN MAC driver directly on top of can_ops_s:
CAN MAC driver->can_ops_s(CAN lowhalf driver)
Then we can reuse all CAN low half drivers without change, and the
user can even select BSD socket or VFS char like this:
#ifdef CONFIG_CAN_SOCKET
can_mac_register(&g_can_dev);
#else
can_register("dev/can0", &g_can_dev);
#endif

Thanks
Xiang
>
>    NuttX SocketCAN implementation
>    Proposal
> +-------------------------------+
> |          Application          |
> +-------------------------------+
> +-------------------------------+
> |        POSIX Interface        |
> +-------------------------------+
> +-------------+   +-------------+
> |System calls |   |BSD socket   |
> |             |   |net/sockets  |
> +-------------+   +-------------+
> +-------------------------------+
> |     NuttX Network driver      |
> | +------------+ +------------+ |
> | |Syscall glue| |BSD Socket  | |
> | |            | |glue  PF_CAN| |
> | +------------+ +------------+ |
> +-------------------------------+
> +-------------------------------+
> |   NEW Hardware CAN driver     |
> +-------------------------------+
> +-------------------------------+
> |OS (sched/), memory manager    |
> |(mm/), common libraries (libs/)|
> +-------------------------------+
> +-------------------------------+
> |           Hardware            |
> +-------------------------------+
>
>
>

Reply via email to