1. SylixOS 系统 can驱动注册

在SylixOS系统中在系统启动时首先会注册can驱动,调用API_CanDrvInstall函数

此函数将can驱动注册为字符设备。但是_canOpen等函数并不是设备驱动需要实现的,而是在系统内部已经实现。

__canOpen函数会判断当前字符设备是不是第一打开,如果是第一次打开会调用can设备的ioctl 定义的CAN_DEV_OPEN

功能。这和普通字符设备不同,普通字符设备是open初始化,调用Ioctl函数。

__canclose函数类似Open函数调用can设备的Ioctl函数。

__canRead函数

读函数首先判断读取的帧类型,然后根据要读取的字节数除以帧类型大小,获取读取几帧。然后检测当前读队列中是否有数据

,读写队列初始化并没有在驱动注册这里,而是在设备注册的时候。这里for循环里有个信号量,是用来阻塞,当正在有读取时候,防止在有别的读取调用,保证数据的一致性。在最后判断时候还有数据在队列中,如果有post释放信号量,让其他等待读的线程可以读。

__canWrite函数和读函数基本相同

首先根据帧的类型,判断需要写入多少帧数据。对设备加锁,然后往队列中写入数据,然后调用了 __canTxStartup函数使能发送,调用一次发送后,后面缓冲区里的发送由中断去调用。

在__canTxStartup 调用驱动函数的txStartup,这个需要驱动力实现__canWrite 函数最后判断缓冲队列是否已经满了,如果不满则释放释放信号量,继续写入。

__canIoctl会调用驱动程序的Ioctl函数,另外针对驱动Ioctl不能识别的命令,在__canIoctl进行了部分处理,对驱动ioctl无法识别时需要返回错误

注册驱动这里就结束了。

2.创建can设备

在创建完成驱动后,需要创建can设备。使用INT  API_CanDevCreate(PCHAR     pcName, CAN_CHAN *pcanchan,           UINT      uiRdFrameSize,     UINT      uiWrtFrameSize);创建设备。第一个参数是设备名称,第二个参数是设备通道,

第三个是设备接收缓冲区大小,第四个是发送缓冲区大小。

首先判断驱动有没有正常注册成功。然后从堆里分配一个 __PCAN_PORT。是包含can设备和can通道号的结构体,如下图

can通道号其实就是can功能函数的

can设备结构体体定义如下:

创建完成一个can 设备后,此时要对can设备初始化 初始化主要工作室为缓冲区分配大小,创建can设备使用的信号量

从堆中分出队列结构体和缓冲区相加大小的结构体。can缓冲队列结构体如下:

将pcanq + 1 得到缓冲区首地址,同时将地址转换为帧类型,出队指针和入队指针都赋值为当前缓冲区首地址。

初始化完成队列后,对can设备结构体中的读写状态和总线状态赋值。

初始化完成缓冲区后,会调用安装回调函数,这个会再驱动力调用,将__canITx 等函数复制给驱动力的钩子,然后注册字符设备。

驱动就可以直接调用__canITx函数

它的功能很简单 从对队列中读取数据,然后释放信号量允许在往发送队列中写入数据。

3.创建can通道

在创建can设备时,需要can通道。can通道创建就需要can驱动实现

在tms57lc43xx can驱动中首先定义了can相关的结构体,包含can的中断向量,can的基地址,can的功能函数等等,

在SylixOS中can驱动主要是实现can的三个功能函数

首先是ioctl,在注册驱动时_canOpen 和__canClose函数首先会调用Ioctl 函数

里面初始化,设备波特率等是对TI官方提供的示例代码进行了封装,具体可以看另一篇文章tms57lc43xx上手,如何生成官方代码。在调试时先使用官方裸机代码调试,调试内不循环模式能自发自收,然后在测试往外发。

然后是安装回调函数,这个函数在注册设备的时候会调用

将 确定框架里实现的__canITx 函数复制给了can设备CANCHAN_pcbGetTx, 通过调用CANCHAN_pcbGetTx函数就能从缓冲队队列中读取数据出来。相同原理__canIRx函数地址传给CANCHAN_pcbPutRcv 实现将读取数据写入到当前的接收缺列中。

最后一个功能函数startUp就是使用前面准备好的CANCHAN_pcbGetTx 获取一帧数据,然后解析帧ID,帧类型,设置相应的TI的寄存器,使能发送。

三个功能函数实现完成后,需要把接收和发送中断完成,由于在write函数在把多个数据帧写入发送队列后会使能一次发送,一次发送完成后会有发送完成中断,在中断中再次将单独发送函数加入到工作队列中,发送函数需要实现从发送队列中读取一个帧数据,然后发送。

在TMS57LC43xx中,can有32个message,每个message都可以设置对应的ID号,也就是说can帧的ID好会被存入当前的message中。这个可以通过TI的工具图形界面设置message的ID然后生成源代码,所以中断要读取时哪个message触发中断。

然后再次调用发送函数,发送函数再次使用CANCHAN_pcbGetTx 获取can帧。 接收中断与其类似

流程图如下:

最后在bsp调用

TMS570LC43xx SylixOS can 驱动相关推荐

  1. SylixOS设备驱动

    驱动简介 设备驱动是最底层的.直接控制和监视各类硬件的部分,它们的职责是隐藏硬件的具体细节,并向其他部分提供一个抽象的.通用的接口,设备驱动是内核空间的一部分,其运行在内核态下. 按照硬件设备的具体工 ...

  2. linux字符驱动向vxworks移植,VxWorks驱动移植至SylixOS总结

    本文档描述了将VxWorks中的驱动源码快速移植至SylixOS中的方法,使用时需要结合SylixOS中的VxWorks兼容层实现. 1. 驱动注册与初始化 1.1 VxWorks中驱动注册与初始化 ...

  3. sja1000 CAN驱动学习、调试记录(基于PeliCan Mode)

    一.基础知识 网上讲sja1000 CAN总线控制器的资料很多,这里放一个引路贴:(151条消息) CAN总线控制器SJA1000_FA@TE的博客-CSDN博客_sja1000 BasicCAN M ...

  4. zynq7000 从github拉取linux源码进行编译,运行. 快速进行外设验证。全流程教程

    zynq7000 编译 前言 使用SylixOS进行驱动开发, 需要快速验证板上的外设是否完好. 嫌弃官方的SDK占用磁盘空间巨大, 本教程直接使用 github 上的源码进行快速编译运行. 1. 资 ...

  5. SylixOS iMX6平台I2C总线驱动

    原理概述 I2C总线驱动概述 I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数.驱动程序包含初始化I2C总 ...

  6. SylixOS 基于STM32平台的GPIO模仿I2C总线的驱动开发流程

    2019独角兽企业重金招聘Python工程师标准>>> 概述 本文档以STM32F767平台为例,详细介绍SylixOS上GPIO模仿I2C总线的驱动开发流程. 初始化 GPIO模仿 ...

  7. SylixOS下基于NUC970的NAND驱动

    开发环境 开发环境 宿主机: Windows7 64bits 系统 开发板: 安米MDK972 软件环境: RealEvo-IDE3.0 NAND Flash: S34ML02G100TF100 S3 ...

  8. SylixOS中APIC HPET定时器字符驱动实现

    1.简介 1.1 APIC介绍 "APIC"是Advanced Programmable Interrupt Controller的缩写,即高级可编程中断控制器.引入APIC机制是 ...

  9. SylixOS x86 HPET 定时器驱动

    HPET(High Precision Event Timer) 俗称高精度定时器,最低时钟频率为10MHZ,而且定义了比较严格的精确度(间隔 >= 1 毫秒的允许 +-0.05% 的误差,间隔 ...

  10. SylixOS GSLX680触摸屏驱动移植

    GSLX680 触摸屏 触摸屏按照触摸屏的工作原理和传输信息的介质,可以分为四种,它们分别为电阻式.电容感应式.红外线式以及表面声波式.GSLX680 为电容式触摸屏,挂接在I2C总线上,通过I2C总 ...

最新文章

  1. MySQL联合查询语法内联、左联、右联、全联
  2. STL Priority_Queue
  3. ASP.NET两个关联的表的增删查改
  4. php 调用vnc协议,Centos7下部署VNC(示例代码)
  5. 基于matlab的单相pwm逆变电路的仿真研究,基于MATLAB的单相PWM逆变电路的仿真研究...
  6. 【数据结构与算法】之深入解析“分数加减运算”的求解思路与算法示例
  7. 用Telnet 来用smtp发邮件。。 send mail by SMTP server
  8. 火狐打印预览_将打印和打印预览命令添加到Firefox的上下文菜单
  9. python爬虫ip限制_简单爬虫,突破IP访问限制和复杂验证码,小总结
  10. 操作系统原理与实践-2操作系统的引导
  11. Ubuntu 添加、删除ppa源
  12. Scala学习笔记04:内建控制结构
  13. easyui combobox支持多选
  14. php接收url的json,api-php中url接收的json数据,json_decode为空
  15. 站长网专访:南昌网事:那一场关于互联网的风花雪月
  16. 2019年西安市民办小升初西工大附中分校面谈录取学生名单
  17. echarts 立体柱状图(多个柱状图)
  18. [webView stopLoading]; 和 [webView release];
  19. 水至清则无鱼,人至察则无徒
  20. 帮您分析济南网站优化和推广的区别?

热门文章

  1. 谈谈制作台历的心得——年初企业们比较喜欢的宣传方式
  2. 谨以此送给所有单身的MM
  3. 关于Neo4j 强连通分量算法,你了解多少?
  4. Java跨域问题以及如何使用Cors解决前后端 分离部署项目所遇到的跨域问题
  5. 【笔记】时间片轮转 RR 进程调度算法(Java 实现)
  6. 通过javaBean反射转换成mybatis映射文件
  7. 工具使用——印象笔记(5)
  8. C#程序之二 -- 数独小游戏(1. UI设计)
  9. android和view相关的东西
  10. 一些shell脚本,sed替换