This commit is contained in:
sunbeam 2024-12-20 16:07:22 +08:00
commit 46299f42d1
262 changed files with 125327 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
Debug
Debug_FLASH

2
CAN_Bootloader/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/dist
/.build

BIN
CAN_Bootloader/DM_RP_SA.dll Normal file

Binary file not shown.

BIN
CAN_Bootloader/USB2XXX.dll Normal file

Binary file not shown.

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<project ver="10" name="CAN_Bootloader" libEmbed="true" icon="..." ui="win" output="CAN_Bootloader.exe" CompanyName="单位名称" FileDescription="CAN_Bootloader" LegalCopyright="Copyright (C) 作者 2022" ProductName="CAN_Bootloader" InternalName="CAN_Bootloader" FileVersion="0.0.0.5" ProductVersion="0.0.0.5" publishDir="/dist/" dstrip="false" local="false" ignored="false">
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
<folder name="资源文件" path="res" embed="true" local="false" ignored="false"/>
<folder name="窗体文件" path="dlg" comment="目录" embed="true" local="false" ignored="false">
<file name="诊断子窗口.aardio" path="dlg\诊断子窗口.aardio" comment="dlg\诊断子窗口.aardio"/>
</folder>
<folder name="user" path="user" embed="true" comment="目录" local="false" ignored="false">
<file name="CanThread.aardio" path="user\CanThread.aardio" comment="user\CanThread.aardio"/>
<file name="Diag10code.aardio" path="user\Diag10code.aardio" comment="user\Diag10code.aardio"/>
<file name="Diag11code.aardio" path="user\Diag11code.aardio" comment="user\Diag11code.aardio"/>
<file name="Diag22code.aardio" path="user\Diag22code.aardio" comment="user\Diag22code.aardio"/>
<file name="Diag27code.aardio" path="user\Diag27code.aardio" comment="user\Diag27code.aardio"/>
<file name="Diag28code.aardio" path="user\Diag28code.aardio" comment="user\Diag28code.aardio"/>
<file name="Diag2Ecode.aardio" path="user\Diag2Ecode.aardio" comment="user\Diag2Ecode.aardio"/>
<file name="Diag31code.aardio" path="user\Diag31code.aardio" comment="user\Diag31code.aardio"/>
<file name="Diag34code.aardio" path="user\Diag34code.aardio" comment="user\Diag34code.aardio"/>
<file name="Diag36code.aardio" path="user\Diag36code.aardio" comment="user\Diag36code.aardio"/>
<file name="Diag37code.aardio" path="user\Diag37code.aardio" comment="user\Diag37code.aardio"/>
<file name="Diag7Fcode.aardio" path="user\Diag7Fcode.aardio" comment="user\Diag7Fcode.aardio"/>
<file name="Diag85code.aardio" path="user\Diag85code.aardio" comment="user\Diag85code.aardio"/>
<file name="DiagBootcode.aardio" path="user\DiagBootcode.aardio" comment="user\DiagBootcode.aardio"/>
<file name="GeelySecurety.aardio" path="user\GeelySecurety.aardio" comment="user\GeelySecurety.aardio"/>
<file name="S19Decode.aardio" path="user\S19Decode.aardio" comment="user\S19Decode.aardio"/>
</folder>
</project>

View File

@ -0,0 +1,87 @@
import win.ui;
/*DSG{{*/
var winform = win.form(text="诊断读取";right=679;bottom=499;border="thin";max=false;mode="popup")
winform.add(
btnDID_F010={cls="button";text="F010";left=178;top=162;right=305;bottom=193;z=11};
btnDID_F010w={cls="button";text="写F010";left=336;top=296;right=463;bottom=327;z=16};
btnDID_F101={cls="button";text="F101";left=178;top=203;right=305;bottom=234;z=10};
btnDID_F101w={cls="button";text="写F101";left=338;top=335;right=458;bottom=366;z=15};
btnDID_F159={cls="button";text="F159";left=36;top=162;right=163;bottom=193;z=5};
btnDID_F15A={cls="button";text="F15A";left=36;top=203;right=163;bottom=234;z=6};
btnDID_F180={cls="button";text="F180";left=178;top=40;right=305;bottom=71;z=7};
btnDID_F187={cls="button";text="零部件编号";left=36;top=40;right=163;bottom=71;z=2};
btnDID_F18A={cls="button";text="供应商名称";left=36;top=80;right=163;bottom=111;z=3};
btnDID_F18C={cls="button";text="F18C";left=178;top=80;right=305;bottom=111;z=8};
btnDID_F190={cls="button";text="F190 VIN";left=178;top=121;right=305;bottom=152;z=9};
btnDID_F197={cls="button";text="ECU 系统名称";left=36;top=121;right=163;bottom=152;z=4};
btn_1003={cls="button";text="扩展会话";left=22;top=296;right=126;bottom=323;z=14};
btn_2701={cls="button";text="解锁";left=158;top=296;right=262;bottom=323;z=13};
groupbox={cls="groupbox";text="DID";left=16;top=12;right=328;bottom=260;edge=1;z=1};
groupbox2={cls="groupbox";text="DTC";left=343;top=12;right=655;bottom=260;edge=1;z=12}
)
/*}}*/
winform.btnDID_F180.oncommand = function(id,event){
DiagReadDID(0xF180);
}
winform.btnDID_F18A.oncommand = function(id,event){
DiagReadDID(0xF18A);
}
winform.btnDID_F197.oncommand = function(id,event){
DiagReadDID(0xF197);
}
winform.btnDID_F159.oncommand = function(id,event){
DiagReadDID(0xF159);
}
winform.btnDID_F15A.oncommand = function(id,event){
DiagReadDID(0xF15A);
}
winform.btnDID_F18C.oncommand = function(id,event){
DiagReadDID(0xF18C);
}
winform.btnDID_F190.oncommand = function(id,event){
DiagReadDID(0xF190);
}
winform.btnDID_F010.oncommand = function(id,event){
DiagReadDID(0xF010);
}
winform.btnDID_F101.oncommand = function(id,event){
DiagReadDID(0xF101);
}
winform.onClose = function(hwnd,message,wParam,lParam){
winform.show(false);
return 0;
}
winform.btn_2701.oncommand = function(id,event){
::PostThreadMessage(thrdId,114,0x01,0)//自定义消息
}
winform.btn_1003.oncommand = function(id,event){
::PostThreadMessage(thrdId,111,0x00,0x03)//自定义消息
}
winform.btnDID_F187.oncommand = function(id,event){
DiagReadDID(0xF187);
}
winform.btnDID_F010w.oncommand = function(id,event){
::PostThreadMessage(thrdId,115,0xF010,0x00)//自定义消息
}
winform.btnDID_F101w.oncommand = function(id,event){
::PostThreadMessage(thrdId,115,0xF101,0x00)//自定义消息
}
winform.show();
win.loopMessage();
return winform;

View File

@ -0,0 +1,20 @@
//config 配置文件
import fsys.config;
config = fsys.config("/config/");
//config = fsys.config( io.appData("/软件作者/应用程序名/") );
//不需要序列化的配置名字前请添加下划线
namespace config {
__appName = "应用程序名";
__appVersion = "1.0.0.01";
__appDescription = "这是一个测试程序";
__website = "http://www.aardio.com/";
}
/**intellisense(config)
__appName = 应用程序名
__appVersion = 应用程序内部版本号
__appDescription = 程序说明
__website = 官方网站
? = 配置文件名,\n读写配置并序列化为一个表对象,\n表的成员值可以是支持序列化的普通变量,支持table对象\n配置文件在首次使用时自动加载,退出程序时自动保存\n!fsys_table.
end intellisense**/

View File

@ -0,0 +1,490 @@
/*
*使用说明:
*1.创建CAN设备对象 CANHw = usb2canfd.USB2CANHW();
*2.加载DLL CANHw.LoadDll();
*3.扫描设备 hwnum = CANHw.FlashHw();
*4.获取可用设备 allhw = CANHw.GetAvailableHW();
*5.打开设备(初始化) CANHw.OpenDevice(设备序号,通道)
*6.通过SendMsg和GetMsg发送和获取报文
*/
namespace usb2canfd{
//参考 http://www.toomoss.com/help/index.htm
//初始化CAN的数据类型定义
class CANFD_INIT_CONFIG{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
BYTE Mode; //0-正常模式1-自发自收模式
BYTE ISOCRCEnable;//0-禁止ISO CRC,1-使能ISO CRC
BYTE RetrySend;//0-禁止重发1-无限制重发
BYTE ResEnable;//0-不接入内部120欧终端电阻1-接入内部120欧终端电阻
//波特率参数可以用TCANLINPro软件里面的波特率计算工具计算
//仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2)
BYTE NBT_BRP;
BYTE NBT_SEG1;
BYTE NBT_SEG2;
BYTE NBT_SJW;
//数据段波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2)
BYTE DBT_BRP;
BYTE DBT_SEG1;
BYTE DBT_SEG2;
BYTE DBT_SJW;
BYTE __Res0[8];
}
//初始化CAN的数据类型定义
class CAN_INIT_CONFIG{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
//CAN波特率 = 100MHz/(CAN_BRP)/(CAN_SJW+CAN_BS1+CAN_BS2)
INT CAN_BRP; //取值范围1~1024
BYTE CAN_SJW; //取值范围1~4
BYTE CAN_BS1; //取值范围1~16
BYTE CAN_BS2; //取值范围1~8
BYTE CAN_Mode; //CAN工作模式0-正常模式1-环回模式2-静默模式3-静默环回模式bit7为1则接入适配器内部终端电阻否则不接入
BYTE CAN_ABOM; //自动离线管理0-禁止1-使能
BYTE CAN_NART; //报文重发管理0-使能报文重传1-禁止报文重传
BYTE CAN_RFLM; //FIFO锁定管理0-新报文覆盖旧报文1-丢弃新报文
BYTE CAN_TXFP; //发送优先级管理0-标识符决定1-发送请求顺序决定
}
class CAN_FILTER_CONFIG{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
BYTE Enable; //使能该过滤器1-使能0-禁止
BYTE FilterIndex; //过滤器索引号取值范围为0到13
BYTE FilterMode; //过滤器模式0-屏蔽位模式1-标识符列表模式
BYTE ExtFrame; //过滤的帧类型标志为1 代表要过滤的为扩展帧为0 代表要过滤的为标准帧。
INT ID_Std_Ext; //验收码ID
INT ID_IDE; //验收码IDE
INT ID_RTR; //验收码RTR
INT MASK_Std_Ext; //屏蔽码ID该项只有在过滤器模式为屏蔽位模式时有用
INT MASK_IDE; //屏蔽码IDE该项只有在过滤器模式为屏蔽位模式时有用
INT MASK_RTR; //屏蔽码RTR该项只有在过滤器模式为屏蔽位模式时有用
}
//CANfd信息帧的数据类型定义
class CANFD_MSG{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
INT ID; //报文ID。 //| (1<<31);//扩展帧
BYTE DLC; //数据字节长度,可设置为-0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64
BYTE Flags; //bit[0]-BRS,bit[1]-ESI,bit[2]-FDF,bit[6..5]-Channel,bit[7]-RXD
BYTE __Res0; //保留
BYTE __Res1; //保留
INT TimeStamp; //帧接收或者发送时的时间戳单位为10us
BYTE Data[64]; //报文的数据。
}
//CAN信息帧的数据类型定义
class CAN_MSG{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
INT ID; //报文ID。
INT TimeStamp; //接收到信息帧时的时间标识从CAN 控制器初始化开始计时。
BYTE RemoteFlag; //是否是远程帧
BYTE ExternFlag; //是否是扩展帧
BYTE DataLen; //数据长度(<=8)即Data 的长度。
BYTE Data[8]; //报文的数据。
BYTE __Res;
}
class CAN_UDS_ADDR{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
INT ReqID; //请求报文ID。
INT ResID; //应答报文ID。
BYTE Flag; //bit[0]-帧类型(0-标准帧1-扩展帧),
//bit[1]-FDF(0-普通CAN帧1-CANFD帧),
//bit[2]-BRS(0-CANFD帧不加速1-CANFD帧加速)
BYTE AddrFormats; //0-normal, 1-extended ,2-mixed
BYTE AddrExt; //当AddrFormats不为normal时该数据放到CAN数据域第1字节
BYTE MaxDLC; //每帧最大数据字节数一般设置为8
}
class DEVICE_INFO{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
BYTE FirmwareName[32]; //固件名称字符串
BYTE BuildDate[32]; //固件编译时间字符串
INT HardwareVersion; //硬件版本号
INT FirmwareVersion; //固件版本号
INT SerialNumber[3]; //适配器序列号
INT Functions; //适配器当前具备的功能
}
//调用函数
class USB2CANHW{
ctor( /*输入构造函数所需要的参数*/ ){
};
type=me;
/*对象的所有成员必须用分号分隔*/
//初始化全局变量
DllHandle = null;
//加载DLL
LoadDll = function(){
try{
DllHandle = ..raw.loadDll("\USB2XXX.dll")
}
catch(err)
{
import win;
DllHandle = null;
win.msgboxTimeout("加载USB2LIN的DLL失败请检查USB2XXX.dll和libusb-1.0.dll文件","错误",3000,);
}
if(DllHandle == null)return 1;
return 0;
}
//刷新硬件
FlashHw = function(){
if(DllHandle = null){
//DLL为空返回
AvailableHW = {}
return 0;
}
var arr_temp = {int value[] = { length = 10/*可以使用变量*/ } }//类似动态数组
HwNum = DllHandle.USB_ScanDevice(arr_temp)
AvailableHW = {}
for(i=1;HwNum;1){
var devtemp = {};
devtemp.devnum = i;
devtemp.channel = 1;
devtemp.hLINHW = arr_temp.value[i];
devtemp.name = "dev-" + i + ":" + tostring(arr_temp.value[i],16);
..table.push(AvailableHW,devtemp);
}
return HwNum; //返回有效硬件数
}
//获取设备信息
GetDevInfo = function(index){
if(index > HwNum)
{ //如果序号大于最大硬件数
return 0;
}
DllHandle.USB_OpenDevice(AvailableHW[index].hLINHW);
var DeviceInfo = ..usb2canfd.DEVICE_INFO();
var funcstr = ..raw.buffer(100);
var ret = DllHandle.DEV_GetDeviceInfo(AvailableHW[index].hLINHW,DeviceInfo,funcstr);
return ret,DeviceInfo,funcstr;
}
//获取设备信息
GetNowInfo = function(){
if(Hwconnected == null){
return 0;
}
//DllHandle.USB_OpenDevice(Hwconnected);
var DeviceInfo = ..usb2canfd.DEVICE_INFO();
var funcstr = ..raw.buffer(100);
var ret = DllHandle.DEV_GetDeviceInfo(Hwconnected,DeviceInfo,funcstr);
return ret,DeviceInfo,funcstr;
}
//获取有效硬件
GetAvailableHW = function(){
return AvailableHW;
}
SetFilter = function(index){
CANFilter = ..usb2canfd.CAN_FILTER_CONFIG();
CANFilter.FilterIndex = 0;
CANFilter.Enable = 1;
CANFilter.ExtFrame = 0; //需要过滤接收的帧为标准帧
CANFilter.FilterMode = 1;//标识符列表模式
CANFilter.ID_IDE = 0; //接收到的数据帧IDE必须为1也就是必须为扩展帧数据
CANFilter.ID_RTR = 0; //接收到的帧类型必须为数据帧
CANFilter.ID_Std_Ext = 0x620;//接收到的帧ID必须等于CANFilter.ID_Std_Ext设置的值
var ret = DllHandle.CAN_Filter_Init(AvailableHW[index].hLINHW,0,CANFilter);
CANFilter.FilterIndex = 1;
CANFilter.ID_Std_Ext = 0x610;
var ret = DllHandle.CAN_Filter_Init(AvailableHW[index].hLINHW,0,CANFilter);
for(i=2;13;1){
CANFilter.FilterIndex = i;
CANFilter.Enable = 0;
DllHandle.CAN_Filter_Init(AvailableHW[index].hLINHW,0,CANFilter);
}
}
//打开设备,包括初始化通道
OpenDevice = function(index,channel,canfd){
if(index > HwNum)
{ //如果序号大于最大硬件数
return 0;
}
import console;
var ret = DllHandle.USB_OpenDevice(AvailableHW[index].hLINHW)
//canfd = true;
if(canfd == true){
var canconfig = ..usb2canfd.CANFD_INIT_CONFIG();
canconfig.Mode = 0; //0-正常模式1-自发自收模式
canconfig.ISOCRCEnable = 0;//0-禁止ISO CRC,1-使能ISO CRC
canconfig.RetrySend = 1;//0-禁止重发1-无限制重发
canconfig.ResEnable = 1;//0-不接入内部120欧终端电阻1-接入内部120欧终端电阻
//波特率参数可以用TCANLINPro软件里面的波特率计算工具计算
//仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2)
canconfig.NBT_BRP = 1; //参数来自官方上位机默认500K
canconfig.NBT_SEG1 = 59;
canconfig.NBT_SEG2 = 20;
canconfig.NBT_SJW = 2;
//数据段波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2)
canconfig.DBT_BRP = 2; //参数来自官方上位机默认500K
canconfig.DBT_SEG1 = 29;
canconfig.DBT_SEG2 = 10;
canconfig.DBT_SJW = 2;
ret = DllHandle.CANFD_Init(AvailableHW[index].hLINHW,channel,canconfig);
}
else {
var canconfig = ..usb2canfd.CAN_INIT_CONFIG();
canconfig.CAN_Mode = 0x80;//0-正常模式 1-环回模式 0x80终端电阻
canconfig.CAN_ABOM = 0;//禁止自动离线
canconfig.CAN_NART = 0;//禁止报文重传
canconfig.CAN_RFLM = 0;//FIFO满之后覆盖旧报文
canconfig.CAN_TXFP = 1;//发送请求决定发送顺序
//配置波特率,波特率 = 42M/(BRP*(SJW+BS1+BS2))
canconfig.CAN_BRP = 4;
canconfig.CAN_BS1 = 15;
canconfig.CAN_BS2 = 5;
canconfig.CAN_SJW = 2;
ret = DllHandle.CAN_Init(AvailableHW[index].hLINHW,channel,canconfig);
//console.log("init ret = " + ret);
this.SetFilter(index);
}
canfd_connected = canfd;
if(ret == 0){//调用成功
Hwconnected = AvailableHW[index].hLINHW;
Chconntected = channel;
}
else {
//Hwconnected = null
Chconntected = null;
}
return ret;
}
//关闭设备
CloseDevice = function(){
if(Hwconnected == null){
return;
}
try{
DllHandle.USB_CloseDevice(Hwconnected);
Hwconnected = null;
}
}
//是否连接
isConnected = function(){
if(Hwconnected == null){
return false;
}
else {
return true;
}
}
//发送报文
SendMsg = function(id,data){
if(Hwconnected == null){//未连接
return 0;
}
if(#data == 0 || #data>8){//长度不对
return 0;
}
//console.log("发送报文")
var ret = 0;
if(canfd_connected == true){
var msg = ..usb2canfd.CANFD_MSG();
msg.Flags = 0;
if(id <= 0x7ff){
msg.ID = id; //| (1<<31);//扩展帧
}
else {
msg.ID = id | (1<<31);//扩展帧
}
msg.DLC = #data;
msg.Data = data;
//console.dumpJson(msg);
//console.log("Hwconnected = " + Hwconnected);
//console.log("Chconntected = " + Chconntected);
ret = DllHandle.CANFD_SendMsg(Hwconnected,Chconntected,msg,1);
}
else {
var msg = ..usb2canfd.CAN_MSG();
//msg.Flags = 0;
if(id <= 0x7ff){
msg.ID = id; //| (1<<31);//扩展帧
}
else {
msg.ID = id | (1<<31);//扩展帧
}
msg.ExternFlag = 0;
msg.RemoteFlag = 0;
msg.DataLen = #data;
msg.Data = data;
//console.log("发送报文")
ret = DllHandle.CAN_SendMsg(Hwconnected,Chconntected,msg,1);
//console.log("ret = " + ret);
}
return ret;
}
//从设备缓冲区获取报文
GetMsg = function(){
var ret = 0;
var retdata = {};
if(canfd_connected == true){
//CANFD
do{
var msgbuf = ..usb2canfd.CANFD_MSG();
ret = DllHandle.CANFD_GetMsg(Hwconnected,CANIndex,msgbuf,1);
if(ret == 1){
var data = {};
for(i=1;msgbuf.DLC;1){
data[i] = msgbuf.Data[i];
}
var msg = {"id"=msgbuf.ID;"data"=data;};//
..table.push(retdata,msg);
}
}while(ret > 0)
}
else {
//CAN
do{
//raw.convertArray(raw.sizeof(..usb2canfd.CAN_MSG())
var msgbuf = {};
for(i=1;10;1){
//msgbuf.push(new ..usb2canfd.CAN_MS())
var temp = ..usb2canfd.CAN_MSG()
..table.push(msgbuf,temp);
}
//var msgbuf = ..raw.toarray(10,"struct",..usb2canfd.CAN_MS);
ret = DllHandle.CAN_GetMsgWithSize(Hwconnected,CANIndex,msgbuf[1],1);
if(ret == 1){
var data = {};
for(i=1;msgbuf[1].DataLen;1){
data[i] = msgbuf[1].Data[i];
}
var msg = {"id"=msgbuf[1].ID;"data"=data;};//
..table.push(retdata,msg);
}
}while(ret > 0)
}
return retdata;
}
GetDiag = function(data){
if(#data<2){
return 0,1;
}
var UDSAddr = ..usb2canfd.CAN_UDS_ADDR()
UDSAddr.Flag = 1;//使用扩展帧
UDSAddr.AddrFormats = 0;
UDSAddr.ReqID = 0x18dadff1;
UDSAddr.ResID = 0x18daf1df;
UDSAddr.MaxDLC = 8;
var req_data = ..raw.buffer(#data);
for(i=1;#data;1){
req_data[i] = data[i];
}
ret = DllHandle.CAN_UDS_Request(Hwconnected,CANIndex,UDSAddr,req_data,#data);
var res_data = ..raw.buffer(4096);
//sleep(10);
var ret = DllHandle.CAN_UDS_Response(Hwconnected,CANIndex,UDSAddr,res_data,1000);
return ret,2,res_data;
}
SetPower = function(state){
var ret = DllHandle.LIN_EX_CtrlPowerOut(Hwconnected,state);
return ret;
}
GetPower = function(){
var buf = ..raw.buffer(10);
var ret = DllHandle.LIN_EX_GetVbatValue(Hwconnected,buf);
return ret,buf;
}
}
}
/**intellisense()
usb2canfd = 图莫斯CANFD驱动
usb2canfd.USB2CANHW = USB2CAN库
usb2canfd.USB2CANHW() = 创建设备对象\n!usb2canfdUSB2CANHW.
!usb2canfdUSB2CANHW.LoadDll() = 加载DLL
!usb2canfdUSB2CANHW.FlashHw() = 刷新硬件
!usb2canfdUSB2CANHW.GetDevInfo() = 获取设备信息
!usb2canfdUSB2CANHW.GetAvailableHW() = 获取有效设备需要先FlashHw()刷新
!usb2canfdUSB2CANHW.OpenDevice() = 打开设备
!usb2canfdUSB2CANHW.CloseDevice() = 关闭设备
!usb2canfdUSB2CANHW.isConnected() = 是否已连接
!usb2canfdUSB2CANHW.SendMsg() = 发送报文
!usb2canfdUSB2CANHW.GetMsg() = 接收报文
end intellisense**/

Binary file not shown.

255
CAN_Bootloader/main.aardio Normal file
View File

@ -0,0 +1,255 @@
import win.ui;
/*DSG{{*/
mainForm = win.form(text="CAN_Bootloader";right=599;bottom=465;border="dialog frame";max=false)
mainForm.add(
btnConnect={cls="button";text="连接";left=204;top=64;right=289;bottom=90;z=4};
btnFlash={cls="button";text="开始刷写";left=37;top=315;right=136;bottom=343;z=9};
btnFresh={cls="button";text="刷新";left=204;top=28;right=288;bottom=54;z=2};
btnOpen={cls="button";text="打开文件";left=37;top=282;right=136;bottom=310;z=8};
btnOpenFlashdrv={cls="button";text="打开FlashDriver";left=149;top=282;right=248;bottom=310;z=24};
btnReadF186={cls="button";text="读取当前会话";left=37;top=349;right=136;bottom=377;z=13};
btnReadF189={cls="button";text="编译时间";left=149;top=347;right=248;bottom=375;z=25};
btnReadF191={cls="button";text="boot版本";left=37;top=415;right=136;bottom=443;z=19};
btnReadF199={cls="button";text="ECU名称";left=149;top=416;right=248;bottom=444;z=20};
btnReadHw={cls="button";text="读取硬件版本号";left=149;top=381;right=248;bottom=409;z=12};
btnReadSw={cls="button";text="读取软件版本号";left=37;top=382;right=136;bottom=410;z=10};
btnTest={cls="button";text="停止";left=149;top=316;right=248;bottom=344;z=11};
cbbChannel={cls="combobox";left=58;top=64;right=191;bottom=90;edge=1;items={};mode="dropdown";z=3};
cbbDev={cls="combobox";left=58;top=27;right=191;bottom=53;edge=1;items={};mode="dropdown";z=1};
checkbox={cls="checkbox";text="CANFD设备";left=151;top=101;right=248;bottom=120;checked=1;z=21};
edFile={cls="richedit";left=8;top=131;right=288;bottom=187;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=14};
edFile2={cls="richedit";left=8;top=213;right=288;bottom=269;border=1;disabled=1;edge=1;multiline=1;wrap=1;z=22};
edit={cls="edit";left=294;top=19;right=596;bottom=401;autovscroll=false;edge=1;multiline=1;vscroll=1;z=5};
progress={cls="progress";left=296;top=436;right=596;bottom=464;edge=1;max=100;min=0;z=15};
static={cls="static";text="设备";left=1;top=28;right=61;bottom=52;align="center";center=1;transparent=1;z=6};
static2={cls="static";text="通道";left=1;top=66;right=61;bottom=90;align="center";center=1;transparent=1;z=7};
static3={cls="static";text="刷写进度";left=296;top=409;right=349;bottom=429;transparent=1;z=16};
static4={cls="static";text="烧录APP";left=13;top=108;right=85;bottom=132;center=1;transparent=1;z=17};
static5={cls="static";text="V0.1_20220518";left=451;top=1;right=595;bottom=17;align="right";center=1;transparent=1;z=18};
static6={cls="static";text="FlashDriver";left=13;top=195;right=101;bottom=218;transparent=1;z=23}
)
/*}}*/
import win;
import usb2canfd;
import win.timer;
var boot_count = 0;//boot时间计数器
var bootstate = false;//boot状态标志
var starttime = time.now();
timer_bootcount = win.timer(mainForm,100);
timer_bootcount.onTimer = function(){//boot时间定时器100ms间隔
boot_count++;
}
Display = function(str){//显示日志
var nowtime = time();
nowtime.format="%H:%M:%S";
mainForm.edit.print(tostring(nowtime) + " " + str);
}
//遍历目录
import console;
/*
import fsys.fileInfo;
info = fsys.fileInfo("C:\Users\fcb19\Desktop\dll\libusb-1.0.dll");
console.log(info.writeTime);
execute("pause")
raw.loadDll("C:\Users\fcb19\Desktop\dll\libusb-1.0.dll");
*/
CANHw = usb2canfd.USB2CANHW();//尝试加载CAN dll
var ret = CANHw.LoadDll();
if(ret == 0){
Display("DLL加载成功");
}
else {
//Display("DLL加载失败");
return ;
}
//初始化界面
mainForm.cbbChannel.add("通道1");
mainForm.cbbChannel.add("通道2");
mainForm.cbbChannel.selIndex = 1
//刷新按键
mainForm.btnFresh.oncommand = function(id,event){
mainForm.cbbDev.clear();//清空下拉框,防止反复刷新叠加
var hwnum = CANHw.FlashHw();//获取硬件数量
if(hwnum == 0){
mainForm.cbbDev.text = "未找到硬件"
}
else {
var allhw = CANHw.GetAvailableHW();
for(i=1;#allhw;1){
mainForm.cbbDev.add(allhw[i].name);
}
}
mainForm.cbbDev.selIndex = 1
::PostThreadMessage(thrdId,100,0,0)//自定义消息
}
mainForm.btnConnect.oncommand = function(id,event){
var canfd_check = mainForm.checkbox.checked?0x80:0x00;
::PostThreadMessage(thrdId,101,mainForm.cbbDev.selIndex,(mainForm.cbbChannel.selIndex - 1)|canfd_check)//自定义消息
/*
var ret = CANHw.OpenDevice(mainForm.cbbDev.selIndex,mainForm.cbbChannel.selIndex - 1);//通道为0和1
if(ret == 0){
Display("连接成功");
}
else {
Display("连接失败");
}
*/
}
//CAN通讯线程
import thread.command;
var listener = thread.command();
var flag_connected=0;
listener.$Display = function(str){
Display(str);
}
listener.$ShowPath = function(str){
mainForm.edFile.text = str;
}
listener.$ShowFlashDrvPath = function(str){
mainForm.edFile2.text = str;
}
listener.$SetProgress = function(pos){
if(pos >= 0 && pos <= 100){
mainForm.progress.pos = pos;
}
}
listener.$Connected = function(){
mainForm.btnConnect.disabled = true;
mainForm.btnFresh.disabled = true;
mainForm.cbbDev.disabled = true;
mainForm.cbbChannel.disabled = true;
flag_connected = 1;
}
listener.$SendEnd = function(isSuccess){
//timer_bootcount.disable();
var usetime = time.now().diffsecond(starttime);
bootstate = false;
if(isSuccess == true){
Display("刷写成功,用时 " + usetime + " S")
}
}
//线程函数
var CanThread = function(){
//线程函数内部要添加自已的import语句
import win;
import console;
//console.log("线程开始运行")
loadcodex("\user\CanThread.aardio");//加载线程程序
//在子线程启动消息循环
win.loopMessage(FuncLoopMsg)
}
DiagReadDID = function(did){
::PostThreadMessage(thrdId,110,did,0)//自定义消息
}
var Diag10Req = function(num){
::PostThreadMessage(thrdId,111,num,0)//自定义消息
}
var DiagBootReq = function(){
::PostThreadMessage(thrdId,102,0,0)//自定义消息
}
var DiagStopReq = function(){
::PostThreadMessage(thrdId,103,0,0)//自定义消息
}
mainForm.btnReadSw.oncommand = function(id,event){
DiagReadDID(0xF195);
}
mainForm.btnReadHw.oncommand = function(id,event){
DiagReadDID(0xF193);
}
mainForm.btnReadF186.oncommand = function(id,event){
DiagReadDID(0xF186);
}
mainForm.btnTest.oncommand = function(id,event){
DiagStopReq();
}
mainForm.btnFlash.oncommand = function(id,event){
if(io.exist(mainForm.edFile.text) == null){
Display("请打开烧写文件");
return;
}
if(io.exist(mainForm.edFile2.text) == null){
Display("请打开flashdriver文件");
return;
}
if(flag_connected == 0){
Display("请连接设备");
return;
}
if(bootstate == true){
return ;
}
bootstate = true;
mainForm.edit.text = "";
Display("开始刷写流程");
starttime = time.now();
//timer_bootcount.enable();
boot_count = 0;
DiagBootReq();
}
mainForm.btnOpen.oncommand = function(id,event){
::PostThreadMessage(thrdId,104,2,0)//自定义消息-打开文件
}
//程序关闭
mainForm.onClose = function(hwnd,message,wParam,lParam){
if(thrdId != null){
::PostThreadMessage(thrdId,105,0,0)//自定义消息
thread.waitClose(thrdHandle);
}
//PLinHw.isConnected()///待完善
//console.print("线程已关闭")
//console.pause()
}
mainForm.btnReadF191.oncommand = function(id,event){
DiagReadDID(0xF191);
}
mainForm.btnReadF199.oncommand = function(id,event){
DiagReadDID(0xF180);
}
mainForm.btnOpenFlashdrv.oncommand = function(id,event){
::PostThreadMessage(thrdId,104,1,0)//自定义消息-打开flashdriver
}
thrdHandle,thrdId = thread.create( CanThread )
mainForm.onClose = function(hwnd,message,wParam,lParam){
raw.closehandle(thrdHandle);
//frmChild.close();
}
mainForm.btnReadF189.oncommand = function(id,event){
DiagReadDID(0xF189);
}
mainForm.show();
return win.loopMessage();

BIN
CAN_Bootloader/res/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -0,0 +1,316 @@
import usb2canfd;
import thread.command;
import win.timer;
//初始化CAN句柄对象
CANHw = usb2canfd.USB2CANHW();
CANHw.LoadDll();
DiagReqID = 0x732;//0x18dadff1;
DiagRespID = 0x7B2;//0x18daf1df;
DiagGloableID = 0x7DF;//0x18DB33F1;
stopflag = 0;
write2Etest = function(did){
select(did) {
case 0xF010 {
var data = {1,2,3,4, 0,0,0,0, 0,0,0,0, 0,0,0,0,};
FuncReq2E(did,data);
}
case 0xF101 {
var data = {1,2,3,4, 0,0,0,0, };
FuncReq2E(did,data);
}
}
}
//注册一个消息钩子函数
FuncLoopMsg = function(msg){
select(msg.message) {
case 100 {//刷新硬件
FuncFreshHw();
}
case 101 {//连接硬件
//console.log("msg.wParam = " + msg.wParam);
//console.log("msg.lParam = " + msg.lParam);
FuncConnect(msg.wParam,msg.lParam);
}
case 102 {//开始boot
FuncStartBoot();
}
case 103 {//停止boot
FuncStopBoot();
}
case 104 {//打开s19文件
if(msg.wParam == 1){
FuncDisplay("打开FlashDriver");
var ret = FuncOpenS19File(msg.wParam);
if(ret != null){
thread.command.$ShowFlashDrvPath(ret);
var crc32 = FuncGetFlashCRC(1);
FuncDisplay("CRC = " ++ string.format("%X",crc32));
}
}
else {
FuncDisplay("打开烧写文件");
var ret = FuncOpenS19File(msg.wParam);
if(ret != null){
thread.command.$ShowPath(ret);
var crc32 = FuncGetFlashCRC(2);
FuncDisplay("CRC = " ++ string.format("%X",crc32));
}
}
}
case 105 {//停止boot
thread.stop(0);
}
case 110 {//readDID
FuncReadDID(msg.wParam);
}
case 111 {
FuncReq10(msg.wParam,msg.lParam);
}
case 112 {
FuncReq28(msg.wParam);
}
case 113 {
FuncReq85(msg.wParam);
}
case 114 {
FuncReq27(msg.wParam);
}
case 115 {
write2Etest(msg.wParam)
}
case 120 {
win.quitMessage()
}
else {
}
}
}
var delay_const = 100000;
DelayTest = function(){
import time.performance;
var tk = time.performance.tick();
for(i=1;1000000;1)
{
}
var tk2 = time.performance.tick();
tk2 = tk2 - tk;
delay_const = math.ceil(1000000*(1/tk2));
FuncDisplay(delay_const);
//console.log(delay_const);
}
FuncFreshHw = function(){
var hwnum = CANHw.FlashHw();
if(hwnum == 0){
//mainForm.cbbDev.text = "未找到硬件"
}
else {
FuncDisplay("找到硬件")
}
}
FuncConnect = function(dev,chn){
var canfd = (chn&0x80)==0x80?true:false;
var ret = CANHw.OpenDevice(dev,chn&0x7f,canfd);
if(ret == 0){
FuncDisplay("连接成功");
thread.command.$Connected();
}
else {
FuncDisplay("连接失败");
}
}
FuncDisplay = function(str){
thread.command.$Display(str);//"线程" +
}
loadcodex("\user\Diag10code.aardio");
loadcodex("\user\Diag11code.aardio");
loadcodex("\user\Diag22code.aardio");
loadcodex("\user\Diag27code.aardio");
loadcodex("\user\Diag2Ecode.aardio");
loadcodex("\user\Diag28code.aardio");
loadcodex("\user\Diag31code.aardio");
loadcodex("\user\Diag34code.aardio");
loadcodex("\user\Diag36code.aardio");
loadcodex("\user\Diag37code.aardio");
loadcodex("\user\Diag7Fcode.aardio");
loadcodex("\user\Diag85code.aardio");
loadcodex("\user\DiagBootcode.aardio");
loadcodex("\user\S19Decode.aardio");
RespState = 0;
FuncDiagPro = function(diagmsg){
select(diagmsg.sid) {
case 0x50 {
FuncDiag10Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x62 {
FuncDiag22Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x67 {
FuncDiag27Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x74 {
FuncDiag34Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x71 {
FuncDiag31Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x76 {
FuncDiag36Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x68 {
FuncDiag28Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0xC5 {
FuncDiag85Pro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x7F {
FuncDiag7FPro(table.slice(diagmsg.data,1,diagmsg.len))
}
case 0x6E {
FuncDiag2EPro(table.slice(diagmsg.data,1,diagmsg.len))
}
else {
}
}
RespState = diagmsg.sid;
}
FuncStartBoot = function(){
FuncInitBootState();
boottimer.enable();
FuncDisplay("开始刷写");
stopflag = 0;
}
var delay = function(w){
delaytime = w*delay_const;
for(i=1;delaytime;1)
{
}
}
var PackNext = 0x21;
var Packdata = {};
var PackID = 0;
var FuncSendPackage = function(){
while(#Packdata > 0)
{
//sleep(1);
delay(0.1);
var data = {PackNext,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC};
var max = #Packdata > 7 ? 7 : #Packdata;
for(i=1;max;1){
data[i+1] = table.remove(Packdata);
}
//sleep(0.3);
CANHw.SendMsg(PackID,data);
PackNext += 1;
if(PackNext > 0x2f){
PackNext = 0x20;
}
}
}
FuncPushPackage = function(ID,data){
PackNext = 0x21;
Packdata = data;
PackID = ID;
}
boottimer = win.timer(,10);
boottimer.onTimer = function(){
if(CANHw.isConnected() == false){
boottimer.disable();
return;
}
FuncBootSeq();
}
timer1 = win.timer(,1);
diagresp = {}
timer1.onTimer = function(){
if(CANHw.isConnected() == false){
return;
}
ret = CANHw.GetMsg();
for(i=1;#ret;1){
//console.log("id = " + tostring(ret[i].id))
if(ret[i].id & 0x7FFFFFFF == DiagRespID){
if(ret[i].data[1] == 0x10){//首帧
var data = {0x30,0x00,0x14,0x00,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
diagresp["sid"] = ret[i].data[3];
diagresp["len"] = ret[i].data[2]-1;
diagresp["data"] = {};
diagresp["next"] = 0x21;
table.append(diagresp["data"],table.slice(ret[i].data,4));
}
elseif(ret[i].data[1] <= 0x07){//单帧
//console.dumpJson()
diagresp["sid"] = ret[i].data[2];
diagresp["len"] = ret[i].data[1]-1;
diagresp["data"] = table.slice(ret[i].data,3);
FuncDiagPro(diagresp);
}
elseif(ret[i].data[1] >= 0x21 && ret[i].data[1] <= 0x2f){
if(ret[i].data[1] == diagresp["next"]){//多帧
diagresp["next"] += 1;
if(diagresp["next"] >= 0x2F){
diagresp["next"] = 0x20;
}
table.append(diagresp["data"],table.slice(ret[i].data,2));
if(#diagresp["data"] >= diagresp["len"]){
FuncDiagPro(diagresp);
}
}
}
elseif(ret[i].data[1] == 0x30){//
FuncSendPackage();
}
}
else {
//console.varDump(ret[i].id);
//显示报文
}
}
}
timer1.enable();
FuncDisplay("正在运行");
DelayTest();

View File

@ -0,0 +1,33 @@
//发送
FuncReq10 = function(Addr,num){
if(num >= 1 && num <= 3){
var data = {0x02,0x10,num,0,0,0,0,0};
if(Addr == true){
CANHw.SendMsg(DiagGloableID,data);
}
else {
CANHw.SendMsg(DiagReqID,data);
}
}
}
//接收
FuncDiag10Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 1 {
FuncDisplay("进入默认会话成功")
}
case 2 {
FuncDisplay("进入编程会话成功")
}
case 3 {
FuncDisplay("进入扩展会话成功")
}
else {
}
}
}

View File

@ -0,0 +1,9 @@
//发送
FuncReq11 = function(num){
var txdata = {0x2,0x11,num,0x00,0x00,0x00,0x00,0x00};
CANHw.SendMsg(DiagReqID,txdata);
}
//接收
FuncDiag11Pro = function(data){
FuncDisplay("复位成功")
}

View File

@ -0,0 +1,144 @@
var diag22state = 0;
//发送
FuncReadDID = function(did){
if(CANHw.isConnected() == false){
return;
}
var data = {0x03,0x22,did>>8,did&0xff,0,0,0,0};
var ret = CANHw.SendMsg(DiagReqID,data);
diag22state = 1;
//console.log("did = " + tostring(did,16));
//console.log("ret = " + ret);
//FuncDisplay("did = " + tostring(did,16));
}
//接收
FuncDiag22Pro = function(data){
//console.log("诊断22服务")
if(#data < 3){
return;
}
var did = (data[1]<<8) + data[2];
select(did) {
case 0xF186 {
FuncDisplay("当前会话: " + data[3]);
}
case 0xF193 {
FuncDisplay("硬件版本号");
FuncDisplay(string.str(string.pack(table.slice(data,3))));
}
case 0xF195 {
FuncDisplay("软件版本号");
FuncDisplay(string.str(string.pack(table.slice(data,3))));
}
case 0xF191 {
FuncDisplay("bootloader版本号");
FuncDisplay(string.str(string.pack(table.slice(data,3))));
}
case 0xF198 {
FuncDisplay("repair_shopcode");
FuncDisplay(string.str(string.pack(table.slice(data,3))));
}
case 0xF199 {
FuncDisplay("installation_date");
FuncDisplay(string.format("%x%X%x%x",data[3],data[4],data[5],data[6]));
}
case 0xF187 {
FuncDisplay("车辆备用零部件编号");
FuncDisplay(string.pack(table.slice(data,3)));
}
case 0xF189 {
FuncDisplay("编译时间");
FuncDisplay(string.str(string.pack(table.slice(data,3))));
}
case 0xF18A {
FuncDisplay("系统供应商公司名称代码");
FuncDisplay(string.pack(table.slice(data,3)));
}
case 0xF180 {
FuncDisplay("ECU 系统名称");
FuncDisplay(string.str(string.pack(table.slice(data,3))));
}
case 0x1701 {
var 水平 = (data[3]<<8) + (data[4]);
var 靠背 = (data[5]<<8) + (data[6]);
FuncDisplay("水平当前位置: " ++ (水平-0x8000) );
FuncDisplay("靠背当前位置" ++ (靠背 - 0x8000) );
}
case 0x1702 {
if(#data < 10){
FuncDisplay("DID-0x1702长度错误")
return;
}
var 水平1 = (data[3]<<8) + (data[4]);
var 水平2 = (data[5]<<8) + (data[6]);
var 靠背1 = (data[7]<<8) + (data[8]);
var 靠背2 = (data[9]<<8) + (data[10]);
FuncDisplay("水平1: " + (水平1-0x8000) + "水平2: " + (水平2-0x8000));
FuncDisplay("靠背1: " + (靠背1-0x8000) + "靠背2: " + (靠背2-0x8000));
FuncDisplay("水平1: " + (水平1) + "水平2: " + (水平2));
FuncDisplay("靠背1: " + (靠背1) + "靠背2: " + (靠背2));
}
case 0x1706 {
var 水平 = data[3]&0x01;
var 靠背 = (data[3]>>1)&0x01;
FuncDisplay("座椅水平方向电机学习状态: " + 水平);
FuncDisplay("座椅靠背方向电机学习状态" + 靠背);
}
case 0x1707 {
var 电流 = (data[3]<<8) + data[4];
FuncDisplay("电流: " + tostring(电流));
}
case 0x1708 {
FuncDisplay("输入状态: ");
var 座椅向前 = data[3]&0x01;
var 座椅向后 = (data[3]>>1)&0x01;
var 靠背向前 = (data[3]>>2)&0x01;
var 靠背向后 = (data[3]>>3)&0x01;
var 快进按键 = (data[3]>>4)&0x01;
var 快出按键 = (data[3]>>5)&0x01;
var 锁扣状态 = (data[3]>>6)&0x01;
var 坐人状态 = (data[3]>>7)&0x01;
FuncDisplay("座椅向前: " + 座椅向前);
FuncDisplay("座椅向后: " + 座椅向后);
FuncDisplay("靠背向前: " + 靠背向前);
FuncDisplay("靠背向后: " + 靠背向后);
FuncDisplay("快进按键: " + 快进按键);
FuncDisplay("快出按键: " + 快出按键);
FuncDisplay("锁扣状态: " + 锁扣状态);
FuncDisplay("坐人状态: " + 坐人状态);
}
case 0x1709 {
FuncDisplay("输出状态: ");
var 座椅向前 = data[3]&0x01;
var 座椅向后 = (data[3]>>1)&0x01;
var 靠背向前 = (data[3]>>2)&0x01;
var 靠背向后 = (data[3]>>3)&0x01;
var 快进按键 = (data[3]>>4)&0x01;
var 快出按键 = (data[3]>>5)&0x01;
FuncDisplay("座椅向前: " + 座椅向前);
FuncDisplay("座椅向后: " + 座椅向后);
FuncDisplay("靠背向前: " + 靠背向前);
FuncDisplay("靠背向后: " + 靠背向后);
FuncDisplay("快进输出: " + 快进按键);
FuncDisplay("快出输出: " + 快进按键);
}
case 0x170B {
var 系统供电电压 = data[3]/10;
FuncDisplay("系统供电电压: " + tostring(系统供电电压) + " V");
}
else {
FuncDisplay("未知DID - " + tostring(did,16));
}
}
}

View File

@ -0,0 +1,78 @@
var SecuretySeed = {0,0,0,0,};
var SecuretyKey = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
var lockstate = 0;
//发送
FuncReq27 = function(num,key){
if(num >= 1 && num <= 0x1C){
if(key == null){
var data = {0x02,0x27,num,0,0,0,0,0};
CANHw.SendMsg(DiagReqID,data);
}
else {
if(#key > 4){
var data = {0x10,0X12,0x27,num,key[1],key[2],key[3],key[4]};
CANHw.SendMsg(DiagReqID,data);
FuncPushPackage(DiagReqID,table.slice(key,5));
}
else {
var data = {0x06,0x27,num,key[1],key[2],key[3],key[4],0x00};
CANHw.SendMsg(DiagReqID,data);
}
}
}
else {
FuncDisplay("27长度错误");
}
}
//loadcodex("\user\securety.aardio");
loadcodex("\user\GeelySecurety.aardio");
//接收
FuncDiag27Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 1,3,5,7,9,11,0x11 {
var str = "收到种子";
for(i=1;4;1){
SecuretySeed[i] = data[i+1];
str += " " + tostring(SecuretySeed[i],16);
lockstate = 1;
}
FuncDisplay(str)
SecuretyKey = securetyKeyCalc(SecuretySeed,data[1]);
if(#SecuretyKey >= 4){
FuncReq27(data[1]+1,SecuretyKey);
var str = "计算密钥-";
for(i=1;4;1){
str += " " + tostring(SecuretyKey[i],16);
}
FuncDisplay(str);
}
else {
FuncDisplay("计算失败");
}
}
case 2,4,6,8,10,12,0x12 {
FuncDisplay("解锁成功");
lockstate = 2;
}
else {
FuncDisplay("27服务未知子服务");
}
}
}
FuncDiag27GetState = function(){
if(lockstate == 2){
return 0;
}
else {
return 1;
}
}

View File

@ -0,0 +1,27 @@
//发送
FuncReq28 = function(num1,num2){
var txdata = {0x03,0x28,num1,num2,0,0,0,0};
var ret = CANHw.SendMsg(DiagGloableID,txdata);
}
//接收
FuncDiag28Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 0 {
FuncDisplay("使能接收发送")
}
case 1 {
FuncDisplay("使能接收,禁止发送")
}
case 2 {
FuncDisplay("禁止接收,使能发送")
}
case 3 {
FuncDisplay("禁止接收发送")
}
else {
}
}
}

View File

@ -0,0 +1,43 @@
var diag22state = 0;
//发送
FuncDIDWriteStr = function(did,str){
var data = {}
for(i=1;string.len(str);1){
data[i] = string.unpack(str,i);
}
FuncReq2E(did,data)
return data;
}
//FuncDIDWriteStr(0xf198,"0123456789abcdef1234");
FuncReq2E = function(did,data){
if(CANHw.isConnected() == false){
return;
}
if(#data > 4){
//多帧
var txdata = {0x10,3+#data,0x2E,did>>8,did&0xff,data[1],data[2],data[3]};
CANHw.SendMsg(DiagReqID,txdata);
//等待发送
FuncPushPackage(DiagReqID,table.slice(data,3));
}
else {
var txdata = {3+#data,0x2E,did>>8,did&0xff,0,0,0,0};
for(i=1;#data;1){
txdata[4+i] = data[i];
}
CANHw.SendMsg(DiagReqID,txdata);
}
}
//接收
FuncDiag2EPro = function(data){
var did = (data[1]<<8) + data[2];
FuncDisplay("写入" + tostring(did,16) + "成功");
}

View File

@ -0,0 +1,82 @@
FuncReq31EraseFlash = function(addr,len){
FuncDisplay("开始擦除数据")
var data = {0xfd,0x01,0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len};
FuncReq31(data);
}
FuncReq31CheckLogicBlock = function(crc){//(addr,len)
//var data = {0x02,0x02,0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len};
var data = {0x02,0x02,crc>>24,crc>>16,crc>>8,crc};
FuncReq31(data);
}
FuncReq31CheckPD = function(){//Programming Dependencies
var data = {0xFF,0x01};
FuncReq31(data);
}
FuncReq31CheckFlash = function(){
var data = {0x02,0x02};
FuncReq31(data);
}
FuncReq3103 = function(id){
//停止例程
var txdata = {0x04,0x31,0x03,id>>8,id&0xff,0x00,0x00,0x00};
CANHw.SendMsg(DiagReqID,txdata);
}
FuncReq3101FD02 = function(){
var txdata = {0x04,0x31,0x01,0xfd,0x02,0x00,0x00,0x00};
CANHw.SendMsg(DiagReqID,txdata);
}
FuncReq3101FD03 = function(){
var txdata = {0x04,0x31,0x01,0xfd,0x03,0x00,0x00,0x00};
CANHw.SendMsg(DiagReqID,txdata);
}
//发送
FuncReq31 = function(data){
if(#data > 5){//多帧
var txdata = {0x10,2+#data,0x31,0x01,data[1],data[2],data[3],data[4]};
CANHw.SendMsg(DiagReqID,txdata);
FuncPushPackage(DiagReqID,table.slice(data,5));
}
else {
var txdata = {2+#data,0x31,0x01,0, 0,0,0,0};
for(i=1;#data;1){
txdata[3+i] = data[i];
}
CANHw.SendMsg(DiagReqID,txdata);
}
}
//接收
FuncDiag31Pro = function(data){
//console.dumpJson(data);
if(#data < 3){
//FuncDisplay("31长度错误");
return;
}
var rid = (data[2]<<8) + data[3];
select(rid) {
case 0xFD01 {
FuncDisplay("擦除成功")
}
case 0xFD02 {
FuncDisplay("flash driver校验成功")
}
case 0x0202 {
FuncDisplay("校验成功")
}
case 0xFF01 {
FuncDisplay("检查标志成功")
}
case 0xF518 {
FuncDisplay("数字签名错误")
}
else {
}
}
}

View File

@ -0,0 +1,29 @@
//发送
FuncReq34 = function(addr,len){
var data = {0x44,addr>>24,addr>>16,addr>>8,addr,len>>24,len>>16,len>>8,len};
var txdata = {0x10,2+#data,0x34,0x00,data[1],data[2],data[3],data[4]};
CANHw.SendMsg(DiagReqID,txdata);
FuncPushPackage(DiagReqID,table.slice(data,5));
}
var maxlen = 0;
//接收
FuncDiag34Pro = function(data){
//console.dumpJson(data);
FuncDisplay("请求下载成功")
maxlen = (data[2]<<8) + data[3];
FuncDisplay("最大长度:" + maxlen);
}
FuncGetSengLen = function(){
if(maxlen>2){
return maxlen-2;
}
else {
return 0;
}
}

View File

@ -0,0 +1,68 @@
//
var blocknum=1;
var flag_sendend = false;
var flag_sending = false;
var alldata = {};
FuncStartSendBlock = function(data){
blocknum = 0x01;
flag_sendend = false;
flag_sending = true;
alldata = data;
}
FuncStopSendBlock = function(data){
blocknum = 0x01;
flag_sendend = false;
flag_sending = false;
}
FuncGetSendStatus = function(){
return flag_sendend;
}
FuncSendNextBlock = function(){
var len = FuncGetSengLen();
if(#alldata>=len){
FuncReq36(blocknum,table.slice(alldata,1,len));
alldata = table.slice(alldata,len+1,)
}
else {
FuncReq36(blocknum,alldata);
//console.dumpJson(#alldata);
//FuncDisplay("len = " ++ len);
//FuncDisplay("#alldata = " ++ #alldata);
alldata = {};
flag_sendend = true;
}
blocknum += 1;
}
//发送
FuncReq36 = function(num,data){
len = #data+2;
if(len > 7){
var txdata = {0x10+(len>>8),len&0xff,0x36,num&0xff,data[1],data[2],data[3],data[4]};
CANHw.SendMsg(DiagReqID,txdata);
FuncPushPackage(DiagReqID,table.slice(data,5));
}
else {
var txdata = {len,0x36,num&0xff,0, 0,0,0,0};
for(i=1;#data;1){
txdata[i+3] = data[i];
}
CANHw.SendMsg(DiagReqID,txdata);
}
}
//接收
FuncDiag36Pro = function(data){
//console.dumpJson(data);
/*
if(data[1] == blocknum){
blocknum += 1;
if(flag_sending == true){
FuncSendNextBlock();
}
}
*/
}

View File

@ -0,0 +1,9 @@
//发送
FuncReq37 = function(){
var txdata = {0x1,0x37,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
CANHw.SendMsg(DiagReqID,txdata);
}
//接收
FuncDiag37Pro = function(data){
}

View File

@ -0,0 +1,46 @@
var errSID=0,errNRC=0;
FuncGetNrc = function(){
return errSID,errNRC;
}
FuncClrNrc = function(){
//return errSID,errNRC;
errSID = 0;
errNRC = 0;
}
var TableToStr = function(data){
if(data == null){
return " ";
}
if(#data == 0){
return " ";
}
var str = "data:"
for(i=1;#data;1){
str += " "
str += tostring(data[i],16);
}
return str;
}
//接收
FuncDiag7FPro = function(data){
//console.dumpJson(data);
errSID = data[1];
errNRC = data[2];
select(errNRC) {
case 0x78 {
if(errSID != 0x36){
FuncDisplay("服务正忙")
}
}
else {
FuncDisplay("SID:" + tostring(errSID,16))
FuncDisplay("错误 - NRC:" + tostring(errNRC,16))
FuncDisplay(TableToStr(data));
}
}
}

View File

@ -0,0 +1,27 @@
//发送
FuncReq85 = function(num){
if(num >= 1 && num <= 3){
var data = {0x02,0x85,num,0,0,0,0,0};
CANHw.SendMsg(DiagGloableID,data);
}
}
//接收
FuncDiag85Pro = function(data){
//console.dumpJson(data);
select(data[1]) {
case 0x01 {
FuncDisplay("DTC开启")
}
case 0x02 {
FuncDisplay("DTC禁能")
}
case 3 {
FuncDisplay("DTC - 01")
}
else {
FuncDisplay("DTC - TDB")
}
}
}

View File

@ -0,0 +1,497 @@
var bootstate = 0;
var bootcount = 0;
var sendstate = 0;
FuncWait = function(sid){
if(RespState == (sid + 0x40)){//正响应
//bootcount = 0;
return 0;
}
errsid,errnrc = FuncGetNrc();
FuncClrNrc();
if(errsid == sid){
if(errnrc == 0x78){//等待
bootcount = 0;
return 0xff;
}
else {
FuncDisplay("刷写错误 步骤" + bootstate);
boottimer.disable();
thread.command.$SendEnd(false);
return 1; //负响应
}
}
if(stopflag == 1){
FuncDisplay("停止");
boottimer.disable();
thread.command.$SendEnd(false);
return 2;//停止命令
}
bootcount += 1;
/*
if(bootcount > 20 && sid == 0x36){
bootcount = 0;
return 0;
}
*/
if(bootcount >= 400){
FuncDisplay("步骤" + bootstate + "超时 " + tostring(sid,16));
thread.command.$SendEnd(false);
boottimer.disable();
return 3;//超时
}
}
FuncStopBoot = function(){
stopflag = 1;
}
FuncClearState = function(){
RespState = 0;
bootcount = 0;
sendstate = 1;
}
FuncInitBootState = function(){
bootstate = 0;
RespState = 0;
bootcount = 0;
sendstate = 0;
}
BCD_Conv = function(num){
if(num > 99){
return 0;
}
var ret = 0;
ret += math.floor(num/10) * 16;
ret += num%10;
return ret;
}
var sendblockstate = 0;
var alldata = {};
var blocknum = 1;
var alldata_blocknum = 0;
var block_sended = 0;
var sendFlashDriverState = 0;
var FuncSendBlockApp_sendflag = 0;
var nowid=0;
FuncSendBlockInit = function(id){
var len = 0;
alldata = FuncGetAllData(id);
blocknum = 1;
if(alldata == null){
FuncDisplay("错误:空数据");
alldata_blocknum = 0;
sendblockstate = 0xff;
return 1;
}
for(i=1;#alldata;1){
len += math.ceil(#alldata[i]["data"] / FuncGetSengLen())
}
alldata_blocknum = len;
block_sended = 0;
sendblockstate = 0;
FuncSendBlockApp_sendflag = 0;
nowid = id;
//console.log("发送数据初始化")
return 0;
}
nextstate = function(val){
if(val == 0){
bootstate += 1;
sendstate = 0;
block_sended += 1;
}
}
FuncSendBlockApp = function(){
select(sendblockstate) {
case 0{
if(FuncSendBlockApp_sendflag == 0){
FuncReq34(alldata[blocknum]["address"],#alldata[blocknum]["data"]);
FuncSendBlockApp_sendflag = 1;
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x34) == 0){
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
}
}
}
case 1 {
FuncStartSendBlock(alldata[blocknum]["data"]);//初始化
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
//console.log('#alldata[blocknum]["data"]');
//console.log(#alldata[blocknum]["data"]);
}
case 2 {
if(FuncSendBlockApp_sendflag == 0){
FuncSendNextBlock();
FuncSendBlockApp_sendflag = 1;
block_sended += 1;
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x36) == 0){
FuncSendBlockApp_sendflag = 0;
if(FuncGetSendStatus() == true){//所有块发送完成
sendblockstate += 1;
if(nowid == 1){
sendblockstate += 1;
}
}
}
}
}
case 3 {
if(FuncSendBlockApp_sendflag == 0){
FuncReq37();
FuncSendBlockApp_sendflag = 1;
RespState = 0;
bootcount = 0;
}
else {
if(FuncWait(0x37) == 0){
FuncSendBlockApp_sendflag = 0;
sendblockstate += 1;
}
}
}
else {
if(blocknum < #alldata){
blocknum += 1;
sendblockstate = 0;
}
else {
//所有数据发送完成
return 0;
}
}
}
return 1;
}
FuncSendBlockFlashDriver = function(){
select(sendFlashDriverState) {
case 0 {
}
case 1 {
}
case 2 {
}
case 3 {
}
else {
}
}
}
var delaycount = 0;
//boot总流程
var boottime = 0;
FuncBootSeq = function(){
boottime++;
select(bootstate) {
case 0 {
boottime = 1;
if(sendstate == 0){
//FuncSendBlockInit(0);
FuncReadDID(0xF186);
FuncClearState();
}
else {
var ret = FuncWait(0x22);
nextstate(0);
}
}
case 1 {
if(sendstate == 0){
FuncReadDID(0xF195);//读取软件版本
FuncClearState();
}
else {
//var ret = FuncWait(0x22);
nextstate(0);
}
}
case 2 {
if(sendstate == 0){
FuncReadDID(0xF193);//读取硬件版本
FuncClearState();
}
else {
//var ret = FuncWait(0x22);
nextstate(0);
}
}
case 3 {
if(sendstate == 0){
FuncReq10(true,0x03);//进入扩展会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
case 4 {
if(sendstate == 0){
FuncReq85(0x02);//关闭DTC
FuncClearState();
}
else {
var ret = FuncWait(0x85);
nextstate(ret);
}
}
case 5 {
if(sendstate == 0){
FuncReq28(0x01,0x01);//禁止发送
FuncClearState();
}
else {
var ret = FuncWait(0x28);
nextstate(0);
}
}
case 6 {
if(sendstate == 0){
FuncReq10(false,0x02);//进入编程会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
case 7 {
if(sendstate == 0){//等待复位完成
delaycount = 0;
FuncClearState();
}
else {
delaycount += 1;
if(delaycount > 20){
nextstate(0);//延时1S
}
}
}
case 8 {
if(sendstate == 0){
FuncReq27(0x09);//解密
FuncClearState();
}
else {
var ret = FuncWait(0x27);
nextstate(ret);
}
}
case 9 {
if(sendstate == 0){
//FuncReq27(02);//发送key
FuncClearState();
FuncDisplay("等待解锁");
}
else {
//var ret = FuncWait(0x27);
var ret = FuncDiag27GetState();
nextstate(ret);
}
}
case 10 {
if(sendstate == 0){
FuncReq31EraseFlash(0x1FFFF000,0x1000);
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 11 {
if(sendstate == 0){//写入installation_date
FuncReq3103(0xFD01);
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 12 {
if(sendstate == 0){//发送数据
FuncSendBlockInit(1);
FuncDisplay("开始发送FlashDrv数据");
FuncClearState();
}
else {
var ret = FuncSendBlockApp();
nextstate(ret);
}
}
case 13 {
if(sendstate == 0){//CheckLogicBlock
//var crc = FuncGetFlashCRC(0);
//FuncReq31CheckLogicBlock(crc);
FuncReq3101FD02();
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 14 {
if(sendstate == 0){//
FuncReq3103(0xFD02);
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 15 {
if(sendstate == 0){//CheckLogicBlock
FuncReq31EraseFlash(0x00010000,0x70000);
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 16 {
if(sendstate == 0){//发送数据
FuncSendBlockInit(2);
FuncDisplay("开始发送App数据");
FuncClearState();
}
else {
var ret = FuncSendBlockApp();
nextstate(ret);
}
}
case 17 {
if(sendstate == 0){//CheckLogicBlock
FuncReq3101FD03();
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 18 {
if(sendstate == 0){////Programming Dependencies
FuncReq3103(0xFD03);
FuncClearState();
}
else {
var ret = FuncWait(0x31);
nextstate(ret);
}
}
case 19 {
if(sendstate == 0){//等待复位完成
delaycount = 0;
FuncClearState();
}
else {
delaycount += 1;
if(delaycount > 100){
nextstate(0);//延时1S
}
}
}
case 20 {
if(sendstate == 0){//复位
FuncClearState();
FuncReq11(0x03);
}
else {
var ret = FuncWait(0x11);
nextstate(ret);
}
}
case 21 {
if(sendstate == 0){//等待复位完成
delaycount = 0;
FuncClearState();
}
else {
delaycount += 1;
if(delaycount > 200){
nextstate(0);//延时1S
}
}
}
case 22 {
if(sendstate == 0){
FuncReq10(true,0x03);//进入扩展会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
case 23 {
if(sendstate == 0){
FuncReq28(0x00,0x01);//开启发送
FuncClearState();
}
else {
var ret = FuncWait(0x28);
nextstate(ret);
}
}
case 24 {
if(sendstate == 0){
FuncReq85(0x01);//开启DTC
FuncClearState();
}
else {
var ret = FuncWait(0x85);
nextstate(ret);
}
}
case 25 {
if(sendstate == 0){
FuncReq10(true,0x01);//进入默认会话
FuncClearState();
}
else {
var ret = FuncWait(0x10);
nextstate(ret);
}
}
else {
thread.command.$SendEnd(true);
//FuncDisplay("刷写完成,用时 " + boottime/100 + " S")
boottimer.disable();
}
}
if(alldata_blocknum != 0){
thread.command.$SetProgress(block_sended/alldata_blocknum * 100);
}
}

View File

@ -0,0 +1,99 @@
xorArray = {0xAA,0x50,0x43,0x52}
securetyKeyCalc = function(pucSeed,ucSecurityLevel){
//SeedSec_t cal,key,seed;
var seed = {0,0,0,0};
var key = {0,0,0,0};
var cal = {0,0,0,0};
seed[1]=pucSeed[4];
seed[2]=pucSeed[3];
seed[3]=pucSeed[2];
seed[4]=pucSeed[1];
select(ucSecurityLevel) {
case 0x01 {
var dll = raw.loadDll("/DM_RP_SA.dll",,"cdecl" );
if(dll != null){
FuncDisplay("加载密钥dll成功");
var retlen = raw.buffer(4,0);
var seedraw = raw.buffer(4,0);
var iVariant = raw.buffer(20,0);
var keyraw = raw.buffer(4,0);
seedraw[1] = pucSeed[1];
seedraw[2] = pucSeed[2];
seedraw[3] = pucSeed[3];
seedraw[4] = pucSeed[4];
var ret = 0;
ret = dll.GenerateKeyEx(seedraw,4,0x01,iVariant,keyraw,4,retlen);
FuncDisplay("ret = " ++ ret );
key[1] = keyraw[1];
key[2] = keyraw[2];
key[3] = keyraw[3];
key[4] = keyraw[4];
return key;
}
else {
FuncDisplay("加载密钥dll失败");
}
}
case 0x09 {
var dll = raw.loadDll("/DM_RP_SA.dll",,"cdecl" );
if(dll != null){
FuncDisplay("加载密钥dll成功");
var retlen = raw.buffer(4,0);
var seedraw = raw.buffer(4,0);
var iVariant = raw.buffer(20,0);
var keyraw = raw.buffer(4,0);
seedraw[1] = pucSeed[1];
seedraw[2] = pucSeed[2];
seedraw[3] = pucSeed[3];
seedraw[4] = pucSeed[4];
var ret = 0;
ret = dll.GenerateKeyEx(seedraw,4,0x09,iVariant,keyraw,4,retlen);
FuncDisplay("ret = " ++ ret );
key[1] = keyraw[1];
key[2] = keyraw[2];
key[3] = keyraw[3];
key[4] = keyraw[4];
return key;
}
else {
FuncDisplay("加载密钥dll失败");
}
}
case 0x11 {
/*
cal.byte[0] = seed.byte[0]^xorArray[0];
cal.byte[1] = seed.byte[1]^xorArray[1];
cal.byte[2] = seed.byte[2]^xorArray[2];
cal.byte[3] = seed.byte[3]^xorArray[3];
key.byte[3] = ((cal.byte[1]&0x03)<<6)|(( cal.byte[0]&0xFC)>>2);
key.byte[2] = ((cal.byte[0]&0x03)<<6)|(cal.byte[3]&0x3F);
key.byte[1] = (cal.byte[3]&0xFC)|((cal.byte[2]&0xC0)>>6);
key.byte[0] = (cal.byte[2]&0xFC)|(cal.byte[1]&0x03);
*/
cal[1] = seed[1]^xorArray[1];
cal[2] = seed[2]^xorArray[2];
cal[3] = seed[3]^xorArray[3];
cal[4] = seed[4]^xorArray[4];
key[4] = ((cal[2]&0x03)<<6)|(( cal[1]&0xFC)>>2);
key[3] = ((cal[1]&0x03)<<6)|(cal[4]&0x3F);
key[2] = (cal[4]&0xFC)|((cal[3]&0xC0)>>6);
key[1] = (cal[3]&0xFC)|(cal[2]&0x03);
}
else {
}
}
var pucKey = {0,0,0,0};
pucKey[1]=key[4];
pucKey[2]=key[3];
pucKey[3]=key[2];
pucKey[4]=key[1];
return pucKey;
}

View File

@ -0,0 +1,199 @@
var Crc32Tble =
{
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
var fileinfo = "";
var FlashData = {};
var AllData = {}
FuncGetAllData = function(id){
if(id > #AllData){
return null;
}
return AllData[id];
}
FuncGetFileInfo = function(){
return fileinfo;
}
FuncCRC32Calc = function(Data){
var usCRC = 0xFFFFFFFF;
for(i=1;#Data;1){
var temp = (usCRC ^ Data[i]) & 0xFF;
usCRC = ((usCRC >> 8)&0xffffff) ^ Crc32Tble[temp+1];
}
usCRC ^= 0xFFFFFFFF;
return usCRC;
}
FuncGetFlashCRC = function(id){
var Data = AllData[id];
var crc = FuncCRC32Calc(Data[1].data);
return crc;
}
var s19crc = {};
FuncOpenS19File = function(id,path){
import fsys.dlg;
if(path == null){
path = fsys.dlg.open('S19文件|*.sx;*.s19;*.srec|所有文件|*.*||',,,winform);
}
if(io.exist( path )){
//winform.editPath.text = path;
var readbuf = string.load(path);
readbuf = string.split(readbuf,'\r\n');
//console.dumpJson(readbuf);
var block = null;
FlashData = {};
for(i=1;#readbuf;1){
if(#readbuf[i] == 0){
continue;
}
var str = readbuf[i];
var data = "";
var addr = 0;
var len = 0;
select(string.slice(str,1,2)) {
case "S0"{
//S0为文件信息
var fileinfobuf = string.slice(str,9,-3);//取出文件信息
fileinfo = "file info:"+string.unhex(fileinfobuf,"")//解码
fileinfo = string.replace(fileinfo,"\z"," ");//替换空字符
FuncDisplay(fileinfo)//显示
continue;
}
case "S1"{
len = tonumber(string.slice(str,3,4),16)
addr = tonumber(string.slice(str,5,8),16)
data = string.slice(str,9,-3)
}
case "S2"{
len = tonumber(string.slice(str,3,4),16)
addr = tonumber(string.slice(str,5,10),16)
data = string.slice(str,11,-3)
}
case "S3"{
len = tonumber(string.slice(str,3,4),16)
addr = tonumber(string.slice(str,5,12),16)
data = string.slice(str,13,-3)
}
else {
continue;
}
}
if(block == null){
//空表,第一次进入
block = {};
block["address"] = addr;
block["data"] = {};
}
else {
//非空表
if(addr == (block["address"]+#block["data"])){
//连续,无动作
}
else {
//不同块,新建块
FlashData[#FlashData+1]={"address" = block["address"];"data" = block["data"];}
block["address"] = addr;
block["data"] = {};
}
}
data = string.unhex(data,"")
for(i=1;#data;1){
var bytedata = string.unpack(data,i)
table.push(block["data"],bytedata)
}
}
s19crc = null;
FuncDisplay(string.format("addr=%x ,len = %x",block.address,#block.data))//显示
if(block.address == 0x10000){
var last_data_addr = 0;
last_data_addr = #block.data;
var temp = last_data_addr%2048;
if(temp != 0){
last_data_addr += 2048-temp;
}
for(i=#block.data+1;last_data_addr;1){
block.data[i] = 0xff;
}
s19crc = {};
s19crc["address"] = 0x7F800;
s19crc["data"] = {};
for(i=1;0x800;1){
s19crc.data[i] = 0xff;
}
last_data_addr+=0x10000;
s19crc.data[0x7FC] = last_data_addr>>24;
s19crc.data[0x7FB] = last_data_addr>>16;
s19crc.data[0x7FA] = last_data_addr>>8;
s19crc.data[0x7F9] = last_data_addr&0XFF;
var crc32temp = FuncCRC32Calc(block.data);
s19crc.data[0x800] = crc32temp>>24;
s19crc.data[0x7FF] = crc32temp>>16;
s19crc.data[0x7FE] = crc32temp>>8;
s19crc.data[0x7FD] = crc32temp&0XFF;
}
if(block != null){
table.push(FlashData,block)
}
if(s19crc != null){
table.push(FlashData,s19crc)
}
AllData[id] = FlashData;
}
//blocknum = 1;
return path;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<workspace>
<project>
<path>$WS_DIR$\cva_asw_m0128.ewp</path>
</project>
<batchBuild />
</workspace>

View File

@ -0,0 +1,146 @@
/*
** ###################################################################
** Processor: CVM0128
** Compiler: IAR ANSI C/C++ Compiler for ARM
**
** Abstract:
** Linker file for the IAR ANSI C/C++ Compiler for ARM
**
** Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
** All rights reserved.
**
** Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
** exclusively with CVA's microcontroller products. This file can be freely
** distributed within development tools that are supporting such microcontroller
** products.
**
** THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
** OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
** CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
** OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
**
** http: www.cvachip.com
**
** ###################################################################
*/
/* If symbol __flash_vector_table__=1 is defined at link time
* the interrupt vector will not be copied to RAM.
* Warning: Using the interrupt vector from FLASH will not allow
* INT_SYS_InstallHandler because the section is Read Only.
*/
/* If want to debug the asw code without bootloader, please enable the define */
//define symbol __asw_debug_en__ = 0x00000001;
define symbol __flash_vector_table__ = 0x00000001;
define symbol __ram_vector_table_size__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x00000200;
define symbol __ram_vector_table_offset__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x000001FF;
/* Flash */
define symbol m_interrupts_start = isdefinedsymbol(__asw_debug_en__) ? 0 : 0x00010000;
define symbol m_interrupts_end = isdefinedsymbol(__asw_debug_en__) ? 0 : 0x000100BF;
define symbol m_asw_header_start = 0x000100C0;
define symbol m_asw_header_end = 0x000100C3;
define symbol m_asw_code_start = 0x000100C4;
define symbol m_asw_code_end = 0x00037FF7;
define symbol m_asw_tail_start = 0x00037FF8;
define symbol m_asw_tail_end = 0x00037FFB;
define symbol m_asw_crc_start = 0x00037FFC;
define symbol m_asw_crc_end = 0x00037FFF;
/* .data space */
define symbol m_interrupts_ram_start = 0x20000000;
define symbol m_interrupts_ram_end = 0x20000000 + __ram_vector_table_offset__;
define symbol m_data_start = m_interrupts_ram_start + __ram_vector_table_size__;
define symbol m_data_end = m_data_start + 0x00000FFF;
/* .bss stack ... */
define symbol m_data_2_start = m_data_end + 0x00000001;
define symbol m_data_2_end = 0x200037EF;
/* No initial Ram space: 16 Bytes */
define symbol m_data_noinit_start = 0x20003FF0;
define symbol m_data_noinit_end = 0x20003FFF;
/* Stack space: 512 Bytes */
/* Stack & Heap Sizes */
if (isdefinedsymbol(__stack_size__)) {
define symbol __size_cstack__ = __stack_size__;
} else {
define symbol __size_cstack__ = 0x00000200;
}
if (isdefinedsymbol(__heap_size__)) {
define symbol __size_heap__ = __heap_size__;
} else {
define symbol __size_heap__ = 0x00000000;
}
define exported symbol __VECTOR_TABLE = m_interrupts_start;
define exported symbol __VECTOR_RAM = isdefinedsymbol(__flash_vector_table__) ? m_interrupts_start : m_interrupts_ram_start;
define exported symbol __RAM_VECTOR_TABLE_SIZE = __ram_vector_table_size__;
define exported symbol __RAM_START = m_interrupts_ram_start;
define exported symbol __RAM_END = m_data_noinit_end;
define memory mem with size = 4G;
define region m_asw_header_region = mem:[from m_asw_header_start to m_asw_header_end];
define region m_asw_code_region = mem:[from m_interrupts_start to m_interrupts_end]
| mem:[from m_asw_code_start to m_asw_code_end];
define region m_asw_tail_region = mem:[from m_asw_tail_start to m_asw_tail_end];
define region m_asw_crc_region = mem:[from m_asw_crc_start to m_asw_crc_end];
define region DATA_region = mem:[from m_data_start to m_data_end];
define region DATA_noinit_region = mem:[from m_data_noinit_start to m_data_noinit_end];
define region DATA_region_2 = mem:[from m_data_2_start to m_data_2_end-__size_cstack__];
define region CSTACK_region = mem:[from m_data_2_end-__size_cstack__+1 to m_data_2_end];
define region m_interrupts_ram_region = mem:[from m_interrupts_ram_start to m_interrupts_ram_end];
define block CSTACK with alignment = 8, size = __size_cstack__ { };
define block HEAP with alignment = 8, size = __size_heap__ { };
define block RW { readwrite };
define block ZI { zi };
define block customSectionBlock { section .customSection };
define block __CODE_ROM { section .textrw_init };
define block __CODE_RAM { section .textrw };
initialize manually { section .textrw };
initialize manually { section .bss, section .bss.no_init};
initialize manually { section .customSection, section .code_ram};
initialize manually { section .data};
initialize manually { section __DLIB_PERTHREAD };
do not initialize { section .no_init, section .bss, section .data, section __DLIB_PERTHREAD, section .customSection};
place at address mem: m_interrupts_start { readonly section .intvec };
place in m_asw_code_region { readonly };
place in m_asw_code_region { block __CODE_ROM };
place in DATA_region { block RW };
place in DATA_region { block __CODE_RAM };
place in DATA_region_2 { first block customSectionBlock };
place in DATA_region_2 { block ZI };
place in DATA_region_2 { last block HEAP };
place in CSTACK_region { block CSTACK };
place in m_interrupts_ram_region { section m_interrupts_ram };
place in DATA_noinit_region { readwrite section .bss.no_init };
place in m_asw_header_region { readonly section .asw_header};
place in m_asw_tail_region { readonly section .asw_tail};
place in m_asw_crc_region { readonly section .checksum};

518
cva_asw_m0128/src/main.c Normal file
View File

@ -0,0 +1,518 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*! \brief a loop memory to memory transfer
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#include <string.h>
#include "mcu.h"
#include "uds_user.h"
/*******************************************************************************
* the defines
******************************************************************************/
#define UDS_PHYS_RECV_MSG_ID (0x732)
#define UDS_FUNC_RECV_MSG_ID (0x7DF)
#define UDS_PHYS_RESP_MSG_ID (0x7B2)
#define APP_TX_TEST1_MSG_ID (0x111)
#define APP_TX_TEST2_MSG_ID (0x222)
#define APP_RX_TEST1_MSG_ID (0x444)
#define APP_RX_TEST2_MSG_ID (0x555)
#define UDS_RECV_BUF (1026)
#define UDS_SEND_BUF (128)
#define CAN_DATA_BUFFER_SIZE (8u)
#define CAN_BUFFER_FIFO_SIZE (16u)
int64_t Get_Cur_Time_Stamp(void);
static int8_t FlexCanBoot_TxMessage(uint32_t msgId, const uint8_t* pData, uint8_t size);
/* Indication value with boot loader request from asw */
#define ASW_BOOT_REQ_ACTIVE (0x55AAAA55ul)
/* Asw code head id to show asw is not empty */
#define ASW_HEAD_MASK (0xAABBCCDDul)
#define ASW_TAIL_MASK (0xFFFFFFFF - ASW_HEAD_MASK)
/*******************************************************************************
* the typedefs
******************************************************************************/
typedef enum
{
UDS_MSG_IDX_STD_RX_PHYS,
UDS_MSG_IDX_STD_RX_FUNC,
UDS_MSG_IDX_STD_RX_TEST1,
UDS_MSG_IDX_STD_RX_TEST2,
UDS_MSG_IDX_STD_TX_TEST1,
UDS_MSG_IDX_STD_TX,
UDS_MSG_IDX_STD_TEST1,
UDS_MSG_IDX_STD_TEST2,
UDS_MSG_IDX_NUM
} Uds_MsgIdIdxType;
typedef struct
{
uint32_t id;
uint8_t data[CAN_DATA_BUFFER_SIZE];
uint8_t len;
uint16_t timeStamp;
uint32_t hrTimeStamp;
} FlexCan_FrameStructureType;
typedef struct
{
FlexCan_FrameStructureType rxMsg[CAN_BUFFER_FIFO_SIZE];
FlexCan_FrameStructureType txMsg[CAN_BUFFER_FIFO_SIZE];
uint8_t wrIdx;
uint8_t rdIdx;
} FlexCan_DataInfoType;
/*******************************************************************************
* the globals
******************************************************************************/
McuType mcu;
volatile uint32_t gSystick1msEvent = 0, gSystick1msCnt = 0, gTestRunCnt = 0, gTestIoEn = 0, gSysTick1sCnt = 0;
uint32_t gCpuClockFrequency = 0;
int64_t timer_1ms = 0;
uint8_t udsSendBuf[UDS_SEND_BUF] = {0};
uint8_t udsRecvBuf[UDS_RECV_BUF] = {0};
UdsType udsObj;
FlexCan_DataInfoType flexCan_DataInfo;
FlexCanDrv_ControllerCfgType flexCanCfg;
FlexCanDrvType* flexCanDrv_DemoObj;
uint8_t flexCanBoot_EnhanceRxFFCnt = 0;
uint8_t txMsgBuf[8] = {0};
uint8_t aswVersion = 1;
Uds_ParamsType udsParam = {
.isotpParams.framePadding = true,
.isotpParams.blockSize = 0,
.isotpParams.recvPhysId = UDS_PHYS_RECV_MSG_ID,
.isotpParams.recvFuncId = UDS_FUNC_RECV_MSG_ID,
.isotpParams.sendid = UDS_PHYS_RESP_MSG_ID,
.isotpParams.sendBuf = udsSendBuf,
.isotpParams.sendBufSize = UDS_SEND_BUF,
.isotpParams.recvBuf = udsRecvBuf,
.isotpParams.recvBufSize = UDS_RECV_BUF,
.isotpParams.debug = NULL,
.isotpParams.sendCanMsg = FlexCanBoot_TxMessage,
.isotpParams.getTimeMs = Get_Cur_Time_Stamp,
.p2Server_ms = 50,
.p2xServer_10ms = 500,
.s3Server_ms = 5000,
};
const FlexCanDrv_MsgCfgType msgCfgObj[UDS_MSG_IDX_NUM] = {
{UDS_MSG_IDX_STD_RX_PHYS, 1, UDS_PHYS_RECV_MSG_ID, false, FLEXCANDRV_MSGTYPE_RX, DLC_BYTE_8, false, true, 0xFFFFFFFF}, /* CAN_MSGOBJ_STD_RX_PHYS */
{UDS_MSG_IDX_STD_RX_FUNC, 1, UDS_FUNC_RECV_MSG_ID, false, FLEXCANDRV_MSGTYPE_RX, DLC_BYTE_8, false, true, 0xFFFFFFFF}, /* CAN_MSGOBJ_STD_RX_FUNC */
{UDS_MSG_IDX_STD_RX_TEST1, 1, APP_RX_TEST1_MSG_ID, false, FLEXCANDRV_MSGTYPE_RX, DLC_BYTE_8, false, true, 0xFFFFFFFF}, /* CAN_MSGOBJ_STD_RX_FUNC */
{UDS_MSG_IDX_STD_RX_TEST2, 1, APP_RX_TEST2_MSG_ID, false, FLEXCANDRV_MSGTYPE_RX, DLC_BYTE_8, false, true, 0xFFFFFFFF}, /* CAN_MSGOBJ_STD_RX_FUNC */
{UDS_MSG_IDX_STD_TX, 1, UDS_PHYS_RESP_MSG_ID, false, FLEXCANDRV_MSGTYPE_TX, DLC_BYTE_8, false, false, 0xFFFFFFFF}, /* CAN_MSGOBJ_STD_TX */
{UDS_MSG_IDX_STD_TEST1, 1, APP_TX_TEST1_MSG_ID, false, FLEXCANDRV_MSGTYPE_TX, DLC_BYTE_8, false, false, 0xFFFFFFFF}, /* CAN_MSGOBJ_STD_TX */
{UDS_MSG_IDX_STD_TEST2, 1, APP_TX_TEST2_MSG_ID, false, FLEXCANDRV_MSGTYPE_TX, DLC_BYTE_8, false, false, 0xFFFFFFFF}, /* CAN_MSGOBJ_STD_TX */
};
#pragma location = ".bss.no_init"
static uint32_t sAswBoot_Req = 0;
#pragma location = ".asw_header"
__root const uint32_t sAswHeader = ASW_HEAD_MASK;
#pragma location = ".asw_tail"
__root const uint32_t sAswTail = ASW_TAIL_MASK;
/*******************************************************************************
* the functions
******************************************************************************/
void Asw_SetBootloaderRequest(void)
{
sAswBoot_Req = ASW_BOOT_REQ_ACTIVE;
}
int64_t Get_Cur_Time_Stamp(void)
{
return timer_1ms;
}
void SysTick_Handler(void)
{
gSystick1msEvent++;
timer_1ms++;
Uds_Tick(&udsObj);
}
void FlexCanBoot_TxRxIsr(void)
{
uint8_t i = 0;
FlexCanDrv_MsgObjType msgObj;
for(i = 0; i < flexCanCfg.msgNum; i++)
{
msgObj.msgBufId = i;
if(FlexCanDrv_GetMsgObjFlag(flexCanDrv_DemoObj, &msgObj))
{
if(flexCanCfg.msgCfg[i].msgType == FLEXCANDRV_MSGTYPE_RX)
{
/* clear message buffer interrupt flag */
FlexCanDrv_ClearMsgObjFlag(flexCanDrv_DemoObj, &msgObj);
/* get the new message data */
FlexCanDrv_GetRxMsg(flexCanDrv_DemoObj, &msgObj);
memcpy(flexCan_DataInfo.rxMsg[flexCan_DataInfo.wrIdx].data, msgObj.data, msgObj.dlc);
flexCan_DataInfo.rxMsg[flexCan_DataInfo.wrIdx].id = msgObj.msgId;
flexCan_DataInfo.rxMsg[flexCan_DataInfo.wrIdx].len = msgObj.dlc;
flexCan_DataInfo.wrIdx++;
if(flexCan_DataInfo.wrIdx >= CAN_BUFFER_FIFO_SIZE)
{
flexCan_DataInfo.wrIdx = 0;
}
}
else
{
/* clear message buffer interrupt flag */
FlexCanDrv_ClearMsgObjFlag(flexCanDrv_DemoObj, &msgObj);
}
}
}
}
void CAN_ORed_0_31_MB_Handler(void)
{
FlexCanBoot_TxRxIsr();
}
void CAN_ORed_32_63_MB_Handler(void)
{
//FlexCanBoot_TxRxIsr();
}
bool FlexCanBoot_ReadoutMsg(FlexCan_FrameStructureType *pRxMsgObj)
{
bool ret = false;
if(flexCan_DataInfo.wrIdx != flexCan_DataInfo.rdIdx)
{
memcpy(pRxMsgObj, &flexCan_DataInfo.rxMsg[flexCan_DataInfo.rdIdx], sizeof(FlexCan_FrameStructureType));
flexCan_DataInfo.rdIdx++;
if(flexCan_DataInfo.rdIdx >= CAN_BUFFER_FIFO_SIZE)
{
flexCan_DataInfo.rdIdx = 0;
}
ret = true;
}
return ret;
}
static int8_t FlexCanBoot_TxMessage(uint32_t msgId, const uint8_t *pData, uint8_t size)
{
FlexCanDrv_MsgObjType txMsgObj;
uint8_t msgIdx = 0, i = 0;
for(i = 0; i < flexCanCfg.msgNum; i++)
{
if(msgId == flexCanCfg.msgCfg[i].msgId)
{
msgIdx = i;
break;
}
}
txMsgObj.msgBufId = flexCanCfg.msgCfg[msgIdx].msgBufId;
txMsgObj.dlc = size;
txMsgObj.msgId = flexCanCfg.msgCfg[msgIdx].msgId;
memcpy(&txMsgObj.data[0], pData, size);
FlexCanDrv_SetTxMsg(flexCanDrv_DemoObj, &txMsgObj);
/* transmit standard CAN Tx message */
FlexCanDrv_TransmitMsg(flexCanDrv_DemoObj, &txMsgObj);
return 0;
}
void FlexCanBoot_Init(void)
{
uint32_t busClockFreq = 0;
flexCanDrv_DemoObj = &mcu.flexCanDrv;
/* set PTC1 MUX as GPIO */
PinsDrv_SetMuxModeSel(&mcu.ptc, 1, PINSDRV_MUX_AS_GPIO);
/* set PTC1 as GPIO output */
PinsDrv_SetPinDirection(&mcu.ptc, 1, 1);
/* set PTC1 as high to control CAN transceiver STB */
PinsDrv_WritePin(&mcu.ptc, 1, 0);
/* set CAN0.RX */
PinsDrv_SetMuxModeSel(&mcu.ptb, 15, PINSDRV_MUX_ALT6);
/* set CAN0.TX */
PinsDrv_SetMuxModeSel(&mcu.ptb, 14, PINSDRV_MUX_ALT6);
flexCanCfg.clkSrc = FLEXCANDRV_CLKSRC_CHICLK;
flexCanCfg.fdEnable = false;
flexCanCfg.fdISOEnable = false;
flexCanCfg.msgBufDataLenSel = FLEXCANDRV_MB_SIZE_BYTE_8;
flexCanCfg.individualMaskEnable = true;
if(flexCanCfg.clkSrc == FLEXCANDRV_CLKSRC_CHICLK)
{
ClockDrv_GetFreq(&mcu.clockDrv, CLOCKDRV_APB, &busClockFreq);
}
else
{
ClockDrv_GetFreq(&mcu.clockDrv, CLOCKDRV_SOSC_DIV, &busClockFreq);
}
if(flexCanCfg.fdEnable == true)
{
FlexCanDrv_BitTimingCalc(&flexCanCfg.fdBitTiming,
busClockFreq, /* module clock source: 16M */
2000000, /* baudrate: 2M */
7500, /* sample point: 75% */
2000, /* SJW: 20% */
1); /* FD bit timing */
}
FlexCanDrv_BitTimingCalc(&flexCanCfg.bitTiming,
busClockFreq, /* module clock source: 16M */
500000, /* baudrate: 500K */
7500, /* sample point: 75% */
2500, /* SJW: 20% */
0); /* classic CAN bit timing */
/* initialize CAN module */
FlexCanDrv_Configure(flexCanDrv_DemoObj, &flexCanCfg);
/* enable all CAN mailbox interrupt */
IrqDrv_EnableIrq(CAN_ORed_0_31_MB_IRQn);
IrqDrv_EnableIrq(CAN_ORed_32_63_MB_IRQn);
}
int main(void)
{
FlexCan_FrameStructureType rxMsg;
IrqDrv_DisableGlobalInterrupt();
/* Setup the clock */
ClockDrv_ModuleClkConfigType clockConfig;
/* Initialize all MCU drivers: flash drv included */
Mcu_Init(&mcu);
/* Setup the Pll div2 clock */
clockConfig.gating = true;
clockConfig.source = CLOCKDRV_PLL;
clockConfig.div = 1;
ClockDrv_ConfigureClock(&mcu.clockDrv, CLOCKDRV_PLL_DIV, &clockConfig);
/* Enable the clock for all ports */
clockConfig.gating = true;
ClockDrv_ConfigureClock(&mcu.clockDrv, CLOCKDRV_PORTA, &clockConfig);
ClockDrv_ConfigureClock(&mcu.clockDrv, CLOCKDRV_PORTB, &clockConfig);
ClockDrv_ConfigureClock(&mcu.clockDrv, CLOCKDRV_PORTC, &clockConfig);
PinsDrv_SetMuxModeSel(&mcu.ptc, 3, PINSDRV_MUX_AS_GPIO);
PinsDrv_SetPinDirection(&mcu.ptc, 3, 1);
PinsDrv_SetPullSel(&mcu.ptc,3, PINSDRV_INTERNAL_PULL_UP);
PinsDrv_WritePin(&mcu.ptc,3, 1);
PinsDrv_SetMuxModeSel(&mcu.ptc, 1, PINSDRV_MUX_AS_GPIO);
PinsDrv_SetPinDirection(&mcu.ptc, 1, 1);
PinsDrv_SetPullSel(&mcu.ptc, 1, PINSDRV_INTERNAL_PULL_UP);
PinsDrv_WritePin(&mcu.ptc, 1, 1);
PinsDrv_SetMuxModeSel(&mcu.ptc, 2, PINSDRV_MUX_AS_GPIO);
PinsDrv_SetPinDirection(&mcu.ptc, 2, 1);
PinsDrv_SetPullSel(&mcu.ptc, 2, PINSDRV_INTERNAL_PULL_UP);
PinsDrv_WritePin(&mcu.ptc, 2, 0);
/* CAN init */
memset(&flexCan_DataInfo, 0, sizeof(flexCan_DataInfo));
memset(&flexCanCfg, 0, sizeof(flexCanCfg));
/* get CAN controller default configuration */
FlexCanDrv_GetDefaultCfg(&flexCanCfg);
flexCanCfg.msgNum = sizeof(msgCfgObj) / sizeof(FlexCanDrv_MsgCfgType);
flexCanCfg.msgCfg = msgCfgObj;
FlexCanBoot_Init();
/* UDS init */
Uds_UserInit(&udsObj, &udsParam);
/* Set system tick clock, 1ms event */
ClockDrv_GetFreq(&mcu.clockDrv, CLOCKDRV_CORE, &gCpuClockFrequency);
SysTick_Config(gCpuClockFrequency / 1000u);
IrqDrv_EnableIrq(SysTick_IRQn);
IrqDrv_EnableGlobalInterrupt();
while(1)
{
if(gSystick1msEvent > 0u)
{
if(udsObj.session == UDS_SESSION_PROGRAMMING)
{
Asw_SetBootloaderRequest();
ResetDrv_SoftwareResetModule(&mcu.resetDrv, RESETDRV_SWRESET_SYS);
}
gSystick1msEvent--;
gSystick1msCnt++;
gSysTick1sCnt++;
if(aswVersion == 0)
{
if(gSysTick1sCnt >= 1000)
{
gSysTick1sCnt = 0;
if(gTestIoEn == 0)
{
gTestIoEn = 1;
PinsDrv_WritePin(&mcu.ptc, 3, 1);
PinsDrv_WritePin(&mcu.ptc, 1, 1);
PinsDrv_WritePin(&mcu.ptc, 2, 1);
}
else
{
gTestIoEn = 0;
PinsDrv_WritePin(&mcu.ptc, 30, 0);
PinsDrv_WritePin(&mcu.ptc, 1, 0);
PinsDrv_WritePin(&mcu.ptc, 2, 0);
}
}
if(gSystick1msCnt >= 2)
{
uint8_t txMsgBuf[8] = {0};
gSystick1msCnt = 0;
txMsgBuf[0] = aswVersion;
txMsgBuf[1] = aswVersion;
txMsgBuf[2] = ((sAswBoot_Req >> 24)& 0xFF);
txMsgBuf[3] = ((sAswBoot_Req >> 16) & 0xFF);
txMsgBuf[4] = ((sAswBoot_Req >> 8) & 0xFF);
txMsgBuf[5] = ((sAswBoot_Req >> 0) & 0xFF);
txMsgBuf[6] = gSysTick1sCnt & 0xFF;
FlexCanBoot_TxMessage(APP_TX_TEST1_MSG_ID, txMsgBuf, 8);
}
}
else if(aswVersion == 1)
{
if(gSystick1msCnt >= 10)
{
uint8_t txMsgBuf[8] = {0};
gSystick1msCnt = 0;
txMsgBuf[0] = aswVersion;
txMsgBuf[1] = aswVersion;
txMsgBuf[2] = ((sAswBoot_Req >> 24) & 0xFF);
txMsgBuf[3] = ((sAswBoot_Req >> 16) & 0xFF);
txMsgBuf[4] = ((sAswBoot_Req >> 8) & 0xFF);
txMsgBuf[5] = ((sAswBoot_Req >> 0) & 0xFF);
txMsgBuf[6] = gSysTick1sCnt & 0xFF;
FlexCanBoot_TxMessage(APP_TX_TEST2_MSG_ID, txMsgBuf, 8);
}
if(gSysTick1sCnt >= 1000)
{
static uint8_t blueLed = 0, redLed = 0, greenLed = 0;
gSysTick1sCnt = 0;
if(blueLed == 0 && redLed == 0 && greenLed == 0)
{
PinsDrv_WritePin(&mcu.ptc, 3, 0);
PinsDrv_WritePin(&mcu.ptc, 1, 1);
PinsDrv_WritePin(&mcu.ptc, 2, 1);
blueLed = 1;
redLed = 0;
greenLed = 0;
}
else if(blueLed == 1 && redLed == 0 && greenLed == 0)
{
PinsDrv_WritePin(&mcu.ptc, 30, 0);
PinsDrv_WritePin(&mcu.ptc, 1, 0);
PinsDrv_WritePin(&mcu.ptc, 2, 1);
blueLed = 1;
redLed = 1;
greenLed = 0;
}
else if(blueLed == 1 && redLed == 1 && greenLed == 0)
{
PinsDrv_WritePin(&mcu.ptc, 3, 0);
PinsDrv_WritePin(&mcu.ptc, 1, 0);
PinsDrv_WritePin(&mcu.ptc, 2, 0);
blueLed = 1;
redLed = 1;
greenLed = 1;
}
else if(blueLed == 1 && redLed == 1 && greenLed == 1)
{
PinsDrv_WritePin(&mcu.ptc, 3, 1);
PinsDrv_WritePin(&mcu.ptc, 1, 1);
PinsDrv_WritePin(&mcu.ptc, 2, 1);
blueLed = 0;
redLed = 0;
greenLed = 0;
}
}
}
/* Handler user routine */
if(FlexCanBoot_ReadoutMsg(&rxMsg) == true)
{
if((rxMsg.id == UDS_PHYS_RECV_MSG_ID) || (rxMsg.id == UDS_FUNC_RECV_MSG_ID))
{
IsoTp_HandleIncomingCanMsg(&udsObj.isotp, rxMsg.id, rxMsg.data, rxMsg.len);
}
else
{
uint8_t txMsgBuf[8] = {0};
gSystick1msCnt = 0;
txMsgBuf[0] = aswVersion;
txMsgBuf[1] = ((rxMsg.id >> 8) & 0xFF);
txMsgBuf[2] = ((rxMsg.id >> 0) & 0xFF);
txMsgBuf[3] ++;
if(aswVersion == 0)
{
txMsgBuf[7] = 0x55;
FlexCanBoot_TxMessage(APP_TX_TEST2_MSG_ID, txMsgBuf, 8);
}
else
{
txMsgBuf[7] = 0xaa;
FlexCanBoot_TxMessage(APP_TX_TEST2_MSG_ID, txMsgBuf, 8);
}
}
}
Uds_Run(&udsObj);
}
}
}

View File

@ -0,0 +1,261 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*****************************************************************************/
/* Version: GNU Compiler Collection */
/*****************************************************************************/
MODULE ?cstartup
;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:ROOT(2)
EXTERN main
EXTERN SystemInit
EXTERN init_data_bss
EXTERN __iar_program_start
PUBLIC __vector_table
PUBLIC __vector_table_0x1c
PUBLIC __Vectors
PUBLIC __Vectors_End
PUBLIC __Vectors_Size
DATA
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; Non Maskable Interrupt
DCD HardFault_Handler ; Cortex-M0 SV Hard Fault Interrupt
DCD 0
DCD 0
DCD 0
__vector_table_0x1c
DCD 0
DCD 0
DCD 0
DCD 0
DCD SVC_Handler ; Cortex-M0 SV Call Interrupt
DCD 0
DCD 0
DCD PendSV_Handler ; Cortex-M0 Pend SV Interrupt
DCD SysTick_Handler ; Cortex-M0 System Tick Interrupt
DCD DMA01_Handler /* 0 (040H) DMA channel 0,1 transfer complete*/
DCD DMA23_Handler /* 1 (044H) DMA channel 2,3 transfer complete*/
DCD DMA_Error_Handler /* 2 (048H) DMA error interrupt channels 0-3*/
DCD FHU_Handler /* 3 (04CH) FHU Interrupt, ERM single bit error correction*/
DCD RTC_Alarm_Handler /* 4 (050H) RTC alarm interrupt*/
DCD RTC_Seconds_Handler /* 5 (054H) RTC seconds interrupt*/
DCD LPTMR_Handler /* 6 (058H) LPTIMER interrupt request*/
DCD PORT_Handler /* 7 (05CH) Port ABCDE pin detect interrupt */
DCD CAN_ORed_Handler /* 8 (060H) CAN OR'ed [BusOff\BusOffDone\TransWarning\ReceiveWarning\..... ] */
DCD CAN_ORed_0_31_MB_Handler /* 9 (064H) CAN OR'ed Message buffer (0-31) */
DCD CAN_ORed_32_63_MB_Handler /* 10 (068H) CAN OR'ed Message buffer (32-63) */
DCD MFT0_Ch0_Ch7_Handler /* 11 (06CH) MFT0 Channel 0 to 7 interrupt */
DCD MFT0_Fault_Handler /* 12 (070H) MFT0 Fault interrupt */
DCD MFT0_Ovf_Reload_Handler /* 13 (074H) MFT0 Counter overflow and Reload interrupt */
DCD MFT1_Ch0_Ch7_Handler /* 14 (078H) MFT1 Channel 0 to 7 interrupt */
DCD MFT1_Fault_Handler /* 15 (07CH) MFT1 Fault interrupt */
DCD MFT1_Ovf_Reload_Handler /* 16 (080H) MFT1 Counter overflow and Reload interrupt */
DCD FTFC_Handler /* 17 (084H) FTFC Command done,read collision,err response interrupt */
DCD PDB_Handler /* 18 (088H) PDB interrupt */
DCD LPIT_Handler /* 19 (08CH) LPIT interrupt */
DCD CMU_Handler /* 20 (090H) CMU PLL,SOSC interrupt */
DCD WDOG_Handler /* 21 (094H) Interrupt request out before wdg reset out */
DCD RCM_Handler /* 22 (098H) RCM Asynchronous Interrupt, Reset interrutpt */
DCD I2C_Handler /* 23 (09CH) I2C Interrupt */
DCD SPI0_Handler /* 24 (0A0H) SPI0 Interrupt */
DCD SPI1_Handler /* 25 (0A4H) SPI1 Interrupt */
DCD ADC_Handler /* 26 (0A8H) ADC interrupt request. */
DCD CMP_Handler /* 27 (0ACH) CMP interrupt request */
DCD I2S_SLV_MST_Handler /* 28 (0B0H) I2S Slave and Master interrupt */
DCD UART0_RxTx_Handler /* 29 (0B4H) UART0 Transmit / Receive Interrupt */
DCD UART1_RxTx_Handler /* 30 (0B8H) UART1 Transmit / Receive Interrupt */
DCD UART2_RxTx_Handler /* 31 (0BCH) UART2 Transmit / Receive Interrupt */
__Vectors_End
__Vectors EQU __vector_table
__Vectors_Size EQU __Vectors_End - __Vectors
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
THUMB
PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
CPSID I ; Mask interrupts
;; Init the rest of the registers
LDR R1,=0
LDR R2,=0
LDR R3,=0
LDR R4,=0
LDR R5,=0
LDR R6,=0
LDR R7,=0
MOV R8,R7
MOV R9,R7
MOV R10,R7
MOV R11,R7
MOV R12,R7
#ifdef START_FROM_FLASH
IMPORT __RAM_START, __RAM_END
;; INIT ECC RAM
LDR R1, =__RAM_START
LDR R2, =__RAM_END
SUBS R2, R2, R1
SUBS R2, #1
BLE .LC5
MOVS R0, #0
MOVS R3, #4
.LC4:
STR R0, [R1]
ADD R1, R1, R3
SUBS R2, #4
BGE .LC4
.LC5:
#endif
;; Initialize the stack pointer
LDR R0, =sfe(CSTACK)
MOV R13,R0
#ifndef __NO_SYSTEM_INIT
;; Call the CMSIS system init routine
LDR R0, =SystemInit
BLX R0
#endif
;; Init .data and .bss sections
LDR R0, =init_data_bss
BLX R0
CPSIE I ; Unmask interrupts
BLX __iar_program_start
BLX R0
BL main
JumpToSelf
B JumpToSelf
PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
B .
PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
HardFault_Handler
B .
PUBWEAK SVC_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SVC_Handler
B .
PUBWEAK PendSV_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
PendSV_Handler
B .
PUBWEAK SysTick_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SysTick_Handler
B .
PUBWEAK DMA01_Handler
PUBWEAK DMA23_Handler
PUBWEAK DMA_Error_Handler
PUBWEAK FHU_Handler
PUBWEAK RTC_Alarm_Handler
PUBWEAK RTC_Seconds_Handler
PUBWEAK LPTMR_Handler
PUBWEAK PORT_Handler
PUBWEAK CAN_ORed_Handler
PUBWEAK CAN_ORed_0_31_MB_Handler
PUBWEAK CAN_ORed_32_63_MB_Handler
PUBWEAK MFT0_Ch0_Ch7_Handler
PUBWEAK MFT0_Fault_Handler
PUBWEAK MFT0_Ovf_Reload_Handler
PUBWEAK MFT1_Ch0_Ch7_Handler
PUBWEAK MFT1_Fault_Handler
PUBWEAK MFT1_Ovf_Reload_Handler
PUBWEAK FTFC_Handler
PUBWEAK PDB_Handler
PUBWEAK LPIT_Handler
PUBWEAK CMU_Handler
PUBWEAK WDOG_Handler
PUBWEAK RCM_Handler
PUBWEAK I2C_Handler
PUBWEAK SPI0_Handler
PUBWEAK SPI1_Handler
PUBWEAK ADC_Handler
PUBWEAK CMP_Handler
PUBWEAK I2S_SLV_MST_Handler
PUBWEAK UART0_RxTx_Handler
PUBWEAK UART1_RxTx_Handler
PUBWEAK UART2_RxTx_Handler
PUBWEAK DefaultISR
SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
HardFault_Handler
SVC_Handler
PendSV_Handler
SysTick_Handler
DMA01_Handler
DMA23_Handler
DMA_Error_Handler
FHU_Handler
RTC_Alarm_Handler
RTC_Seconds_Handler
LPTMR_Handler
PORT_Handler
CAN_ORed_Handler
CAN_ORed_0_31_MB_Handler
CAN_ORed_32_63_MB_Handler
MFT0_Ch0_Ch7_Handler
MFT0_Fault_Handler
MFT0_Ovf_Reload_Handler
MFT1_Ch0_Ch7_Handler
MFT1_Fault_Handler
MFT1_Ovf_Reload_Handler
FTFC_Handler
PDB_Handler
LPIT_Handler
CMU_Handler
WDOG_Handler
RCM_Handler
I2C_Handler
SPI0_Handler
SPI1_Handler
ADC_Handler
CMP_Handler
I2S_SLV_MST_Handler
UART0_RxTx_Handler
UART1_RxTx_Handler
UART2_RxTx_Handler
DefaultISR
END

View File

@ -0,0 +1,145 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "drivers/cpu/startup/system_M011x.h"
#include "drivers/cpu/cpu_drv.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void SystemInit(void)
{
#if 0
/* PFLASH prefetch */
SimReg_SetFlashPFlsFlushEn(SIM, 1); /* Flush PFLASH prefetch */
SimReg_SetFlashPFlsPfbEn(SIM, 1); /* Enable PFLASH prefetch*/
/* Unlock SCG */
Scg0Reg_SetKey(SCG0, 0x19962020);
#ifdef _USE_EXT_OSC_
/* Use External oscillator */
Scg0Reg_SetOscCtrlRange(SCG0, 3); /* set SOSC frequency range(use max value when SOSC as the clock source of the PLL) */
Scg0Reg_SetOscCtrlEnSosc(SCG0, 1); /* enable SOSC */
while(Scg0Reg_GetStatusSoscRdy(SCG0) == 0)
{
; /* wait until SOSC is ready */
}
/* Disable PLL */
Scg0Reg_SetPllCtrl0PllEn(SCG0, 0);
/* PLL configuration:
* - PLL input clock source : SOSC
* - PLL pre-divider : 1
* - feedback divider : 40
* - PLL Feedback clock divider pre-scaler : 1
* - PLL post-divider setting : 4
* Final PLL output frequency is 16M(SOSC) * 40 / 4 / 2 = 80M
*/
Scg0Reg_SetPllCtrl1PllClkinSel(SCG0, 0);
Scg0Reg_SetPllCtrl0PllPreDiv(SCG0, 0);
Scg0Reg_SetPllCtrl0PllM(SCG0, 40);
Scg0Reg_SetPllCtrl0PllFdkSel(SCG0, 0);
Scg0Reg_SetPllCtrl0PllPosDiv(SCG0, 4);
/* Enable PLL */
Scg0Reg_SetPllCtrl0PllEn(SCG0, 1);
/* Use systick for delay */
SysTick->LOAD = 8000U;
SysTick->VAL = 0U;
SysTick->CTRL = 5U; /* SysTick uses the processor clock and enable sysTick */
while(SysTick->CTRL < 0x10000){
;/* wait for COUNTFLAG setting*/
}
/*recover sysTick register*/
SysTick->CTRL = 4U;
SysTick->LOAD = 0U;
SysTick->VAL = 0U;
while(Scg0Reg_GetStatusPllLock(SCG0) == 0)
{
;
}
/* Flash AHB bus read access time configure */
FtfcReg_SetFcnfgBusReadTm(FTFC, 1); /* 2T required for 80M AHB */
/* Set clk_pll as system clock */
Scg2Reg_SetCsrSrcSys(SCG2, 2);
while(Scg2Reg_GetCsrSysSt(SCG2) != 2)
{
;
}
#else
/* Disable PLL */
Scg0Reg_SetPllCtrl0PllEn(SCG0, 0);
/* PLL configuration:
* - PLL input clock source : SIRC
* - PLL pre-divider : 1
* - feedback divider : 80
* - PLL Feedback clock divider pre-scaler : 1
* - PLL post-divider setting : 4
* Final PLL output frequency is 8M(SIRC) * 80 / 4 / 2 = 80M
*/
Scg0Reg_SetPllCtrl1PllClkinSel(SCG0, 1);
Scg0Reg_SetPllCtrl0PllPreDiv(SCG0, 0);
Scg0Reg_SetPllCtrl0PllM(SCG0, 80);
Scg0Reg_SetPllCtrl0PllFdkSel(SCG0, 0);
Scg0Reg_SetPllCtrl0PllPosDiv(SCG0, 4);
/* Enable PLL */
Scg0Reg_SetPllCtrl0PllEn(SCG0, 1);
while(Scg0Reg_GetStatusPllLock(SCG0) == 0)
{
;
}
/* Flash AHB bus read access time configure */
FtfcReg_SetFcnfgBusReadTm(FTFC, 1); /* 2T required for 80M AHB */
/* Set clk_pll as system clock */
Scg2Reg_SetCsrSrcSys(SCG2, 2);
while(Scg2Reg_GetCsrSysSt(SCG2) != 2)
{
;
}
#endif
/* Set Core and APB clock source divider */
Scg1Reg_SetCkSrcSysDiv(SCG1, 0); /* Divide-by-1 */
Scg2Reg_SetCsrDivAips(SCG2, 0); /* Divide-by-1 */
/* Finish setting up the clock */
Scg0Reg_SetKey(SCG0, 0); /* lock SCG again */
#endif
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,221 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_dtc.h"
/*******************************************************************************
* the defines
******************************************************************************/
#define DTCG_EMISSION_START (0x00000000ul) /* 24Bit DTC define ISO-15031-6 DTC + ISO-15031-6 Failure Type, ISO14229-1 format */
#define DTCG_EMISSION_END (0x000FFFFFul)
#define DTCG_POWERTRAIN_START (0x00100000ul)
#define DTCG_POWERTRAIN_END (0x003FFFFFul)
#define DTCG_CHASSIS_START (0x00400000ul)
#define DTCG_CHASSIS_END (0x007FFFFFul)
#define DTCG_BODY_START (0x00800000ul)
#define DTCG_BODY_END (0x00BFFFFFul)
#define DTCG_NETWORK_START (0x00C00000ul)
#define DTCG_NETWORK_END (0x00FFFFFFul)
#define FAULTDT_MAX (127) /* refers to ISO14229-1 D.6 */
#define FAULTDT_MIN (-128) /* refers to ISO14229-1 D.6 */
#define AGING_MAX (40) /* refers to ISO14229-1 D.7 */
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/* the meaning of UDS DTC value refers to ISO 15031-6 */
static Uds_DtcType udsDtcTable[DTC_MAX_COUNT] = {
{0x04621A, 0x50, 0x00, 0x00}, /* P0462 fuel level sensor "A" circuit resistance low */
{0x04631B, 0x50, 0x00, 0x00}, /* P0463 fuel level sensor "A" circuit resistance high */
{0xF00316, 0x50, 0x00, 0x00}, /* U3003 battery voltage low */
{0xF00317, 0x50, 0x00, 0x00}, /* U3003 battery voltage high */
{0xC07388, 0x50, 0x00, 0x00}, /* U0073 control module communication bus off */
{0xC10001, 0x50, 0x00, 0x00}, /* U0100 lost communication with ECM/PCM "A" */
{0xC10101, 0x50, 0x00, 0x00}, /* U0101 lost communication with TCM */
{0xC12101, 0x50, 0x00, 0x00}, /* U0121 lost communication with ABS control module */
{0xC12701, 0x50, 0x00, 0x00}, /* U0127 lost communication with tire pressure monitor module */
{0xC12801, 0x50, 0x00, 0x00}, /* U0128 lost communication with park brake control module */
{0xC12901, 0x50, 0x00, 0x00}, /* U0129 lost communication with brake system control module */
{0xC13101, 0x50, 0x00, 0x00}, /* U0131 lost communication with power sterring control module */
{0xC14100, 0x50, 0x00, 0x00}, /* U0141 lost communication with body control module "A" */
{0xC15101, 0x50, 0x00, 0x00}, /* U0151 lost communication with restraints control module */
{0xC16300, 0x50, 0x00, 0x00}, /* U0163 lost communication with navigation control module */
{0xC16900, 0x50, 0x00, 0x00}, /* U0169 lost communication with sunroof control module */
{0xC18101, 0x50, 0x00, 0x00}, /* U0181 lost communication with headlamp leveling control module */
{0xC23601, 0x50, 0x00, 0x00}, /* U0236 lost communication with column lock module */
{0xC16400, 0x50, 0x00, 0x00}, /* U0164 lost communication with HVAC control module */
{0xC16700, 0x50, 0x00, 0x00}, /* U0167 lost communication with vehicle immobilizer control module */
};
static bool dtcOffCtrl = false;
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void Uds_SetDtcOffCtrl(bool val)
{
dtcOffCtrl = val;
}
bool Uds_GetDtcOffCtrlState(void)
{
return dtcOffCtrl;
}
void Uds_ClearDtcByDtcIndex(uint16_t dtcIndex)
{
if(dtcIndex >= DTC_MAX_COUNT)
{
return;
}
udsDtcTable[dtcIndex].dtcStatus.all = 0;
udsDtcTable[dtcIndex].dtcStatus.bit.testNcmpSlc = 1;
udsDtcTable[dtcIndex].dtcStatus.bit.testNcmpToc = 1;
udsDtcTable[dtcIndex].faultDtCnt = 0;
udsDtcTable[dtcIndex].AgingCnt = 0;
}
void Uds_LoadDtc(void)
{
/* code implemented by the user */
}
void Uds_SaveDtc(void)
{
/* code implemented by the user */
}
uint16_t Uds_GetDtcNumberByStatusMask(uint8_t mask)
{
uint16_t dtcCnt = 0;
uint8_t dtcState = 0;
uint16_t dtcNum = 0;
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
{
dtcState = (udsDtcTable[dtcCnt].dtcStatus.all & DTC_AVAILABILITY_STATUS_MASK);
if(0 != (dtcState & mask))
{
dtcNum++;
}
}
return dtcNum;
}
uint16_t Uds_GetDtcByStatusMask(uint8_t *pDtcBuf, uint16_t bufLen, uint8_t mask)
{
uint16_t dtcCnt = 0;
uint8_t dtcState = 0;
uint16_t dtcDlc = 0;
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
{
dtcState = udsDtcTable[dtcCnt].dtcStatus.all;
if(0 != (dtcState & mask))
{
if((dtcDlc + 4) <= bufLen)
{
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 16);
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 8);
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 0);
pDtcBuf[dtcDlc++] = (dtcState & DTC_AVAILABILITY_STATUS_MASK);
}
else
{
break;
}
}
}
return dtcDlc;
}
uint16_t Uds_GetSupportedDtc(uint8_t *pDtcBuf, uint16_t bufLen)
{
uint16_t dtcCnt = 0;
uint8_t dtcState = 0;
uint16_t dtcDlc = 0;
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
{
dtcState = udsDtcTable[dtcCnt].dtcStatus.all;
if((dtcDlc + 4) <= bufLen)
{
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 16);
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 8);
pDtcBuf[dtcDlc++] = (uint8_t)(udsDtcTable[dtcCnt].dtcCode >> 0);
pDtcBuf[dtcDlc++] = (dtcState & DTC_AVAILABILITY_STATUS_MASK);
}
else
{
break;
}
}
return dtcDlc;
}
void Uds_ClearDtcByGroup(uint32_t group)
{
uint16_t dtcCnt = 0;
switch(group)
{
case EMISSION_SYSTEM_GROUP:
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
{
if(udsDtcTable[dtcCnt].dtcCode <= DTCG_EMISSION_END)
{
Uds_ClearDtcByDtcIndex(dtcCnt);
}
}
break;
case SAFETY_SYSTEM_GROUP:
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
{
if((udsDtcTable[dtcCnt].dtcCode >= DTCG_CHASSIS_START) && (udsDtcTable[dtcCnt].dtcCode <= DTCG_CHASSIS_END))
{
Uds_ClearDtcByDtcIndex(dtcCnt);
}
}
break;
case ALL_FUNC_SYSTEM_GROUP:
for(dtcCnt = 0; dtcCnt < DTC_MAX_COUNT; dtcCnt++)
{
Uds_ClearDtcByDtcIndex(dtcCnt);
}
break;
}
}

View File

@ -0,0 +1,175 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_DTC_H_
#define _UDS_DTC_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS application
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
#define EMISSION_SYSTEM_GROUP (0x00FFFF33)
#define SAFETY_SYSTEM_GROUP (0x00FFFFD0)
#define ALL_FUNC_SYSTEM_GROUP (0x00FFFFFF)
#define REPORT_DTC_NUMBER_BY_STATUS_MASK (0x01)
#define REPORT_DTC_BY_STATUS_MASK (0x02)
#define REPORT_DTC_SNOPSHOT_IDENTIFICATION (0x03)
#define REPORT_DTC_SNOPSHOT_RECORD_BY_DTC_NUMBER (0x04)
#define REPORT_DTC_STORE_DATA_BY_RECORD_NUMBER (0x05)
#define REPORT_DTC_EXT_DATA_RECORD_BY_DTC_NUMBER (0x06)
#define REPORT_DTC_NUMBER_BY_SEVERITY_MASK_RECORD (0x07)
#define REPORT_DTC_BY_SEVERITY_MASK_RECORD (0x08)
#define REPORT_SUPPORTED_DTC (0x0a)
#define DTC_FORMAT_15031 (0x00)
#define DTC_FORMAT_14229 (0x01)
#define DTC_FORMAT_J1939 (0x02)
#define DTC_FORMAT_11992 (0x03)
#define DTC_AVAILABILITY_STATUS_MASK (0x7F)
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief The DTC Index name of UDS supported
*/
typedef enum _Uds_DtcIndexNameType_
{
DTC_FUEL_SENSOR_BELOW = 0,
DTC_FUEL_SENSOR_ABOVE,
DTC_BATT_VOLTAG_BELOW,
DTC_BATT_VOLTAG_ABOVE,
DTC_CAN_BUS_OFF,
DTC_COM_LOST_EMS,
DTC_COM_LOST_TCU,
DTC_COM_LOST_ABS,
DTC_COM_LOST_TPMS,
DTC_COM_LOST_EPB,
DTC_COM_LOST_ESP,
DTC_COM_LOST_EPS,
DTC_COM_LOST_BCM,
DTC_COM_LOST_SRS,
DTC_COM_LOST_DVD,
DTC_COM_LOST_PDC,
DTC_COM_LOST_ALS,
DTC_COM_LOST_PEPS,
DTC_COM_LOST_AC,
DTC_COM_LOST_AVM,
DTC_MAX_COUNT
} Uds_DtcIndexNameType;
/*! \brief The DTC status definition refers to ISO14229-1 D.2.4
* \note Bit 0, testFailed, clear by test pass or ClearDiagnosticInformation
* Bit 1, testFailedThisOperationCycle, clear by new OC or ClearDiagnosticInformation
* Bit 2, latch, pendingDTC, clear by fault never happened in cur OC or ClearDiagnosticInformation, if test not completed, must hold.
* Bit 3, latch, confirmedDTC, clear by ClearDiagnosticInformation, one(only by normal fault) or 40 OC not detect any fault.
* Bit 4, latch, testNotCompletedSinceLastClear, set by a new OC start or ClearDiagnosticInformation
* Bit 5, latch, testFailedSinceLastClear, clear by ClearDiagnosticInformation
* Bit 6, testNotCompletedThisOperationCycle
* Bit 7, warningIndicatorRequested(unsupported)
*/
typedef union _Uds_DtcStatusType_
{
uint8_t all;
struct
{
uint8_t testFailed : 1;
uint8_t testFailToc : 1;
uint8_t pending : 1;
uint8_t confirmed : 1;
uint8_t testNcmpSlc : 1;
uint8_t testFailSlc : 1;
uint8_t testNcmpToc : 1;
uint8_t wnIndreq : 1;
} bit;
} Uds_DtcStatusType;
/*! \brief The DTC definition of UDS
*/
typedef struct _Uds_DtcType_
{
uint32_t dtcCode;
Uds_DtcStatusType dtcStatus;
int16_t faultDtCnt; /* refers to ISO14229-1 D.6 */
uint8_t AgingCnt; /* refers to ISO14229-1 D.7 */
} Uds_DtcType;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief control DTC status updata stop and start
*/
extern void Uds_SetDtcOffCtrl(bool val);
/*! \brief get control DTC status
*/
extern bool Uds_GetDtcOffCtrlState(void);
/*! \brief clear DTC by dtc index
*/
extern void Uds_ClearDtcByDtcIndex(uint16_t dtcIndex);
/*! \brief load dtc data from EEPROM
*/
extern void Uds_LoadDtc(void);
/*! \brief save dtc data to EEPROM
*/
extern void Uds_SaveDtc(void);
/*! \brief get DTC counter by dtc status mask
*/
extern uint16_t Uds_GetDtcNumberByStatusMask(uint8_t mask);
/*! \brief get DTC data by dtc status mask
*/
extern uint16_t Uds_GetDtcByStatusMask(uint8_t *pDtcBuf, uint16_t bufLen, uint8_t mask);
/*! \brief get all supported DTC data
*/
extern uint16_t Uds_GetSupportedDtc(uint8_t *pDtcBuf, uint16_t bufLen);
/*! \brief clear DTC by dtc group
*/
extern void Uds_ClearDtcByGroup(uint32_t group);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_DTC_H_ */

View File

@ -0,0 +1,90 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service10.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService10_SessionControl(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint8_t subFunction;
uint8_t rspBuffer[8] = {0}; /* polyspace DEFECT:PARTIALLY_ACCESSED_ARRAY [No action planned:Low] "Still keep default though member6~7 is not written" */
if(msgLen != obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x10, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
subFunction = UDS_GET_SUB_FUNCTION (msgBuf[1]);
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x10);
rspBuffer[1] = subFunction;
rspBuffer[2] = (uint8_t)(obj->p2Server_ms >> 8);
rspBuffer[3] = (uint8_t)(obj->p2Server_ms & 0x00ff);
rspBuffer[4] = (uint8_t)(obj->p2xServer_10ms >> 8);
rspBuffer[5] = (uint8_t)(obj->p2xServer_10ms & 0x00ff);
switch(subFunction)
{
case UDS_SESSION_DEFAULT:
obj->securityLevel = UDS_SA_NONE;
obj->session = subFunction;
Uds_PositiveResponse(obj, rspBuffer, 6);
break;
case UDS_SESSION_EXTENDED:
obj->securityLevel = UDS_SA_NONE;
obj->session = subFunction;
Uds_PositiveResponse(obj, rspBuffer, 6);
break;
case UDS_SESSION_PROGRAMMING:
obj->securityLevel = UDS_SA_NONE;
obj->session = subFunction;
Uds_PositiveResponse(obj, rspBuffer, 6);
break;
case UDS_SESSION_SAFTY:
obj->securityLevel = UDS_SA_NONE;
obj->session = subFunction;
Uds_PositiveResponse(obj, rspBuffer, 6);
break;
default:
Uds_NegativeResponse(obj, 0x10, NRC_SUBFUNCTION_NOT_SUPPORTED);
break;
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE10_H_
#define _UDS_SERVICE10_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 10
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 10 processing
*/
extern void UdsService10_SessionControl(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE10_H_ */

View File

@ -0,0 +1,91 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service11.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief The Reset type definition of Uds
*/
typedef enum _UdsResetType_
{
UDS_RESET_NONE = 0,
UDS_RESET_HARD,
UDS_RESET_KEYOFFON,
UDS_RESET_SOFT
} UdsResetType;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService11_ResetEcu(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint8_t subFunction;
uint8_t rspBuffer[8] = {0}; /* polyspace DEFECT:PARTIALLY_ACCESSED_ARRAY [No action planned:Low] "Still keep default though member3~7 is not written" */
uint8_t powerDownTime = 0xFF;
if(msgLen != obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x11, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
subFunction = UDS_GET_SUB_FUNCTION(msgBuf[1]);
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x11);
rspBuffer[1] = subFunction;
rspBuffer[2] = powerDownTime;
switch(subFunction)
{
case UDS_RESET_HARD:
Uds_PositiveResponse(obj, rspBuffer, 3);
/*add hardware reset code*/
break;
case UDS_RESET_KEYOFFON:
Uds_PositiveResponse(obj, rspBuffer, 3);
/*add keyoffon reset code*/
break;
case UDS_RESET_SOFT:
Uds_PositiveResponse(obj, rspBuffer, 3);
/*add software reset code*/
break;
default:
Uds_NegativeResponse(obj, 0x11, NRC_SUBFUNCTION_NOT_SUPPORTED);
break;
}
}

View File

@ -0,0 +1,59 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE11_H_
#define _UDS_SERVICE11_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 11
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 11 processing
*/
extern void UdsService11_ResetEcu(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE11_H_ */

View File

@ -0,0 +1,76 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service14.h"
#include "uds_dtc.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService14_ClearDiagInfo(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint32_t dtcGroup = 0;
uint8_t rspBuffer[8] = {0};
if(msgLen != obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x14, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
dtcGroup |= ((uint32_t)msgBuf[1]) << 16;
dtcGroup |= ((uint32_t)msgBuf[2]) << 8;
dtcGroup |= ((uint32_t)msgBuf[3]) << 0;
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x14);
switch(dtcGroup)
{
case EMISSION_SYSTEM_GROUP:
case SAFETY_SYSTEM_GROUP:
case ALL_FUNC_SYSTEM_GROUP:
Uds_ClearDtcByGroup(dtcGroup);
Uds_PositiveResponse(obj, rspBuffer, 1);
break;
default:
Uds_NegativeResponse(obj, 0x14, NRC_REQUEST_OUT_OF_RANGE);
break;
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE14_H_
#define _UDS_SERVICE14_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 14
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 14 processing
*/
extern void UdsService14_ClearDiagInfo(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE14_H_ */

View File

@ -0,0 +1,163 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service19.h"
#include "uds_dtc.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService19_ReadDtcInformation(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint8_t subFunction = 0;
uint8_t dtcStatusMask = 0;
uint16_t dtcCount = 0;
uint16_t dtcDlc = 0;
uint8_t rspBuffer[UDS_RSP_LEN_MAX] = {0};
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
subFunction = UDS_GET_SUB_FUNCTION (msgBuf[1]);
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x19);
rspBuffer[1] = subFunction;
switch(subFunction)
{
case REPORT_DTC_NUMBER_BY_STATUS_MASK:
if(msgLen != 3)
{
Uds_NegativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
dtcStatusMask = msgBuf[2];
dtcCount = Uds_GetDtcNumberByStatusMask(dtcStatusMask);
rspBuffer[2] = DTC_AVAILABILITY_STATUS_MASK;
rspBuffer[3] = DTC_FORMAT_14229;
rspBuffer[4] = (dtcCount >> 8) & 0xFF;
rspBuffer[5] = (dtcCount >> 0) & 0xFF;
Uds_PositiveResponse(obj, rspBuffer, 6);
break;
case REPORT_DTC_BY_STATUS_MASK:
if(msgLen != 3)
{
Uds_NegativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
dtcStatusMask = msgBuf[2];
rspBuffer[2] = DTC_AVAILABILITY_STATUS_MASK;
dtcDlc = Uds_GetDtcByStatusMask(&rspBuffer[3], UDS_RSP_LEN_MAX - 3, dtcStatusMask);
Uds_PositiveResponse(obj, rspBuffer, dtcDlc + 3);
break;
#if 0
case REPORT_DTC_SNOPSHOT_IDENTIFICATION:
if(msgLen != 6)
{
UDS_negativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
/* add user code */
break;
case REPORT_DTC_SNOPSHOT_RECORD_BY_DTC_NUMBER:
if(msgLen != 6)
{
UDS_negativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
/* add user code */
break;
case REPORT_DTC_STORE_DATA_BY_RECORD_NUMBER:
if(msgLen != 3)
{
UDS_negativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
/* add user code */
break;
case REPORT_DTC_EXT_DATA_RECORD_BY_DTC_NUMBER:
if(msgLen != 6)
{
UDS_negativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
/* add user code */
break;
case REPORT_DTC_NUMBER_BY_SEVERITY_MASK_RECORD:
if(msgLen != 4)
{
UDS_negativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
/* add user code */
break;
case REPORT_DTC_BY_SEVERITY_MASK_RECORD:
if(msgLen != 4)
{
UDS_negativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
/* add user code */
break;
#endif
case REPORT_SUPPORTED_DTC:
if(msgLen != 2)
{
Uds_NegativeResponse(obj, 0x19, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
dtcDlc = Uds_GetSupportedDtc(&rspBuffer[3], UDS_RSP_LEN_MAX - 3);
Uds_PositiveResponse(obj, rspBuffer, dtcDlc + 3);
break;
default:
Uds_NegativeResponse(obj, 0x19, NRC_SUBFUNCTION_NOT_SUPPORTED);
break;
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE19_H_
#define _UDS_SERVICE19_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 19
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 19 processing
*/
extern void UdsService19_ReadDtcInformation(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE19_H_ */

View File

@ -0,0 +1,126 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <string.h>
#include "uds_service22.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService22_ReadDataByIdentifier(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint16_t didNum = 0;
uint16_t didValue = 0;
uint16_t rspLen = 0;
uint16_t msgPos = 0, didIdx = 0;
bool findDid = false;
uint8_t rspBuffer[UDS_RSP_LEN_MAX] = {0};
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x22, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
if(0 != (msgLen - 1) % sizeof(uint16_t))
{
Uds_NegativeResponse(obj, 0x22, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
didNum = msgLen / sizeof(uint16_t);
if(0 == didNum)
{
Uds_NegativeResponse(obj, 0x22, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
rspBuffer[rspLen++] = UDS_GET_POSITIVE_RSP(0x22);
for(msgPos = 1; msgPos < msgLen; msgPos += 2)
{
didValue = ((uint16_t)msgBuf[msgPos]) << 8;
didValue |= msgBuf[msgPos + 1];
findDid = false;
for(didIdx = 0; didIdx < obj->didNum; didIdx++)
{
if(obj->didTable[didIdx].did == didValue)
{
if(obj->securityLevel != obj->didTable[didIdx].securityLevel)
{
Uds_NegativeResponse(obj, 0x22, NRC_SECURITY_ACCESS_DENIED);
return;
}
else if((rspLen + 2 + obj->didTable[didIdx].length) > UDS_RSP_LEN_MAX)
{
Uds_NegativeResponse(obj, 0x22, NRC_RESPONSE_TOO_LONG);
return;
}
if((UDS_DID_TYPE_NVM_WO == obj->didTable[didIdx].type) || (obj->session < obj->didTable[didIdx].sessionLevel))
{
Uds_NegativeResponse(obj, 0x22, NRC_CONDITIONS_NOT_CORRECT);
return;
}
obj->didTable[didIdx].function(obj, obj->didTable[didIdx].pBytes, obj->didTable[didIdx].length);
findDid = true;
rspBuffer[rspLen++] = msgBuf[msgPos];
rspBuffer[rspLen++] = msgBuf[msgPos + 1];
memcpy(&rspBuffer[rspLen], obj->didTable[didIdx].pBytes, obj->didTable[didIdx].length);
rspLen += obj->didTable[didIdx].length;
break;
}
}
if(false == findDid)
{
break;
}
}
if(true == findDid)
{
Uds_PositiveResponse(obj, rspBuffer, rspLen);
}
else
{
Uds_NegativeResponse(obj, 0x22, NRC_REQUEST_OUT_OF_RANGE);
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE22_H_
#define _UDS_SERVICE22_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 22
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 22 processing
*/
extern void UdsService22_ReadDataByIdentifier(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE22_H_ */

View File

@ -0,0 +1,213 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <string.h>
#include "uds_service27.h"
/*******************************************************************************
* the defines
******************************************************************************/
#define SUPPORT_LEVEL_NUM 4 /* supported security level number */
#define MAX_ALLOW_ERROR_NUM 5 /* the max allow number of key error */
#define STARTUP_DELAY_MS 2000 /* the service allow access time delay after UDS start */
#define ERR_EXCEED_DELAY_MS 10000 /* the service allow access time delay after error number exceed */
/*******************************************************************************
* the typedefs
******************************************************************************/
typedef struct _SecurityLevel_Param_
{
uint8_t level;
uint8_t keyErrorCnt;
uint8_t maxErrNum;
int64_t MaxErrTimeStamp;
} SecurityLevel_Param;
/*******************************************************************************
* the globals
******************************************************************************/
SecurityLevel_Param scrtParam[SUPPORT_LEVEL_NUM] = {
{UDS_SA_LEVEL_1, 0, MAX_ALLOW_ERROR_NUM, 0},
{UDS_SA_LEVEL_3, 0, MAX_ALLOW_ERROR_NUM, 0},
{UDS_SA_LEVEL_11, 0, MAX_ALLOW_ERROR_NUM, 0},
{UDS_SA_LEVEL_63, 0, MAX_ALLOW_ERROR_NUM, 0},
};
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
static void UdsSecurityAccess_GenerateSeed(UdsType *obj, uint8_t newLevel, uint8_t *outData, uint8_t outBufsize, uint16_t *outLen)
{
/* seed is defined by user, It's usually a random value */
uint8_t seed[4] = {1, 2, 3, 4};
if(outBufsize < sizeof(seed))
{
return;
}
*outLen = sizeof(seed);
if(newLevel == obj->securityLevel)
{
memset(outData, 0, sizeof(seed));
}
else
{
memcpy(outData, seed, sizeof(seed));
}
}
static bool UdsSecurityAccess_ValidateKey(uint8_t seedLevel, const uint8_t *seed, uint16_t seedLen, const uint8_t *key, uint16_t keyLen)
{
/* The encryption algorithm is provided by the vehicle manufacturer */
return true;
}
void UdsService27_SecurityAccess(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
static uint8_t seedLevel = 0;
static uint8_t seedValue[8] = {0};
static uint16_t seedLen = 0;
uint8_t subFunction;
uint8_t udx = 0;
uint8_t rspBuffer[8] = {0};
uint16_t dataLen = 0, remainSize = 0;
bool ret = false;
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x27, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
if(obj->session == UDS_SESSION_DEFAULT)
{
Uds_NegativeResponse(obj, 0x27, NRC_CONDITIONS_NOT_CORRECT);
return;
}
if(obj->timeStamp_ms < STARTUP_DELAY_MS)
{
Uds_NegativeResponse(obj, 0x27, NRC_REQUIRED_TIME_DELAY_NOT_EXPIRED);
return;
}
subFunction = UDS_GET_SUB_FUNCTION(msgBuf[1]);
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x27);
rspBuffer[1] = subFunction;
if(subFunction % 2)
{
seedLevel = 0;
for(udx = 0; udx < SUPPORT_LEVEL_NUM; udx++)
{
if(subFunction == scrtParam[udx].level)
{
if(scrtParam[udx].keyErrorCnt > scrtParam[udx].maxErrNum)
{
if(obj->timeStamp_ms - scrtParam[udx].MaxErrTimeStamp < ERR_EXCEED_DELAY_MS)
{
Uds_NegativeResponse(obj, 0x27, NRC_EXCEEDED_NUMBER_OF_ATTEMPTS);
return;
}
else
{
scrtParam[udx].keyErrorCnt = 0;
}
}
break;
}
}
if(udx >= SUPPORT_LEVEL_NUM)
{
Uds_NegativeResponse(obj, 0x27, NRC_REQUEST_OUT_OF_RANGE);
return;
}
remainSize = sizeof(rspBuffer) - 2;
UdsSecurityAccess_GenerateSeed(obj, subFunction, &rspBuffer[2], remainSize, &dataLen);
if(dataLen > 0)
{
Uds_PositiveResponse(obj, rspBuffer, dataLen + 2);
seedLevel = subFunction;
seedLen = dataLen;
memcpy(seedValue, &rspBuffer[2], dataLen);
}
else
{
Uds_NegativeResponse(obj, 0x27, NRC_REQUEST_OUT_OF_RANGE);
}
}
else
{
if(subFunction != seedLevel + 1)
{
Uds_NegativeResponse(obj, 0x27, NRC_REQUEST_SEQUENCE_ERROR);
return;
}
/* polyspace-begin DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
ret = UdsSecurityAccess_ValidateKey(seedLevel, seedValue, seedLen, &msgBuf[2], msgLen - 2);
if(ret == true)
{
Uds_PositiveResponse(obj, rspBuffer, 2);
seedLevel = 0;
obj->securityLevel = subFunction - 1;
for(udx = 0; udx < SUPPORT_LEVEL_NUM; udx++)
{
if(subFunction == scrtParam[udx].level)
{
scrtParam[udx].keyErrorCnt = 0;
}
}
}
else
{
Uds_NegativeResponse(obj, 0x27, NRC_INVALID_KEY);
for(udx = 0; udx < SUPPORT_LEVEL_NUM; udx++)
{
if(seedLevel == scrtParam[udx].level)
{
scrtParam[udx].keyErrorCnt++;
if(scrtParam[udx].keyErrorCnt > scrtParam[udx].maxErrNum)
{
scrtParam[udx].MaxErrTimeStamp = obj->timeStamp_ms;
}
}
}
}
/* polyspace-end DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE27_H_
#define _UDS_SERVICE27_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 27
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 27 processing
*/
extern void UdsService27_SecurityAccess(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE27_H_ */

View File

@ -0,0 +1,147 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service28.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief The uds communication type definition of UDS
*/
typedef enum _UdsComType_
{
UDS_CC_TYPE_NONE = 0,
UDS_CC_TYPE_NORMAL, /* normal message */
UDS_CC_TYPE_NM, /* network management */
UDS_CC_TYPE_NOR_NM, /* normal and network management message */
} UdsComType;
/*! \brief The uds communication control mode definition of UDS
*/
typedef enum _UdsComCtrlMode_
{
UDS_CC_MODE_RX_TX = 0,
UDS_CC_MODE_RX_NO,
UDS_CC_MODE_NO_TX,
UDS_CC_MODE_NO_NO
} UdsComCtrMode;
/*******************************************************************************
* the globals
******************************************************************************/
static uint8_t udsComCtrlType = 0;
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
uint8_t Uds_GetCommunicationControlMode(void)
{
return udsComCtrlType;
}
void UdsService28_CommunicationControl(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint8_t subFunction;
uint8_t rspBuffer[8] = {0}; /* polyspace DEFECT:PARTIALLY_ACCESSED_ARRAY [No action planned:Low] "Still keep default though member2~7 is not written" */
uint8_t ccType = 0;
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x28, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
if(obj->session == UDS_SESSION_DEFAULT)
{
Uds_NegativeResponse(obj, 0x28, NRC_CONDITIONS_NOT_CORRECT);
return;
}
subFunction = UDS_GET_SUB_FUNCTION(msgBuf[1]);
ccType = msgBuf[2];
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x28);
rspBuffer[1] = subFunction;
switch(subFunction)
{
case UDS_CC_MODE_RX_TX:
if(ccType == UDS_CC_TYPE_NORMAL || ccType == UDS_CC_TYPE_NM || ccType == UDS_CC_TYPE_NOR_NM)
{
udsComCtrlType = UDS_CC_MODE_RX_TX;
Uds_PositiveResponse(obj, rspBuffer, 2);
}
else
{
Uds_NegativeResponse(obj, 0x28, NRC_REQUEST_OUT_OF_RANGE);
}
break;
case UDS_CC_MODE_RX_NO:
if(ccType == UDS_CC_TYPE_NORMAL || ccType == UDS_CC_TYPE_NM || ccType == UDS_CC_TYPE_NOR_NM)
{
udsComCtrlType = UDS_CC_MODE_RX_NO;
Uds_PositiveResponse(obj, rspBuffer, 2);
}
else
{
Uds_NegativeResponse(obj, 0x28, NRC_REQUEST_OUT_OF_RANGE);
}
break;
case UDS_CC_MODE_NO_TX:
if(ccType == UDS_CC_TYPE_NORMAL || ccType == UDS_CC_TYPE_NM || ccType == UDS_CC_TYPE_NOR_NM)
{
udsComCtrlType = UDS_CC_MODE_NO_TX;
Uds_PositiveResponse(obj, rspBuffer, 2);
}
else
{
Uds_NegativeResponse(obj, 0x28, NRC_REQUEST_OUT_OF_RANGE);
}
break;
case UDS_CC_MODE_NO_NO:
if(ccType == UDS_CC_TYPE_NORMAL || ccType == UDS_CC_TYPE_NM || ccType == UDS_CC_TYPE_NOR_NM)
{
udsComCtrlType = UDS_CC_MODE_NO_NO;
Uds_PositiveResponse(obj, rspBuffer, 2);
}
else
{
Uds_NegativeResponse(obj, 0x28, NRC_REQUEST_OUT_OF_RANGE);
}
break;
default:
Uds_NegativeResponse(obj, 0x28, NRC_SUBFUNCTION_NOT_SUPPORTED);
break;
}
}

View File

@ -0,0 +1,64 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE28_H_
#define _UDS_SERVICE28_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 28
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Get Communication Control Mode
*/
uint8_t Uds_GetCommunicationControlMode(void);
/*! \brief Uds Service 28 processing
*/
extern void UdsService28_CommunicationControl(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE28_H_ */

View File

@ -0,0 +1,107 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <string.h>
#include "uds_service2E.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService2E_WriteDataByIdentifier(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint16_t didValue = 0;
uint16_t didIdx = 0;
uint8_t rspBuffer[8] = {0};
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x2E, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
didValue = ((uint16_t)msgBuf[1]) << 8;
didValue |= msgBuf[2];
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x2E);
rspBuffer[1] = msgBuf[1];
rspBuffer[2] = msgBuf[2];
for(didIdx = 0; didIdx < obj->didNum; didIdx++)
{
if(obj->didTable[didIdx].did == didValue)
{
if((obj->didTable[didIdx].securityLevel != UDS_SA_NONE) && (obj->securityLevel != obj->didTable[didIdx].securityLevel))
{
Uds_NegativeResponse(obj, 0x22, NRC_SECURITY_ACCESS_DENIED);
return;
}
else if((msgLen - 3) != obj->didTable[didIdx].length)
{
Uds_NegativeResponse(obj, 0x2E, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
if((UDS_DID_TYPE_NVM_RO == obj->didTable[didIdx].type) || (obj->session < obj->didTable[didIdx].sessionLevel))
{
Uds_NegativeResponse(obj, 0x2E, NRC_CONDITIONS_NOT_CORRECT);
return;
}
memcpy(obj->didTable[didIdx].pBytes, &msgBuf[3], obj->didTable[didIdx].length);
/* add user code to save data */
/* check save data success */
/* polyspace-begin DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
if(1)
{
Uds_PositiveResponse(obj, rspBuffer, 3);
return;
}
else
{
Uds_NegativeResponse(obj, 0x2E, NRC_GENERAL_PROGRAMMING_FAILURE);
return;
}
/* polyspace-end DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
}
}
Uds_NegativeResponse(obj, 0x2E, NRC_REQUEST_OUT_OF_RANGE);
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE2E_H_
#define _UDS_SERVICE2E_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 2E
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 2E processing
*/
extern void UdsService2E_WriteDataByIdentifier(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE2E_H_ */

View File

@ -0,0 +1,189 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stddef.h>
#include <string.h>
#include "uds_service2F.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief The Uds IO control type
*/
typedef enum _UdsIoCtrlType_
{
UDS_IOCTRL_RETURN_TO_ECU = 0x00,
UDS_IOCTRL_RETSET_TO_DEFAULT = 0x01,
UDS_IOCTRL_FREEZE_CURRENT_STATE = 0x02,
UDS_IOCTRL_SHORT_ADJUSTMENT = 0x03
} UdsIoCtrlType;
/*! \brief The Uds IO control struct
*/
typedef struct _Uds_IoCtrl_
{
uint16_t did;
uint8_t securityLevel;
uint8_t *pData;
uint8_t dataLen;
uint8_t defaultValue;
uint8_t step;
bool enable;
void (*IoCtrl_Init)(void);
void (*IoCtrl_Stop)(void);
} Uds_IoCtrl;
/*! \brief The IoControl-by-ID definition of UDS
*/
typedef struct _Uds_IoCtrlBuf_
{
uint8_t backlightLevel[2];
uint8_t buzzer[2];
} Uds_IoCtrlBuf;
/*******************************************************************************
* the constants
******************************************************************************/
static void IoCtrl_InitBackLight(void);
static void IoCtrl_StopBacklight(void);
static void IoCtrl_InitBuzzer(void);
static void IoCtrl_StopBuzzer(void);
/*******************************************************************************
* the globals
******************************************************************************/
Uds_IoCtrlBuf udsIoCtrlBuffer;
Uds_IoCtrl udsIoCtrlTable[] = {
{0xF092, UDS_SA_NONE, udsIoCtrlBuffer.backlightLevel, 2, 0, 0, 0, &IoCtrl_InitBackLight, &IoCtrl_StopBacklight},
{0xF020, UDS_SA_NONE, udsIoCtrlBuffer.buzzer, 2, 0, 0, 0, &IoCtrl_InitBuzzer, &IoCtrl_StopBuzzer },
};
/*******************************************************************************
* the functions
******************************************************************************/
static void IoCtrl_InitBackLight(void)
{
/* user add back light control code */
}
static void IoCtrl_StopBacklight(void)
{
/* user add back light stop code */
}
static void IoCtrl_InitBuzzer(void)
{
/* user add buzzer control code */
}
static void IoCtrl_StopBuzzer(void)
{
/* user add buzzer stop code */
}
void UdsService2F_InputOutputCtrlById(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint16_t ioCtrlId = 0;
uint8_t ioCtrlParam = 0;
uint8_t ioCtrlIndex = 0;
uint8_t ioCtrlNum = sizeof(udsIoCtrlTable) / sizeof(udsIoCtrlTable[0]);
uint8_t rspBuffer[UDS_RSP_LEN_MAX] = {0};
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x2F, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
if(obj->session == UDS_SESSION_DEFAULT)
{
Uds_NegativeResponse(obj, 0x2F, NRC_CONDITIONS_NOT_CORRECT);
return;
}
ioCtrlId = ((uint16_t)msgBuf[1] << 8) + msgBuf[2];
ioCtrlParam = msgBuf[3];
for(ioCtrlIndex = 0; ioCtrlIndex < ioCtrlNum; ioCtrlIndex++)
{
if(udsIoCtrlTable[ioCtrlIndex].did == ioCtrlId)
{
if((udsIoCtrlTable[ioCtrlIndex].securityLevel != UDS_SA_NONE) && (udsIoCtrlTable[ioCtrlIndex].securityLevel != obj->securityLevel))
{
Uds_NegativeResponse(obj, 0x2F, NRC_SECURITY_ACCESS_DENIED);
return;
}
break;
}
}
if(ioCtrlIndex >= ioCtrlNum)
{
Uds_NegativeResponse(obj, 0x2F, NRC_REQUEST_OUT_OF_RANGE);
return;
}
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x2F);
rspBuffer[1] = msgBuf[1];
rspBuffer[2] = msgBuf[2];
rspBuffer[3] = msgBuf[3];
switch(ioCtrlParam)
{
case UDS_IOCTRL_RETURN_TO_ECU:
/* add user code */
udsIoCtrlTable[ioCtrlIndex].enable = false;
if(udsIoCtrlTable[ioCtrlIndex].IoCtrl_Stop != NULL)
{
udsIoCtrlTable[ioCtrlIndex].IoCtrl_Stop();
Uds_PositiveResponse(obj, rspBuffer, 4);
}
break;
case UDS_IOCTRL_SHORT_ADJUSTMENT:
/* add user code */
if(msgLen < (udsIoCtrlTable[ioCtrlIndex].dataLen + 4))
{
Uds_NegativeResponse(obj, 0x2F, NRC_CONDITIONS_NOT_CORRECT);
return;
}
udsIoCtrlTable[ioCtrlIndex].enable = true;
memcpy(udsIoCtrlTable[ioCtrlIndex].pData, &msgBuf[4], udsIoCtrlTable[ioCtrlIndex].dataLen);
if(udsIoCtrlTable[ioCtrlIndex].IoCtrl_Init != NULL)
{
udsIoCtrlTable[ioCtrlIndex].IoCtrl_Init();
Uds_PositiveResponse(obj, rspBuffer, 4);
}
break;
default:
Uds_NegativeResponse(obj, 0x2F, NRC_REQUEST_OUT_OF_RANGE);
break;
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE2F_H_
#define _UDS_SERVICE2F_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 2F
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 2F processing
*/
extern void UdsService2F_InputOutputCtrlById(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE2F_H_ */

View File

@ -0,0 +1,278 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service31.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief The Uds routine control type
*/
typedef enum _UdsRoutineCtrlType_
{
UDS_ROUTINE_CTRL_NONE = 0,
UDS_ROUTINE_CTRL_START = 0x01,
UDS_ROUTINE_CTRL_STOP = 0x02,
UDS_ROUTINE_CTRL_REQUEST_RESULT = 0x03
} UdsRoutineCtrlType;
/*! \brief The Uds routine control status
*/
typedef enum _UdsRtnCtrlStatus_
{
UDS_RTN_ST_IDLE = 0x00,
UDS_RTN_ST_RUNNING = 0x01,
} UdsRtnCtrlStatus;
/*! \brief The Uds routine control struct
*/
typedef struct _Uds_RtnCtrl_
{
uint16_t rtnCtrlId;
uint8_t sessionLevel;
uint8_t securityLevel;
UdsRtnCtrlStatus rtnStatus;
void (*Routine_Start)(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
void (*Routine_Stop)(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
void (*Routine_Result)(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
} Uds_RtnCtrl;
/*******************************************************************************
* the constants
******************************************************************************/
static void Routine_StartEreaseMemory(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_StopEreaseMemory(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_EreaseMemoryResult(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_StartCheckProgramDependencies(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_StopCheckProgramDependencies(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_CheckProgramDependenciesResult(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_StartEreaseMirrorMemDtcs(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_StopEreaseMirrorMemDtcs(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
static void Routine_EreaseMirrorMemDtcsResult(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen);
/*******************************************************************************
* the globals
******************************************************************************/
Uds_RtnCtrl udsRtnCtrlTable[] = {
{0xFF00, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, UDS_RTN_ST_IDLE, &Routine_StartEreaseMemory, &Routine_StopEreaseMemory, &Routine_EreaseMemoryResult },
{0xFF01, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, UDS_RTN_ST_IDLE, &Routine_StartCheckProgramDependencies, &Routine_StopCheckProgramDependencies, &Routine_CheckProgramDependenciesResult},
{0xFF02, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, UDS_RTN_ST_IDLE, &Routine_StartEreaseMirrorMemDtcs, &Routine_StopEreaseMirrorMemDtcs, &Routine_EreaseMirrorMemDtcsResult },
};
/*******************************************************************************
* the functions
******************************************************************************/
void Routine_StatusInit(uint16_t routineId)
{
uint8_t rtnIndex = 0;
uint8_t rntNum = sizeof(udsRtnCtrlTable) / sizeof(Uds_RtnCtrl);
for(rtnIndex = 0; rtnIndex < rntNum; rtnIndex++)
{
if(udsRtnCtrlTable[rtnIndex].rtnCtrlId == routineId)
{
udsRtnCtrlTable[rtnIndex].rtnStatus = UDS_RTN_ST_IDLE;
}
}
}
static void Routine_StartEreaseMemory(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add start erease memory code */
}
static void Routine_StopEreaseMemory(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add stop erease memory code */
}
static void Routine_EreaseMemoryResult(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add erease memory result code */
}
static void Routine_StartCheckProgramDependencies(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add start check program dependencies code */
}
static void Routine_StopCheckProgramDependencies(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add stop check program dependencies code */
}
static void Routine_CheckProgramDependenciesResult(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add check program dependencies result code */
}
static void Routine_StartEreaseMirrorMemDtcs(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add start erease mirror memory Dtcs code */
}
static void Routine_StopEreaseMirrorMemDtcs(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add stop erease mirror memory Dtcs code */
}
static void Routine_EreaseMirrorMemDtcsResult(const uint8_t *pdata, uint16_t len, uint8_t *pRspData, uint16_t rspSize, uint16_t *pRspLen)
{
if(pdata == NULL)
{
return;
}
/* user add erease mirror memory Dtcs resultl code */
}
void UdsService31_RoutineControl(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
const uint8_t *pOptionParam = NULL;
uint8_t subFunction = 0;
uint16_t optionParamLen = 0;
uint16_t routineId = 0;
uint8_t rtnIndex = 0;
uint8_t rntNum = sizeof(udsRtnCtrlTable) / sizeof(Uds_RtnCtrl);
uint8_t rspBuffer[UDS_RSP_LEN_MAX] = {0};
uint16_t rspLen = 0;
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x31, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
subFunction = UDS_GET_SUB_FUNCTION(msgBuf[1]);
routineId = ((uint16_t)msgBuf[2] << 8) + msgBuf[3];
optionParamLen = msgLen - 4;
if(optionParamLen > 0)
{
pOptionParam = &msgBuf[4];
}
for(rtnIndex = 0; rtnIndex < rntNum; rtnIndex++)
{
if(udsRtnCtrlTable[rtnIndex].rtnCtrlId == routineId)
{
if(obj->session == udsRtnCtrlTable[rtnIndex].sessionLevel)
{
if((udsRtnCtrlTable[rtnIndex].securityLevel != UDS_SA_NONE) && (udsRtnCtrlTable[rtnIndex].securityLevel != obj->securityLevel))
{
Uds_NegativeResponse(obj, 0x31, NRC_SECURITY_ACCESS_DENIED);
return;
}
break;
}
else
{
Uds_NegativeResponse(obj, 0x31, NRC_CONDITIONS_NOT_CORRECT);
return;
}
}
}
if(rtnIndex >= rntNum)
{
Uds_NegativeResponse(obj, 0x31, NRC_REQUEST_OUT_OF_RANGE);
return;
}
memset(rspBuffer, 0, UDS_RSP_LEN_MAX);
switch(subFunction)
{
case UDS_ROUTINE_CTRL_START:
udsRtnCtrlTable[rtnIndex].Routine_Start(pOptionParam, optionParamLen, rspBuffer, UDS_RSP_LEN_MAX, &rspLen);
udsRtnCtrlTable[rtnIndex].rtnStatus = UDS_RTN_ST_RUNNING;
break;
case UDS_ROUTINE_CTRL_STOP:
if(udsRtnCtrlTable[rtnIndex].rtnStatus != UDS_RTN_ST_IDLE)
{
udsRtnCtrlTable[rtnIndex].Routine_Stop(pOptionParam, optionParamLen, rspBuffer, UDS_RSP_LEN_MAX, &rspLen);
udsRtnCtrlTable[rtnIndex].rtnStatus = UDS_RTN_ST_IDLE;
}
break;
case UDS_ROUTINE_CTRL_REQUEST_RESULT:
if(udsRtnCtrlTable[rtnIndex].rtnStatus != UDS_RTN_ST_IDLE)
{
udsRtnCtrlTable[rtnIndex].Routine_Result(pOptionParam, optionParamLen, rspBuffer, UDS_RSP_LEN_MAX, &rspLen);
}
break;
default:
Uds_NegativeResponse(obj, 0x31, NRC_SUBFUNCTION_NOT_SUPPORTED);
return;
}
/* polyspace-begin DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
if((rspLen >= 4) && (rspBuffer[0] == UDS_GET_POSITIVE_RSP(0x31)))
{
Uds_PositiveResponse(obj, rspBuffer, rspLen);
}
else if((rspLen == 3) && (rspBuffer[0] == NEGATIVE_RSP))
{
Uds_NegativeResponse(obj, 0x31, rspBuffer[2]);
}
else
{
Uds_NegativeResponse(obj, 0x31, NRC_REQUEST_SEQUENCE_ERROR);
}
/* polyspace-end DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
}

View File

@ -0,0 +1,62 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE31_H_
#define _UDS_SERVICE31_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 31
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 31 processing
*/
extern void UdsService31_RoutineControl(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
/*! \brief Routine status init
*/
extern void Routine_StatusInit(uint16_t routineId);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE31_H_ */

View File

@ -0,0 +1,146 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service34.h"
#include "uds_service36.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
uint32_t Uds_GetMaxfBlockSize(void)
{
/* user add code to get max num of block length */
return 128;
}
uint8_t Uds_GetValidBytesNumOfData(uint32_t data)
{
uint8_t index = 0;
uint8_t bytesNum = 0;
for(index = 1; index <= 4; index++)
{
if(data >> ((4 - index) * 8))
{
bytesNum = 4 - index + 1;
break;
}
}
return bytesNum;
}
void UdsService34_RequestDownload(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint32_t memAddress = 0;
uint8_t memAddrLen = 0;
uint32_t memSize = 0;
uint8_t memSizeLen = 0;
uint8_t maxBlockSizeLen = 0;
uint32_t maxBlockSize = 0;
uint8_t index = 0;
uint16_t rspLen = 0;
uint8_t rspBuffer[8];
if(obj->session == UDS_SESSION_DEFAULT)
{
Uds_NegativeResponse(obj, 0x34, NRC_CONDITIONS_NOT_CORRECT);
return;
}
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x34, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
memAddrLen = msgBuf[2] & 0x0F;
memSizeLen = msgBuf[2] >> 4;
if((memAddrLen == 0) || (memAddrLen > sizeof(memAddress)) || (memSizeLen == 0) || (memSizeLen > sizeof(memSize)))
{
Uds_NegativeResponse(obj, 0x34, NRC_REQUEST_OUT_OF_RANGE);
return;
}
for(index = 0; index < memAddrLen; index++)
{
memAddress <<= 8;
memAddress += msgBuf[3 + index];
}
for(index = 0; index < memSizeLen; index++)
{
memSize <<= 8;
memSize += msgBuf[3 + memAddrLen + index];
}
if(memSize == 0)
{
Uds_NegativeResponse(obj, 0x34, NRC_CONDITIONS_NOT_CORRECT);
return;
}
/* user add judge code for the security level */
if(0)
{
Uds_NegativeResponse(obj, 0x34, NRC_SECURITY_ACCESS_DENIED);
return;
}
Uds_SetMemAddr(memAddress);
Uds_SetMemSize(memSize);
Uds_SetDataTransferDirect(UDS_TRANSFER_DIR_DOWNLOAD);
maxBlockSize = Uds_GetMaxfBlockSize();
maxBlockSizeLen = Uds_GetValidBytesNumOfData(maxBlockSize);
rspBuffer[rspLen++] = UDS_GET_POSITIVE_RSP(0x34);
rspBuffer[rspLen++] = maxBlockSizeLen << 4;
for(index = 1; index <= maxBlockSizeLen; index++)
{
rspBuffer[rspLen++] = maxBlockSize >> (8 * (maxBlockSizeLen - index));
}
Uds_PositiveResponse(obj, rspBuffer, rspLen);
}

View File

@ -0,0 +1,61 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE34_H_
#define _UDS_SERVICE34_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 34
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 34 processing
*/
extern void UdsService34_RequestDownload(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE34_H_ */

View File

@ -0,0 +1,160 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service36.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
static uint32_t s_memAddr = 0;
static uint32_t s_memSize = 0;
static UdsTransDirType s_dataTransDir = UDS_TRANSFER_DIR_NONE;
static uint8_t s_curRcvSequence = 0;
static uint8_t s_lastRcvSqunce = 0;
static uint32_t s_rcvDataTotalLen = 0;
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void Uds_SetMemAddr(uint32_t addr)
{
s_memAddr = addr;
}
uint32_t Uds_GetMemAddr(void)
{
return s_memAddr;
}
void Uds_SetMemSize(uint32_t size)
{
s_memSize = size;
}
uint32_t Uds_GetMemSize(void)
{
return s_memSize;
}
void Uds_SetDataTransferDirect(UdsTransDirType dirType)
{
s_dataTransDir = dirType;
/* clear sequence number */
s_lastRcvSqunce = 0x00;
s_curRcvSequence = 0x00;
/* clear receive data total number */
s_rcvDataTotalLen = 0x00;
}
UdsTransDirType Uds_GetDataTransferDirect(void)
{
return s_dataTransDir;
}
uint32_t Uds_GetRcvDataTotalLen(void)
{
return s_rcvDataTotalLen;
}
void UdsService36_TransferData(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint16_t rspLen = 0;
uint8_t rspBuffer[UDS_RSP_LEN_MAX] = {0}; /* polyspace DEFECT:PARTIALLY_ACCESSED_ARRAY [No action planned:Low] "Still reserve though member2~511 is not written" */
if(obj->session == UDS_SESSION_DEFAULT)
{
Uds_NegativeResponse(obj, 0x36, NRC_CONDITIONS_NOT_CORRECT);
return;
}
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x36, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
switch(s_dataTransDir)
{
case UDS_TRANSFER_DIR_DOWNLOAD:
s_curRcvSequence = msgBuf[1];
if((s_curRcvSequence != s_lastRcvSqunce) && (s_curRcvSequence != ((uint8_t)(s_lastRcvSqunce + 1))))
{
Uds_NegativeResponse(obj, 0x36, NRC_WRONG_BLOCK_SEQUENCE_COUNTER);
return;
}
rspBuffer[rspLen++] = UDS_GET_POSITIVE_RSP(0x36);
rspBuffer[rspLen++] = msgBuf[1];
if(s_curRcvSequence == s_lastRcvSqunce)
{
Uds_PositiveResponse(obj, rspBuffer, rspLen);
return;
}
if((s_rcvDataTotalLen + msgLen - 2) > s_memSize)
{
Uds_NegativeResponse(obj, 0x36, NRC_TRANSFER_DATA_SUSPENDED);
return;
}
/* user add code to deal with download data */
/* polyspace-begin DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
if(1) /* deal success */
{
s_rcvDataTotalLen += msgLen - 2;
s_lastRcvSqunce = s_curRcvSequence;
Uds_PositiveResponse(obj, rspBuffer, rspLen);
}
else
{
Uds_NegativeResponse(obj, 0x36, NRC_GENERAL_PROGRAMMING_FAILURE);
}
/* polyspace-end DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
break;
case UDS_TRANSFER_DIR_UPLOAD:
Uds_NegativeResponse(obj, 0x36, NRC_REQUEST_OUT_OF_RANGE);
break;
default:
Uds_NegativeResponse(obj, 0x36, NRC_REQUEST_SEQUENCE_ERROR);
break;
}
}

View File

@ -0,0 +1,97 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE36_H_
#define _UDS_SERVICE36_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 36
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief The Uds IO control type
*/
typedef enum _UdsTransDirType_
{
UDS_TRANSFER_DIR_NONE = 0x00,
UDS_TRANSFER_DIR_DOWNLOAD = 0x01,
UDS_TRANSFER_DIR_UPLOAD = 0x02,
} UdsTransDirType;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief set memery start address
*/
extern void Uds_SetMemAddr(uint32_t addr);
/*! \brief get memery start address
*/
extern uint32_t Uds_GetMemAddr(void);
/*! \brief set memery size
*/
extern void Uds_SetMemSize(uint32_t size);
/*! \brief get memery size
*/
extern uint32_t Uds_GetMemSize(void);
/*! \brief set data transfer direct
*/
extern void Uds_SetDataTransferDirect(UdsTransDirType dirType);
/*! \brief get data transfer direct
*/
extern UdsTransDirType Uds_GetDataTransferDirect(void);
/*! \brief get receive data total len
*/
extern uint32_t Uds_GetRcvDataTotalLen(void);
/*! \brief Uds Service 10 processing
*/
extern void UdsService36_TransferData(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE36_H_ */

View File

@ -0,0 +1,95 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service36.h"
#include "uds_service37.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService37_RequestTransferExit(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint16_t rspLen = 0;
uint8_t rspBuffer[8] ={0}; /* polyspace DEFECT:PARTIALLY_ACCESSED_ARRAY [No action planned:Low] "Still reserve though member1~7 is not written" */
if(obj->session == UDS_SESSION_DEFAULT)
{
Uds_NegativeResponse(obj, 0x37, NRC_CONDITIONS_NOT_CORRECT);
return;
}
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x37, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
rspBuffer[rspLen++] = UDS_GET_POSITIVE_RSP(0x37);
switch(Uds_GetDataTransferDirect())
{
case UDS_TRANSFER_DIR_DOWNLOAD:
if(Uds_GetRcvDataTotalLen() != Uds_GetMemSize())
{
Uds_NegativeResponse(obj, 0x37, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
break;
}
/* user add process code, example data CRC */
/* polyspace-begin DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
if(1) /* result check correct */
{
Uds_PositiveResponse(obj, rspBuffer, rspLen);
}
else
{
Uds_NegativeResponse(obj, 0x37, NRC_GENERAL_PROGRAMMING_FAILURE);
}
/* polyspace-end DEFECT:DEAD_CODE [No action planned:Low] "Still reserve though it's maybe unreachable" */
break;
case UDS_TRANSFER_DIR_UPLOAD:
Uds_NegativeResponse(obj, 0x37, NRC_REQUEST_OUT_OF_RANGE);
break;
default:
Uds_NegativeResponse(obj, 0x37, NRC_REQUEST_SEQUENCE_ERROR);
break;
}
Uds_SetDataTransferDirect(UDS_TRANSFER_DIR_NONE);
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE37_H_
#define _UDS_SERVICE37_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 37
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 37 processing
*/
void UdsService37_RequestTransferExit(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE37_H_ */

View File

@ -0,0 +1,70 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service3E.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService3E_TesterPresent(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint8_t subFunction;
uint8_t rspBuffer[8] = {0}; /* polyspace DEFECT:PARTIALLY_ACCESSED_ARRAY [No action planned:Low] "Still keep default though member2~7 is not written" */
if(msgLen != obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x3E, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
subFunction = UDS_GET_SUB_FUNCTION (msgBuf[1]);
if(subFunction == 0)
{
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x3E);
rspBuffer[1] = subFunction;
Uds_PositiveResponse(obj, rspBuffer, 2);
}
else
{
Uds_NegativeResponse(obj, 0x3E, NRC_SUBFUNCTION_NOT_SUPPORTED);
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE3E_H_
#define _UDS_SERVICE3E_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 3E
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 3E processing
*/
extern void UdsService3E_TesterPresent(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE3E_H_ */

View File

@ -0,0 +1,81 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_service85.h"
#include "uds_dtc.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the constants
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void UdsService85_ControlDtcSetting(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen)
{
uint8_t subFunction;
uint8_t rspBuffer[8] = {0}; /* polyspace DEFECT:PARTIALLY_ACCESSED_ARRAY [No action planned:Low] "Still keep default though member2~7 is not written" */
if(msgLen < obj->seviceTable[obj->curServiceIdx].minLen)
{
Uds_NegativeResponse(obj, 0x85, NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT);
return;
}
if(obj->session == UDS_SESSION_DEFAULT)
{
Uds_NegativeResponse(obj, 0x85, NRC_CONDITIONS_NOT_CORRECT);
return;
}
subFunction = UDS_GET_SUB_FUNCTION (msgBuf[1]);
rspBuffer[0] = UDS_GET_POSITIVE_RSP(0x85);
rspBuffer[1] = subFunction;
switch(subFunction)
{
case 1:
Uds_SetDtcOffCtrl(true);
Uds_PositiveResponse(obj, rspBuffer, 2);
break;
case 2:
Uds_SetDtcOffCtrl(false);
Uds_PositiveResponse(obj, rspBuffer, 2);
break;
default:
Uds_NegativeResponse(obj, 0x85, NRC_SUBFUNCTION_NOT_SUPPORTED);
break;
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_SERVICE85_H_
#define _UDS_SERVICE85_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS service 85
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Uds Service 85 processing
*/
extern void UdsService85_ControlDtcSetting(UdsType *obj, const uint8_t msgBuf[], uint16_t msgLen);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_SERVICE85_H_ */

View File

@ -0,0 +1,179 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "uds_user.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief The Data-by-ID definition of UDS
*/
typedef struct _Uds_DidBuffer_
{
uint8_t buffer_F113[4];
uint8_t buffer_F180[16];
uint8_t buffer_F186[1];
uint8_t buffer_F18A[6];
uint8_t buffer_F195[16];
uint8_t buffer_F1A0[8];
uint8_t buffer_F1A1[8];
uint8_t buffer_F1A2[8];
uint8_t buffer_F1A5[8];
uint8_t buffer_F1AE[16];
uint8_t buffer_4F53[1];
uint8_t buffer_4F80[2];
uint8_t buffer_4F65[1];
uint8_t buffer_4F66[1];
uint8_t buffer_4F67[2];
uint8_t buffer_F19E[32];
uint8_t buffer_F1AA[8];
uint8_t buffer_F1AB[8];
uint8_t buffer_F112[8];
uint8_t buffer_F190[17];
uint8_t buffer_F191[16];
uint8_t buffer_F193[16];
uint8_t buffer_F197[8];
uint8_t buffer_F198[16];
uint8_t buffer_F199[4];
uint8_t buffer_F19D[4];
uint8_t buffer_DFEF[64];
uint8_t buffer_F101[4];
uint8_t buffer_F110[8];
uint8_t buffer_4F51[16];
uint8_t buffer_4F54[16];
uint8_t buffer_F18C[24];
uint8_t buffer_F18B[4];
uint8_t buffer_0200[1];
uint8_t buffer_0201[1];
uint8_t buffer_F187[10];
uint8_t buffer_F189[16];
uint8_t buffer_FD01[1];
uint8_t buffer_FD02[1];
uint8_t buffer_FD03[1];
} Uds_DidBuffer;
/*******************************************************************************
* the globals
******************************************************************************/
Uds_DidBuffer udsDidBuf;
/*******************************************************************************
* the constants
******************************************************************************/
static const Uds_ServiceType udsServiceTable[UDS_SERVICE_NUM] = {
{0x10, 2, true, UdsService10_SessionControl },
{0x11, 2, true, UdsService11_ResetEcu },
{0x27, 2, true, UdsService27_SecurityAccess },
{0x28, 3, true, UdsService28_CommunicationControl },
{0x3E, 2, true, UdsService3E_TesterPresent },
{0x85, 2, true, UdsService85_ControlDtcSetting },
{0x22, 3, false, UdsService22_ReadDataByIdentifier },
{0x2E, 4, false, UdsService2E_WriteDataByIdentifier},
{0x14, 4, false, UdsService14_ClearDiagInfo },
{0x19, 3, true, UdsService19_ReadDtcInformation },
{0x2F, 3, false, UdsService2F_InputOutputCtrlById },
{0x31, 4, true, UdsService31_RoutineControl },
{0x34, 5, false, UdsService34_RequestDownload },
{0x36, 2, false, UdsService36_TransferData },
{0x37, 1, false, UdsService37_RequestTransferExit },
};
static const bool udsSecurityTable[UDS_SERVICE_NUM][UDS_SA_LEVEL_NUM] = {
{false, false, false}, /* 0x10 */
{false, false, false}, /* 0x11 */
{false, false, false}, /* 0x27 */
{false, false, false}, /* 0x28 */
{false, false, false}, /* 0x3E */
{false, false, false}, /* 0x85 */
{false, false, false}, /* 0x22 */
{false, false, false}, /* 0x2E */
{false, false, false}, /* 0x14 */
{false, false, false}, /* 0x19 */
{false, false, false}, /* 0x2F */
{false, false, false}, /* 0x31 */
{false, false, false}, /* 0x34 */
{false, false, false}, /* 0x36 */
{false, false, false}, /* 0x37 */
};
Uds_DidType udsDidTable[] = {
{0xF113, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F113, BYTES_OF(udsDidBuf.buffer_F113)},
{0xF180, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F180, BYTES_OF(udsDidBuf.buffer_F180)},
{0xF186, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F186, BYTES_OF(udsDidBuf.buffer_F186)},
{0xF18A, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F18A, BYTES_OF(udsDidBuf.buffer_F18A)},
{0xF195, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F195, BYTES_OF(udsDidBuf.buffer_F195)},
{0xF1A0, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F1A0, BYTES_OF(udsDidBuf.buffer_F1A0)},
{0xF1A1, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F1A1, BYTES_OF(udsDidBuf.buffer_F1A1)},
{0xF1A2, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F1A2, BYTES_OF(udsDidBuf.buffer_F1A2)},
{0xF1A5, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F1A5, BYTES_OF(udsDidBuf.buffer_F1A5)},
{0xF1AE, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F1AE, BYTES_OF(udsDidBuf.buffer_F1AE)},
{0x4F53, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_4F53, BYTES_OF(udsDidBuf.buffer_4F53)},
{0x4F80, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_4F80, BYTES_OF(udsDidBuf.buffer_4F80)},
{0x4F65, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_4F65, BYTES_OF(udsDidBuf.buffer_4F65)},
{0x4F66, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_4F66, BYTES_OF(udsDidBuf.buffer_4F66)},
{0x4F67, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_4F67, BYTES_OF(udsDidBuf.buffer_4F67)},
{0xF19E, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F19E, BYTES_OF(udsDidBuf.buffer_F19E)},
{0xF1AA, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F1AA, BYTES_OF(udsDidBuf.buffer_F1AA)},
{0xF1AB, UDS_DID_TYPE_RAM_RW, UDS_SESSION_DEFAULT, UDS_SA_NONE, udsDidBuf.buffer_F1AB, BYTES_OF(udsDidBuf.buffer_F1AB)},
{0xF112, UDS_DID_TYPE_NVM_RW, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_F112, BYTES_OF(udsDidBuf.buffer_F112)},
{0xF190, UDS_DID_TYPE_NVM_RW, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_F190, BYTES_OF(udsDidBuf.buffer_F190)},
{0xF191, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F191, BYTES_OF(udsDidBuf.buffer_F191)},
{0xF193, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F193, BYTES_OF(udsDidBuf.buffer_F193)},
{0xF197, UDS_DID_TYPE_NVM_RW, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_F197, BYTES_OF(udsDidBuf.buffer_F197)},
{0xF198, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F198, BYTES_OF(udsDidBuf.buffer_F198)},
{0xF199, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F199, BYTES_OF(udsDidBuf.buffer_F199)},
{0xF19D, UDS_DID_TYPE_NVM_RW, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_F19D, BYTES_OF(udsDidBuf.buffer_F19D)},
{0xDFEF, UDS_DID_TYPE_NVM_RW, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_DFEF, BYTES_OF(udsDidBuf.buffer_DFEF)},
{0xF101, UDS_DID_TYPE_NVM_RW, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_F101, BYTES_OF(udsDidBuf.buffer_F101)},
{0xF110, UDS_DID_TYPE_NVM_RO, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_F110, BYTES_OF(udsDidBuf.buffer_F110)},
{0x4F51, UDS_DID_TYPE_NVM_WO, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_4F51, BYTES_OF(udsDidBuf.buffer_4F51)},
{0x4F54, UDS_DID_TYPE_NVM_WO, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_4F54, BYTES_OF(udsDidBuf.buffer_4F54)},
{0xF18C, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F18C, BYTES_OF(udsDidBuf.buffer_F18C)},
{0xF18B, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F18B, BYTES_OF(udsDidBuf.buffer_F18B)},
{0x0200, UDS_DID_TYPE_NVM_RO, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_0200, BYTES_OF(udsDidBuf.buffer_0200)},
{0x0201, UDS_DID_TYPE_NVM_RO, UDS_SESSION_EXTENDED, UDS_SA_LEVEL_1, udsDidBuf.buffer_0201, BYTES_OF(udsDidBuf.buffer_0201)},
{0xF187, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F187, BYTES_OF(udsDidBuf.buffer_F187)},
{0xF189, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_F189, BYTES_OF(udsDidBuf.buffer_F189)},
{0xFD01, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_FD01, BYTES_OF(udsDidBuf.buffer_FD01)},
{0xFD02, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_FD02, BYTES_OF(udsDidBuf.buffer_FD02)},
{0xFD03, UDS_DID_TYPE_NVM_RO, UDS_SESSION_SUPPLIER, UDS_SA_LEVEL_63, udsDidBuf.buffer_FD03, BYTES_OF(udsDidBuf.buffer_FD03)},
};
/*******************************************************************************
* the functions
******************************************************************************/
void Uds_UserInit(UdsType *obj, const Uds_ParamsType *pParams)
{
Uds_Init(obj, pParams);
obj->seviceTable = udsServiceTable;
obj->securityTable = &udsSecurityTable[0][0];
obj->serviceNum = UDS_SERVICE_NUM;
obj->didTable = udsDidTable;
obj->didNum = sizeof(udsDidTable) / sizeof(Uds_DidType);
}

View File

@ -0,0 +1,76 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _UDS_USER_H_
#define _UDS_USER_H_
/*! \brief Contains public interface to various functions related
* to the user-defined UDS application
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include "../stack/uds.h"
#include "uds_service10.h"
#include "uds_service11.h"
#include "uds_service14.h"
#include "uds_service19.h"
#include "uds_service22.h"
#include "uds_service27.h"
#include "uds_service28.h"
#include "uds_service2E.h"
#include "uds_service2F.h"
#include "uds_service31.h"
#include "uds_service34.h"
#include "uds_service36.h"
#include "uds_service37.h"
#include "uds_service3E.h"
#include "uds_service85.h"
#include "uds_dtc.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Initialize the UDS object
*/
extern void Uds_UserInit(UdsType *obj, const Uds_ParamsType *pParams);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _UDS_USER_H_ */

View File

@ -0,0 +1,400 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "adc_drv.h"
#include "adc_reg.h"
#include "scg0_reg.h"
/*******************************************************************************
* the defines
******************************************************************************/
#define ADC_LEN_PWR_ON_DEFAULT (6U)
#define ADC_LEN_SMPL_1ST_DEFAULT (8U)
#define ADC_LEN_SMPL_DEFAULT (0U)
#define SCG0_REG_LOCK_KEY (0x0U)
#define SCG0_REG_UNLOCK_KEY (0x19962020U)
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief ADC type of enable selection
*/
typedef enum
{
ADCDRV_POWER_ON = 0x0U,
ADCDRV_POWER_DOWN = 0x1U,
} AdcDrv_PowerEnable;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void AdcDrv_SetArb(AdcDrvType *obj,const AdcDrv_ArbType arbType)
{
while(AdcReg_GetGlo2ArbChange(obj->adcReg) == 0)
{
;
}
AdcReg_SetGlo2Arb(obj->adcReg, (uint8_t)arbType);
}
void AdcDrv_Init(AdcDrvType *obj, struct _AdcRegType_ *adcReg, struct _Scg0RegType_ *scg0Reg)
{
obj->adcReg = adcReg;
obj->scg0Reg = scg0Reg;
}
void AdcDrv_GetCmpCfg(AdcDrvType *obj, AdcDrv_CmpCfgType *currentConfig)
{
bool acfe = AdcReg_GetSc2Acfe(obj->adcReg);
bool acfgt = AdcReg_GetSc2AcFgt(obj->adcReg);
bool acren = AdcReg_GetSc2AcREn(obj->adcReg);
uint16_t cv1 = AdcReg_GetCv1Cv(obj->adcReg);
uint16_t cv2 = AdcReg_GetCv2Cv(obj->adcReg);
if(acfe == false)
{
currentConfig->cmpMode = ADCDRV_CMPMODE_NO_COMPARE;
currentConfig->lowerLim = 0;
currentConfig->upperLim = 0;
}
else
{
if(acfgt == false && acren == false)
{
currentConfig->cmpMode = ADCDRV_CMPMODE_LESSTHAN;
currentConfig->lowerLim = cv1;
currentConfig->upperLim = 0;
}
else if(acfgt == true && acren == false)
{
currentConfig->cmpMode = ADCDRV_CMPMODE_GREATER_OR_EQUTHAN;
currentConfig->lowerLim = cv1;
currentConfig->upperLim = 0;
}
else if(acfgt == false && acren == true && cv1 <= cv2)
{
currentConfig->cmpMode = ADCDRV_CMPMODE_OUTSIDE_EXCLUDE_BOUNDARIES;
currentConfig->lowerLim = cv1;
currentConfig->upperLim = cv2;
}
else if(acfgt == false && acren == true && cv1 > cv2)
{
currentConfig->cmpMode = ADCDRV_CMPMODE_INSIDE_EXCLUDE_BOUNDARIES;
currentConfig->lowerLim = cv2;
currentConfig->upperLim = cv1;
}
else if(acfgt == true && acren == true && cv1 <= cv2)
{
currentConfig->cmpMode = ADCDRV_CMPMODE_INSIDE_INCLUDE_BOUNDARIES;
currentConfig->lowerLim = cv1;
currentConfig->upperLim = cv2;
}
else if(acfgt == true && acren == true && cv1 > cv2)
{
currentConfig->cmpMode = ADCDRV_CMPMODE_OUTSIDE_INCLUDE_BOUNDARIES;
currentConfig->lowerLim = cv2;
currentConfig->upperLim = cv1;
}
}
}
void AdcDrv_CfgCompare(AdcDrvType *obj, const AdcDrv_CmpCfgType *userConfig)
{
switch(userConfig->cmpMode)
{
case(ADCDRV_CMPMODE_NO_COMPARE):
AdcReg_SetSc2Acfe(obj->adcReg, false);
break;
case(ADCDRV_CMPMODE_LESSTHAN):
AdcReg_SetSc2Acfe(obj->adcReg, true);
AdcReg_SetSc2AcFgt(obj->adcReg, false);
AdcReg_SetSc2AcREn(obj->adcReg, false);
AdcReg_SetCv1Cv(obj->adcReg, userConfig->lowerLim);
AdcReg_SetCv2Cv(obj->adcReg, 0u);
break;
case(ADCDRV_CMPMODE_GREATER_OR_EQUTHAN):
AdcReg_SetSc2Acfe(obj->adcReg, true);
AdcReg_SetSc2AcFgt(obj->adcReg, true);
AdcReg_SetSc2AcREn(obj->adcReg, false);
AdcReg_SetCv1Cv(obj->adcReg, userConfig->lowerLim);
AdcReg_SetCv2Cv(obj->adcReg, 0u);
break;
case(ADCDRV_CMPMODE_OUTSIDE_EXCLUDE_BOUNDARIES):
AdcReg_SetSc2Acfe(obj->adcReg, true);
AdcReg_SetSc2AcFgt(obj->adcReg, false);
AdcReg_SetSc2AcREn(obj->adcReg, true);
AdcReg_SetCv1Cv(obj->adcReg, userConfig->lowerLim);
AdcReg_SetCv2Cv(obj->adcReg, userConfig->upperLim);
break;
case(ADCDRV_CMPMODE_INSIDE_EXCLUDE_BOUNDARIES):
AdcReg_SetSc2Acfe(obj->adcReg, true);
AdcReg_SetSc2AcFgt(obj->adcReg, false);
AdcReg_SetSc2AcREn(obj->adcReg, true);
AdcReg_SetCv1Cv(obj->adcReg, userConfig->upperLim);
AdcReg_SetCv2Cv(obj->adcReg, userConfig->lowerLim);
break;
case(ADCDRV_CMPMODE_INSIDE_INCLUDE_BOUNDARIES):
AdcReg_SetSc2Acfe(obj->adcReg, true);
AdcReg_SetSc2AcFgt(obj->adcReg, true);
AdcReg_SetSc2AcREn(obj->adcReg, true);
AdcReg_SetCv1Cv(obj->adcReg, userConfig->lowerLim);
AdcReg_SetCv2Cv(obj->adcReg, userConfig->upperLim);
break;
case(ADCDRV_CMPMODE_OUTSIDE_INCLUDE_BOUNDARIES):
AdcReg_SetSc2Acfe(obj->adcReg, true);
AdcReg_SetSc2AcFgt(obj->adcReg, true);
AdcReg_SetSc2AcREn(obj->adcReg, true);
AdcReg_SetCv1Cv(obj->adcReg, userConfig->upperLim);
AdcReg_SetCv2Cv(obj->adcReg, userConfig->lowerLim);
break;
default:
/* Impossible case */
break;
}
}
void AdcDrv_Configure(AdcDrvType *obj, const AdcDrv_ConfigType *userConfig)
{
/* disable ADC first */
AdcReg_SetSc3AdcPD(obj->adcReg, ADCDRV_POWER_DOWN);
/* select the conversion conversionMode */
AdcReg_SetCfg1Mode(obj->adcReg, (uint8_t)userConfig->conversionMode);
/* select the ADC sample length */
AdcReg_SetCfg2LenSmpl(obj->adcReg, userConfig->sampleLen);
/* select the ADC sample length after the 1st cycle
* change the input channel select(ADCH) */
AdcReg_SetCfg2LenSmpl1st(obj->adcReg, userConfig->firstSampleLen);
/* select the ADC sample length after power on */
AdcReg_SetGlo2LenPwrOn(obj->adcReg, userConfig->pwrOnLen);
/* enable DMA */
AdcReg_SetSc2DmaEn(obj->adcReg, userConfig->dmaEn);
/* Enable trigger */
#if FEATURE_ADC_SWTRG_ON == 1
AdcReg_SetSc2AdTrg(obj->adcReg, userConfig->trgSrcCfg.trgSrc);
#else
AdcReg_SetSc2AdTrg(obj->adcReg, 1);
#endif
/* unlock scg0 */
Scg0Reg_SetKey(obj->scg0Reg, SCG0_REG_UNLOCK_KEY);
/* select hardware trigger source */
Scg0Reg_SetAdcTrgSrc(obj->scg0Reg, (uint8_t)userConfig->trgSrcCfg.hwTrgSrc);
/* select software pretrigger source */
Scg0Reg_SetAdcPreTrgSwSrc(obj->scg0Reg, (uint8_t)userConfig->trgSrcCfg.swPretrgSrc);
/* set pretrigger source */
Scg0Reg_SetAdcPreTrgSrc(obj->scg0Reg, (uint8_t)userConfig->trgSrcCfg.pretrgSrc);
/* lock scg0 */
Scg0Reg_SetKey(obj->scg0Reg, SCG0_REG_LOCK_KEY);
/* select the continuous / one shot conversion */
AdcReg_SetSc3AdCo(obj->adcReg, (uint8_t)userConfig->continuousMode);
/* configure the ADC compare function */
AdcDrv_CfgCompare(obj, &(userConfig->cmpCfg));
/* enable hardware average sample */
AdcReg_SetSc3AvgE(obj->adcReg, userConfig->avgEnable);
if(userConfig->avgEnable)
{
/* select the hardware average sample number */
AdcReg_SetSc3AvgS(obj->adcReg, (uint8_t)userConfig->avgSamplesSel);
}
/* configure for each ADC channel */
uint8_t i;
for(i = 0; i < ADCDRV_CHANNEL_NUM; i++)
{
/* select the ADC channel input */
AdcReg_SetScPch(obj->adcReg, i, (uint8_t)userConfig->chnCfg[i].pCh);
/* enable the interrupt for ADC channel */
AdcReg_SetScAIEn(obj->adcReg, i, userConfig->chnCfg[i].intEnable);
}
/*configure the priority of general ADC and touch request*/
AdcDrv_SetArb(obj, userConfig->arbType);
/* enable ADC */
AdcReg_SetSc3AdcPD(obj->adcReg, ADCDRV_POWER_ON);
}
void AdcDrv_GetDefaultConfig(AdcDrv_ConfigType *userConfig)
{
uint8_t i = 0U;
userConfig->conversionMode = ADCDRV_CONVERSION_10BIT;
userConfig->sampleLen = ADC_LEN_SMPL_DEFAULT;
userConfig->firstSampleLen = ADC_LEN_SMPL_1ST_DEFAULT;
userConfig->pwrOnLen = ADC_LEN_PWR_ON_DEFAULT;
userConfig->dmaEn = false;
userConfig->cmpCfg.lowerLim = 0;
userConfig->cmpCfg.upperLim = 0;
userConfig->cmpCfg.cmpMode = ADCDRV_CMPMODE_NO_COMPARE;
userConfig->continuousMode = ADCDRV_ONESHOT;
userConfig->avgSamplesSel = ADCDRV_AVERAGE_4;
userConfig->avgEnable = true;
userConfig->arbType = ADCDRV_ARBTYPE_GENERAL_PRIORITY;
#if FEATURE_ADC_SWTRG_ON == 1
userConfig->trgSrcCfg.trgSrc = ADCDRV_HW_TRIGGER;
#endif
userConfig->trgSrcCfg.hwTrgSrc = ADCDRV_HW_TRGSRC_PDB;
userConfig->trgSrcCfg.swPretrgSrc = ADCDRV_SWPRETRG_PRETRIGGER_0;
userConfig->trgSrcCfg.pretrgSrc = ADCDRV_PRETRG_PDB_PRETRIGGER;
for(i = 0; i < ADCDRV_CHANNEL_NUM; i++)
{
userConfig->chnCfg[i].pCh = (AdcDrv_PchType)i;
userConfig->chnCfg[i].intEnable = false;
}
}
void AdcDrv_ClrLockTrg(AdcDrvType *obj)
{
AdcReg_ClrlTrg(obj->adcReg);
}
uint16_t AdcDrv_GetRn(AdcDrvType *obj, uint8_t chn)
{
return (AdcReg_GetRData(obj->adcReg, (uint8_t)chn));
}
bool AdcDrv_GetCocon(AdcDrvType *obj, uint8_t chn)
{
if(AdcReg_GetScCoCo(obj->adcReg, (uint8_t)chn) > 0)
{
return (true);
}
else
{
return (false);
}
}
void AdcDrv_DisableAdc(AdcDrvType *obj)
{
AdcReg_SetSc3AdcPD(obj->adcReg, ADCDRV_POWER_DOWN);
}
void AdcDrv_EnableAdc(AdcDrvType *obj)
{
AdcReg_SetSc3AdcPD(obj->adcReg, ADCDRV_POWER_ON);
}
void AdcDrv_AbortChn(AdcDrvType *obj, uint8_t chn)
{
AdcReg_AbortChn(obj->adcReg, chn);
}
void AdcDrv_ConfigurePchn(AdcDrvType *obj, uint8_t chn, AdcDrv_PchType state)
{
AdcReg_SetScPch(obj->adcReg, chn, (uint8_t)state);
}
void AdcDrv_GetConfig(AdcDrvType *obj, AdcDrv_ConfigType *currentConfig)
{
/* get the conversion conversionMode */
currentConfig->conversionMode = (AdcDrv_ConversionMode)AdcReg_GetCfg1Mode(obj->adcReg);
/* get the ADC sample length */
currentConfig->sampleLen = AdcReg_GetCfg2LenSmpl(obj->adcReg);
/* get the ADC sample length after the 1st cycle
* change the input channel select(ADCH) */
currentConfig->firstSampleLen = AdcReg_GetCfg2LenSmpl1st(obj->adcReg);
/* get the ADC sample length after power on */
currentConfig->pwrOnLen = AdcReg_GetGlo2LenPwrOn(obj->adcReg);
/* get enable DMA */
currentConfig->dmaEn = AdcReg_GetSc2DmaEn(obj->adcReg);
#if FEATURE_ADC_SWTRG_ON == 1
currentConfig->trgSrcCfg.trgSrc = (AdcDrv_TrgMode)AdcReg_GetSc2AdTrg(obj->adcReg);
#endif
/* get hardware trigger source */
currentConfig->trgSrcCfg.hwTrgSrc = (AdcDrv_HwTrgSrc)Scg0Reg_GetAdcTrgSrc(obj->scg0Reg);
/* get software pretrigger source */
currentConfig->trgSrcCfg.swPretrgSrc = (ADCDRV_SwPretrgSrc)Scg0Reg_GetAdcPreTrgSwSrc(obj->scg0Reg);
/* get pretrigger source */
currentConfig->trgSrcCfg.pretrgSrc = (ADCDRV_PretrgSrc)Scg0Reg_GetAdcPreTrgSrc(obj->scg0Reg);
/* get configuration the ADC compare function */
AdcDrv_GetCmpCfg(obj, &currentConfig->cmpCfg);
/* get hardware average sample configuration*/
currentConfig->avgEnable = AdcReg_GetSc3AvgE(obj->adcReg);
/* get the hardware average sample number */
currentConfig->avgSamplesSel = (AdcDrv_AverageMode)AdcReg_GetSc3AvgS(obj->adcReg);
/* get configuration for each ADC channel */
uint8_t i;
for(i = 0; i < ADCDRV_CHANNEL_NUM; i++)
{
/* get the ADC channel input */
currentConfig->chnCfg[i].pCh = (AdcDrv_PchType)AdcReg_GetScPch(obj->adcReg, i);
/* get the interrupt for ADC channel state*/
currentConfig->chnCfg[i].intEnable = AdcReg_GetScAIEn(obj->adcReg, i);
}
}
uint8_t AdcDrv_GetTrgErr(AdcDrvType *obj)
{
return(AdcReg_GetSc2TrgStErr(obj->adcReg));
}
void AdcDrv_ClrTrgErr(AdcDrvType *obj)
{
AdcReg_ClrSc2TrgStErr(obj->adcReg);
}
uint8_t AdcDrv_GetTrgSt(AdcDrvType *obj)
{
return(AdcReg_GetSc2TrgStLat(obj->adcReg));
}
uint8_t AdcDrv_GetTrgPrNum(AdcDrvType *obj)
{
return(AdcReg_GetSc2TrgPrNum(obj->adcReg));
}
#if FEATURE_ADC_SWTRG_ON == 1
void AdcDrv_SwTrg(AdcDrvType *obj)
{
AdcReg_SwTrig(obj->adcReg);
}
#endif

View File

@ -0,0 +1,433 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _ADC_DRV_H_
#define _ADC_DRV_H_
/*! \brief Contains public interface to various functions related
* to the driver of ADC (Analog-to-digital conversion)
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include "../CVM012x_features.h"
/*! \addtogroup adc_drv
* @{
*/
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
#define ADCDRV_CHANNEL_NUM (24)
/*******************************************************************************
* the typedefs
******************************************************************************/
#if FEATURE_ADC_SWTRG_ON == 1
/*! \brief ADC type of conversion trigger selection
*/
typedef enum
{
ADCDRV_SW_TRIGGER = 0x0U, /*!< Conversion trigger select software trigger.*/
ADCDRV_HW_TRIGGER = 0x1U, /*!< Conversion trigger select hardware trigger.*/
} AdcDrv_TrgMode;
#endif
/*! \brief ADC type of ADC arbitration
* decide the priority of general ADC and touch request
*/
typedef enum
{
ADCDRV_ARBTYPE_GENERAL_PRIORITY = 0x0U, /*!< General ADC request has the priority to use ADC_CTRL.*/
ADCDRV_ARBTYPE_TOUCH_PRIORITY = 0x1U, /*!< Touch request has the priority to use ADC_CTRL.*/
} AdcDrv_ArbType;
/*! \brief ADC type of hardware average times selection
*/
typedef enum
{
ADCDRV_AVERAGE_4 = 0x0U, /*!< Hardware average of 4 samples.*/
ADCDRV_AVERAGE_8 = 0x1U, /*!< Hardware average of 8 samples.*/
ADCDRV_AVERAGE_16 = 0x2U, /*!< Hardware average of 16 samples.*/
ADCDRV_AVERAGE_32 = 0x3U, /*!< Hardware average of 32 samples.*/
} AdcDrv_AverageMode;
/*! \brief ADC type of self-test channel selection
*/
typedef enum
{
ADCDRV_SELF_TEST_VALUE_AVSS = 0x0U, /*!< ADC self-test channel select AVSS.*/
ADCDRV_SELF_TEST_VALUE_ONE_EIGHTH_AVSS = 0x1U, /*!< ADC self-test channel select 1/8*VREF.*/
ADCDRV_SELF_TEST_VALUE_HALF_AVSS = 0x2U, /*!< ADC self-test channel select 1/2*VREF.*/
ADCDRV_SELF_TEST_VALUE_SEVEN_EIGHTH_AVSS = 0x3U, /*!< ADC self-test channel select 7/8*VREF.*/
} AdcDrv_SelfTestValue;
/*! \brief ADC type of resolution selection
*/
typedef enum
{
ADCDRV_CONVERSION_8BIT = 0x0U, /*!< Selects the ADC resolution to 8-bit conversion.*/
ADCDRV_CONVERSION_10BIT = 0x2U, /*!< Selects the ADC resolution to 10-bit conversion.*/
} AdcDrv_ConversionMode;
/*! \brief ADC type of compare mode
*/
typedef enum
{
ADCDRV_CMPMODE_NO_COMPARE = 0x0U, /*!< ADC disable compare function.*/
ADCDRV_CMPMODE_LESSTHAN = 0x1U, /*!< Automatic compare with interrupt for less-than.*/
ADCDRV_CMPMODE_GREATER_OR_EQUTHAN = 0x2U, /*!< Automatic compare with interrupt for greater-than or equal-to.*/
ADCDRV_CMPMODE_OUTSIDE_EXCLUDE_BOUNDARIES = 0x3U, /*!< Automatic compare with interrupt for out-of-range(Does not contain boundaries).*/
ADCDRV_CMPMODE_INSIDE_EXCLUDE_BOUNDARIES = 0x4U, /*!< Automatic compare with interrupt for within range(Does not contain boundaries).*/
ADCDRV_CMPMODE_INSIDE_INCLUDE_BOUNDARIES = 0x5U, /*!< Automatic compare with interrupt for within range(Contain boundaries).*/
ADCDRV_CMPMODE_OUTSIDE_INCLUDE_BOUNDARIES = 0x6U, /*!< Automatic compare with interrupt for out-of-range range(Contain boundaries).*/
} AdcDrv_CmpMode;
/*! \brief ADC type of input channel selection.
*/
typedef enum
{
ADCDRV_PCH_TK_ADC00 = 0x0U, /*!< TK_ADC00.*/
ADCDRV_PCH_TK_ADC01 = 0x1U, /*!< TK_ADC01.*/
ADCDRV_PCH_TK_ADC02 = 0x2U, /*!< TK_ADC02.*/
ADCDRV_PCH_TK_ADC03 = 0x3U, /*!< TK_ADC03.*/
ADCDRV_PCH_TK_ADC04 = 0x4U, /*!< TK_ADC04.*/
ADCDRV_PCH_TK_ADC05 = 0x5U, /*!< TK_ADC05.*/
ADCDRV_PCH_TK_ADC06 = 0x6U, /*!< TK_ADC06.*/
ADCDRV_PCH_TK_ADC07 = 0x7U, /*!< TK_ADC07.*/
ADCDRV_PCH_TK_ADC08 = 0x8U, /*!< TK_ADC08.*/
ADCDRV_PCH_TK_ADC09 = 0x9U, /*!< TK_ADC09.*/
ADCDRV_PCH_TK_ADC10 = 0xAU, /*!< TK_ADC10.*/
ADCDRV_PCH_TK_ADC11 = 0xBU, /*!< TK_ADC11.*/
ADCDRV_PCH_TK_ADC12 = 0xCU, /*!< TK_ADC12.*/
ADCDRV_PCH_TK_ADC13 = 0xDU, /*!< TK_ADC13.*/
ADCDRV_PCH_TK_ADC14 = 0xEU, /*!< TK_ADC14.*/
ADCDRV_PCH_TK_ADC15 = 0xFU, /*!< TK_ADC15.*/
ADCDRV_PCH_TK_ADC16 = 0x10U, /*!< TK_ADC16.*/
ADCDRV_PCH_TK_ADC17 = 0x11U, /*!< TK_ADC17.*/
ADCDRV_PCH_TK_ADC18 = 0x12U, /*!< TK_ADC18.*/
ADCDRV_PCH_TK_ADC19 = 0x13U, /*!< TK_ADC19.*/
ADCDRV_PCH_TK_ADC20 = 0x14U, /*!< TK_ADC20.*/
ADCDRV_PCH_TK_ADC21 = 0x15U, /*!< TK_ADC21.*/
ADCDRV_PCH_TK_ADC22 = 0x16U, /*!< TK_ADC22.*/
ADCDRV_PCH_TK_ADC23 = 0x17U, /*!< TK_ADC23.*/
ADCDRV_PCH_TK_ADC24 = 0x18U, /*!< TK_ADC24.*/
ADCDRV_PCH_TK_ADC25 = 0x19U, /*!< TK_ADC25.*/
ADCDRV_PCH_TK_ADC26 = 0x1AU, /*!< TK_ADC26.*/
ADCDRV_PCH_TK_ADC27 = 0x1BU, /*!< TK_ADC27.*/
ADCDRV_PCH_TK_ADC28 = 0x1CU, /*!< TK_ADC28.*/
ADCDRV_PCH_TK_ADC29 = 0x1DU, /*!< TK_ADC29.*/
ADCDRV_PCH_BANDGAP_VOLTAGE = 0x1EU, /*!< inner Bandgap voltage.*/
ADCDRV_PCH_SELF_TEST_VOLTAGE = 0x20U, /*!< inner self test voltage.*/
ADCDRV_PCH_CLOSE = 0X3F, /*!< close*/
} AdcDrv_PchType;
/*! \brief ADC type of continuous conversion mode selection.
*/
typedef enum
{
ADCDRV_ONESHOT = 0x0U, /*!< One conversion will be performed (or one set of conversions, if AVGE is set) after a conversion is initiated.*/
ADCDRV_CONTINUOUS = 0x1U, /*!< Continuous conversions will be performed (or continuous sets of conversions, if AVGE is set) after a conversion is initiated.*/
} AdcDrv_ContinuousMode;
/*! \brief ADC type of hardware trigger source selection.
*/
typedef enum
{
ADCDRV_HW_TRGSRC_PDB = 0x0U, /*!< Select PDB output for trigger source.*/
ADCDRV_HW_TRGSRC_TRGMUX = 0x1U, /*!< Select TRGMUX output output for trigger source.*/
} AdcDrv_HwTrgSrc;
/*! \brief ADC type of software pretrigger source selection.
*/
typedef enum
{
ADCDRV_SWPRETRG_PRETRIGGER_0 = 0x4U, /*!< Select PRETRIGGER_0 for software pretrigger sources.*/
ADCDRV_SWPRETRG_PRETRIGGER_1 = 0x5U, /*!< Select PRETRIGGER_1 for software pretrigger sources.*/
ADCDRV_SWPRETRG_PRETRIGGER_2 = 0x6U, /*!< Select PRETRIGGER_2 for software pretrigger sources.*/
ADCDRV_SWPRETRG_PRETRIGGER_3 = 0x7U, /*!< Select PRETRIGGER_3 for software pretrigger sources.*/
} ADCDRV_SwPretrgSrc;
/*! \brief ADC type of hardware pretrigger source selection.
*/
typedef enum
{
ADCDRV_PRETRG_PDB_PRETRIGGER = 0x0U, /*!< Select PDB pretrigger for ADC pretrigger sources.*/
ADCDRV_PRETRG_TRGMUX_PRETRIGGER = 0x1U, /*!< Select TRGMUX pretrigger for ADC pretrigger sources.*/
ADCDRV_PRETRG_SOFTWARE_PRETRIGGER = 0x2U, /*!< Select SOFTWARE pretrigger for ADC pretrigger sources.*/
ADCDRV_PRETRG_NO_HW_PRETRIGGER = 0x3U, /*!< Select no hardware trigger for ADC pretrigger sources.*/
} ADCDRV_PretrgSrc;
/*! \brief Definition of configuration of ADC trigger/pretrigger.
*/
typedef struct _AdcDrv_TrgSrcCfgType_
{
#if FEATURE_ADC_SWTRG_ON == 1
AdcDrv_TrgMode trgSrc; /*!< Conversion trigger select*/
#endif
AdcDrv_HwTrgSrc hwTrgSrc; /*!< Selects hardware trigger source for ADC.*/
ADCDRV_SwPretrgSrc swPretrgSrc; /*!< Selects software pretrigger sources for ADC*/
ADCDRV_PretrgSrc pretrgSrc; /*!< Selects pretrigger sources for ADC*/
} AdcDrv_TrgSrcCfgType;
/*! \brief Definition of configuration of ADC channel
*/
typedef struct _AdcDrv_ChnCfgType_
{
AdcDrv_PchType pCh; /*!< ADC Pchannel selection.*/
bool intEnable; /*!< Interrupt enable.*/
} AdcDrv_ChnCfgType;
/*! \brief Definition of configuration of ADC compare function
*/
typedef struct _AdcDrv_CmpCfgType_
{
uint16_t lowerLim; /*!< Lower limiting value in ADC compare function.*/
uint16_t upperLim; /*!< Upper limiting value in ADC compare function.*/
AdcDrv_CmpMode cmpMode; /*!< Select compare mode.*/
} AdcDrv_CmpCfgType;
/*! \brief Definition of configuration of ADC driver
*/
typedef struct _AdcDrv_ConfigType_
{
AdcDrv_ConversionMode conversionMode; /*!< Conversion mode select.*/
uint8_t sampleLen; /*!< ADC sampling time.*/
uint8_t firstSampleLen; /*!< First sample delay time.*/
uint8_t pwrOnLen; /*!< Power on sample delay time.*/
bool dmaEn; /*!< DMA enable.*/
AdcDrv_CmpCfgType cmpCfg; /*!< Compare function configuration*/
AdcDrv_ContinuousMode continuousMode; /*!< Switch continuous conversion enable*/
AdcDrv_AverageMode avgSamplesSel; /*!< Hardware average select*/
bool avgEnable; /*!< Switch hardware average enable*/
AdcDrv_ArbType arbType; /*!< Decide the priority of general ADC and touch request*/
AdcDrv_ChnCfgType chnCfg[ADCDRV_CHANNEL_NUM]; /*!< ADC channel configuration*/
AdcDrv_TrgSrcCfgType trgSrcCfg; /*!< ADC trigger source configuration*/
} AdcDrv_ConfigType;
/* Forward declaration of ADC register */
struct _AdcRegType_;
/* Forward declaration of SIm register */
struct _Scg0RegType_;
/*! \brief The definition of ADC driver class
*/
typedef struct _AdcDrvType_
{
struct _AdcRegType_ *adcReg;
struct _Scg0RegType_ *scg0Reg;
} AdcDrvType;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Initializes the ADC driver module
*
* This function initializes ADC driver by setting the register
* instance to it.
*
* \param[in] obj : pointer to ADC driver instance
* \param[in] pdbReg : pointer to ADC register instance
* \param[in] scg0Reg : pointer to SIM register instance
* \param[in] initParams : pointer to ADC initialization parameters
*/
extern void AdcDrv_Init(AdcDrvType *obj, struct _AdcRegType_ *adcReg, struct _Scg0RegType_ *scg0Reg);
/*! \brief Get default configures the ADC module for configuration structure
*
* This function gets default configures the ADC module for user configuration structure
*
* \param[out] userConfig : pointer to configuration structure
*/
extern void AdcDrv_GetDefaultConfig(AdcDrv_ConfigType *userConfig);
/*! \brief Configures the ADC module from a user configuration structure
*
* This function configures the ADC module from a user configuration structure
*
* \param[in] obj : pointer to ADC driver instance
* \param[in] userConfig : pointer to configuration structure
*/
extern void AdcDrv_Configure(AdcDrvType *obj, const AdcDrv_ConfigType *userConfig);
/*! \brief Get configures of the ADC module
*
* This function get configures of the ADC module
*
* \param[in] obj : pointer to ADC driver instance
* \param[out] currentConfig : pointer to configuration structure
*/
extern void AdcDrv_GetConfig(AdcDrvType *obj, AdcDrv_ConfigType *currentConfig);
/*! \brief ADC clear lock trigger
*
* This function for ADC clear lock trigger
*
* \param[in] obj : pointer to ADC driver instance
*/
extern void AdcDrv_ClrLockTrg(AdcDrvType *obj);
/*! \brief Get ADC data result
*
* This function for get ADC data result
*
* \param[in] obj : pointer to ADC driver instance
* \param[in] chn : channel number
* \return ADC data result.
*/
extern uint16_t AdcDrv_GetRn(AdcDrvType *obj, uint8_t chn);
/*! \brief Get ADC conversion complete flag
*
* This function for get ADC conversion complete flag.
*
* \param[in] obj : pointer to ADC driver instance
* \param[in] chn : channel number
* \return ADC data result.
*/
extern bool AdcDrv_GetCocon(AdcDrvType *obj, uint8_t chn);
/*! \brief Disable ADC
*
* This function for disable ADC
*
* \param[in] obj : pointer to ADC driver instance
*/
extern void AdcDrv_DisableAdc(AdcDrvType *obj);
/*! \brief Enable ADC
*
* This function for enable ADC
*
* \param[in] obj : pointer to ADC driver instance
*/
extern void AdcDrv_EnableAdc(AdcDrvType *obj);
/*! \brief Abort ADC channel n
*
* This function for abort ADC channel n
*
* \param[in] obj : pointer to ADC driver instance
* \param[in] chn : channel number
*/
extern void AdcDrv_AbortChn(AdcDrvType *obj, uint8_t chn);
/*! \brief Selects one of the input channels.
*
* This function for selects one of the input channels.
*
* \param[in] obj : pointer to ADC driver instance
* \param[in] chn : channel number
* \param[in] state : input channel selection.
*/
extern void AdcDrv_ConfigurePchn(AdcDrvType *obj, uint8_t chn, AdcDrv_PchType state);
/*! \brief Get error in Multiplexed Trigger Request.
*
* This function for getting error in Multiplexed Trigger Request.
*
* \param[in] obj : pointer to ADC driver instance
* \return ADC error in Multiplexed Trigger Request.
* -bit0 : corresponds to trigger request 0
* -bit1 : corresponds to trigger request 1
* -bit2 : corresponds to trigger request 2
* -bit3 : corresponds to trigger request 3
* each bit as follows
* 0b: No error has occurred
* 1b: An error has occurred
*/
extern uint8_t AdcDrv_GetTrgErr(AdcDrvType *obj);
/*! \brief Clean all error in Multiplexed Trigger Request.
*
* This function for cleaning all error in Multiplexed Trigger Request.
*
* \param[in] obj : pointer to ADC driver instance
*/
extern void AdcDrv_ClrTrgErr(AdcDrvType *obj);
/*! \brief Get trigger Status.
*
* This function for getting trigger Status.
*
* \param[in] obj : pointer to ADC driver instance
* \return ADC error in Multiplexed Trigger Request.
* -bit0 : corresponds to trigger request 0
* -bit1 : corresponds to trigger request 1
* -bit2 : corresponds to trigger request 2
* -bit3 : corresponds to trigger request 3
* each bit as follows
* 0b: No trigger request has been latched
* 1b: A trigger request has been latched
*/
extern uint8_t AdcDrv_GetTrgSt(AdcDrvType *obj);
/*! \brief Get Trigger Process Number.
*
* This function for getting trigger Process Number.
*
* \param[in] obj : pointer to ADC driver instance
* \return trigger process number.
* 00b: corresponds to trigger request 0
* 01b: corresponds to trigger request 1
* 10b: corresponds to trigger request 2
* 11b: corresponds to trigger request 3
*/
extern uint8_t AdcDrv_GetTrgPrNum(AdcDrvType *obj);
/*! \brief Set the priority of general ADC and touch request
*
* This function for setting the priority of general ADC and touch request
*
* \param[in] obj : pointer to ADC driver instance
* \param[in] arbType : priority of general ADC and touch request
*/
extern void AdcDrv_SetArb(AdcDrvType *obj,const AdcDrv_ArbType arbType);
#if FEATURE_ADC_SWTRG_ON == 1
/*! \brief ADC software trigger
*
* This function for ADC clear lock trigger
*
* \param[in] obj : pointer to ADC driver instance
*/
extern void AdcDrv_SwTrg(AdcDrvType *obj);
#endif
#ifdef __cplusplus
}
#endif /* extern "C" */
/*! @}*/
#endif /* _ADC_DRV_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,242 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _CLOCK_DRV_H_
#define _CLOCK_DRV_H_
/*! \brief Contains public interface to various functions related
* to the driver of Clock
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
/*! \addtogroup clock_drv
* @{
*/
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/* TCLK clock number */
#define TCLK_INPUTS_NUM (3U)
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief Definition of Clock names.
*/
typedef enum
{
/* Source clocks */
CLOCKDRV_SOSC = 0, /* system crystal oscillator clock*/
CLOCKDRV_SIRC, /* slow internal reference clock */
CLOCKDRV_PLL, /* PLL clock */
CLOCKDRV_SOSC_DIV, /* SOSC_DIV clock */
CLOCKDRV_SOSC_DIV_MFT, /* SOSC_DIV_MFT clock */
CLOCKDRV_SIRC_DIV, /* SIRC_DIV clock */
CLOCKDRV_SIRC_DIV_MFT, /* SIRC_DIV_MFT clock */
CLOCKDRV_PLL_DIV, /* PLL_DIV clock */
CLOCKDRV_PLL_DIV_MFT, /* PLL_DIV_MFT clock */
CLOCKDRV_SYS, /* system clock */
CLOCKDRV_CORE, /* core clock */
CLOCKDRV_APB, /* bus clock */
CLOCKDRV_FLS, /* flash clock */
CLOCKDRV_CLKOUT, /* CLKOUT clock */
CLOCKDRV_RTC_PADIN, /* RTC pad input clock */
CLOCKDRV_LPO_1K, /* LPO 1KHz clock */
CLOCKDRV_LPO_32K, /* LPO 32KHz clock */
CLOCKDRV_LPO_128K, /* LPO 128KHz clock */
/* Always-on clocks */
CLOCKDRV_TOUCH, /* TOUCH clock */
CLOCKDRV_PORTA, /* PORTA clock */
CLOCKDRV_PORTB, /* PORTB clock */
CLOCKDRV_PORTC, /* PORTC clock */
CLOCKDRV_LPTMR, /* LPTMR clock */
CLOCKDRV_LPIT, /* LPIT clock */
CLOCKDRV_RTC_CNT, /* RTC module clock for counter */
CLOCKDRV_PORTA_FLT, /* PORTA digital filter clock */
CLOCKDRV_PORTB_FLT, /* PORTB digital filter clock */
CLOCKDRV_PORTC_FLT, /* PORTC digital filter clock */
CLOCKDRV_EXT_FLT, /* External Reset pin digital Filter clock */
/* Peripheral clocks */
CLOCKDRV_DMA, /* DMA clock */
CLOCKDRV_MSCM, /* MSCM clock */
CLOCKDRV_CRC, /* CRC clock */
CLOCKDRV_EIM, /* EIM clock */
CLOCKDRV_ERM, /* ERM clock */
CLOCKDRV_FHU, /* FHU clock */
CLOCKDRV_ADC, /* ADC clock */
CLOCKDRV_PDB, /* PDB clock */
CLOCKDRV_SPI0, /* SPI0 clock */
CLOCKDRV_SPI1, /* SPI1 clock */
CLOCKDRV_UART0, /* UART0 clock */
CLOCKDRV_UART1, /* UART1 clock */
CLOCKDRV_I2C, /* I2C clock */
CLOCKDRV_PWMLITE0, /* PWM_LITE0 clock */
CLOCKDRV_PWMLITE1, /* PWM_LITE1 clock */
CLOCKDRV_MFT0, /* MFT0 input clock, please note this is not MFT functional clock */
CLOCKDRV_MFT1, /* MFT1 input clock, please note this is not MFT functional clock */
CLOCKDRV_CMUS, /* CMUS clock */
CLOCKDRV_CMUP, /* CMUP clock */
CLOCKDRV_TCLK0, /* TCLK0 clock */
CLOCKDRV_TCLK1, /* TCLK1 clock */
CLOCKDRV_TCLK2, /* TCLK2 clock */
CLOCKDRV_EXT_MFT0, /* EXT_MFT0 clock */
CLOCKDRV_EXT_MFT1, /* EXT_MFT1 clock */
CLOCKDRV_FIX_MFT0, /* FIX_MFT0 clock */
CLOCKDRV_FIX_MFT1, /* FIX_MFT1 clock */
CLOCKDRV_MPU, /* MPU clock */
CLOCKDRV_CLOCK_NUM
} ClockDrv_NamesType;
/*! \brief module clock configuration.
*/
typedef struct _ClockDrv_ModuleClkConfigType_
{
bool gating; /*!< Clock gating. */
ClockDrv_NamesType source; /*!< Clock source input (some modules don't have protocol clock) */
uint16_t mult; /*!< Multiplier (some modules don't have fractional) */
uint16_t div; /*!< Divider (some modules don't have divider) */
/* Only PLL clock has following configures */
struct
{
uint32_t outDiv; /*!< out-divider */
uint32_t preDiv; /*!< pre-divider */
uint32_t postDiv; /*!< post-divider */
} pllConfig; /*!< PLL related config */
} ClockDrv_ModuleClkConfigType;
/*! \brief Initial parameters
*/
typedef struct _ClockDrv_InitParamsType_
{
uint32_t sircFreq; /*!< SIRC frequency */
uint32_t xtalClkFreq; /*!< XTAL clock frequency. */
uint32_t rtcClkInFreq; /*!< RTC_CLKIN clock frequency. */
uint32_t tclkFreq[TCLK_INPUTS_NUM]; /*!< TCLKx clocks */
} ClockDrv_InitParamsType;
/* Forward declaration of related register */
struct _RcmRegType_;
struct _Pcc0RegType_;
struct _Scg0RegType_;
struct _Scg1RegType_;
struct _Pcc1RegType_;
struct _Scg2RegType_;
/*! \brief The definition of LPIT driver class
*/
typedef struct _ClockDrvType_
{
struct _RcmRegType_ *rcmReg; /*!< pointer to RCM register */
struct _Pcc0RegType_ *pcc0Reg; /*!< pointer to PCC0 register */
struct _Scg0RegType_ *scg0Reg; /*!< pointer to SCG0 register */
struct _Scg1RegType_ *scg1Reg; /*!< pointer to SCG1 register */
struct _Pcc1RegType_ *pcc1Reg; /*!< pointer to PCC1 register */
struct _Scg2RegType_ *scg2Reg; /*!< pointer to SCG2 register */
uint32_t sircFreq; /*!< SIRC frequency */
uint32_t xtalClkFreq; /*!< XTAL clock frequency */
uint32_t rtcClkInFreq; /*!< RTC_CLKIN clock frequency */
uint32_t tclkFreq[TCLK_INPUTS_NUM]; /*!< TCLKx clocks */
} ClockDrvType;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Initializes the Clock driver module
*
* This function initializes Clock driver by setting the register
* instances to it.
*
* \param[in] obj : pointer to Clock driver instance
* \param[in] rcmReg : pointer to RCM register instance
* \param[in] pcc0Reg : pointer to PCC0 register instance
* \param[in] scg0Reg : pointer to SCG0 register instance
* \param[in] scg1Reg : pointer to SCG1 register instance
* \param[in] pcc1Reg : pointer to PCC1 register instance
* \param[in] scg2Reg : pointer to SCG2 register instance
* \param[in] initParams : pointer to clock initialization parameters
*/
extern void ClockDrv_Init(ClockDrvType *obj,
struct _RcmRegType_ *rcmReg,
struct _Pcc0RegType_ *pcc0Reg,
struct _Scg0RegType_ *scg0Reg,
struct _Scg1RegType_ *scg1Reg,
struct _Pcc1RegType_ *pcc1Reg,
struct _Scg2RegType_ *scg2Reg,
const ClockDrv_InitParamsType *initParams);
/*! \brief Gets the clock frequency for a specific clock name.
*
* This function checks the current clock configurations and then calculates
* the clock frequency for a specific clock name defined in ClockDrv_NamesType.
* Clock modules must be properly configured before using this function.
* If it cannot find the clock name or the clock is not enabled or
* it's not configured properly, it returns false.
*
* \note If return false, don't trust the value of out parameter "frequency"
* even if it's changed.
*
* \param[in] obj : pointer to Clock driver instance
* \param[in] clockName : Clock names defined
* \param[out] frequency : clock frequency value in Hertz
* \return The result of the operation
* - false : Failed to get the frequency
* - true : Success
*/
extern bool ClockDrv_GetFreq(const ClockDrvType *obj, ClockDrv_NamesType clockName, uint32_t *frequency);
/*! \brief Configures module clock
*
* This function configures a module clock according to the configuration.
*
* \note If the target clock do not have mul or div, the corresponding configuration in
* moduleClkConfig will be ignored.
*
* \param[in] obj : pointer to Clock driver instance
* \param[in] clockName : Clock name of the configured module clock
* \param[in] moduleClkConfig : Pointer to the configuration structure.
* \return The result of the operation
* - false : configure failed
* - true : success
*/
extern bool ClockDrv_ConfigureClock(ClockDrvType *obj, ClockDrv_NamesType clockName, const ClockDrv_ModuleClkConfigType *moduleClkConfig);
#ifdef __cplusplus
}
#endif /* extern "C" */
/*! @}*/
#endif /* _CLOCK_DRV_H_ */

View File

@ -0,0 +1,127 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "cmu_drv.h"
#include "cmu_reg.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void CmuDrv_Init(CmuDrvType *obj, struct _CmuRegType_ *reg)
{
obj->reg = reg;
}
void CmuDrv_Configure(CmuDrvType *obj, const CmuDrv_ConfigType *userConfig)
{
/* Set referency frequency cnt */
CmuReg_SetRefCnt(obj->reg, userConfig->refClkCnt);
/* Set the high threshold value */
CmuReg_SetFreqHighRefValue(obj->reg, userConfig->highRefFreq);
/* Set the low threshold value */
CmuReg_SetFreqLowRefValue(obj->reg, userConfig->lowRefFreq);
/* Set high event state */
CmuReg_SetFreqHighEventState(obj->reg, (uint8_t)userConfig->highFreqEventSt);
/* Set low event state */
CmuReg_SetFreqLowEventState(obj->reg, (uint8_t)userConfig->lowFreqEventSt);
}
void CmuDrv_GetConfig(const CmuDrvType *obj, CmuDrv_ConfigType *userConfig)
{
/* Get referency frequency cnt */
userConfig->refClkCnt = CmuReg_GetRefCnt(obj->reg);
/* Get the high threshold value */
userConfig->highRefFreq = CmuReg_GetFreqHighRefValue(obj->reg);
/* Get the low threshold value */
userConfig->lowRefFreq = CmuReg_GetFreqLowRefValue(obj->reg);
/* Get high event state */
userConfig->highFreqEventSt = (CmuDrv_EventStateType)CmuReg_GetFreqHighEventState(obj->reg);
/* Get low event state */
userConfig->lowFreqEventSt = (CmuDrv_EventStateType)CmuReg_GetFreqLowEventState(obj->reg);
}
void CmuDrv_GetDefaultConfig(CmuDrv_ConfigType *userConfig)
{
/* Get referency frequency cnt */
userConfig->refClkCnt = 0U;
/* Get the high threshold value */
userConfig->highRefFreq = 0U;
/* Get the low threshold value */
userConfig->lowRefFreq = 0U;
/* Get high event state */
userConfig->highFreqEventSt = CMUDRV_DISABLE_INT_AND_RST;
/* Get low event state */
userConfig->lowFreqEventSt = CMUDRV_DISABLE_INT_AND_RST;
}
bool CmuDrv_IsFreqCheckEnable(const CmuDrvType *obj)
{
/* Get CMU enable state */
return (bool)(CmuReg_GetEnable(obj->reg));
}
void CmuDrv_EnableFreqCheck(const CmuDrvType *obj, bool enable)
{
/* Set CMU enable state */
CmuReg_SetEnable(obj->reg, enable);
}
bool CmuDrv_IsCmuRun(const CmuDrvType *obj)
{
/* Get CMU run state */
return (bool)(CmuReg_GetRunStatus(obj->reg));
}
bool CmuDrv_IsFreqHighEventAcvt(const CmuDrvType *obj)
{
/* Get the frequency high event flag */
return (bool)(CmuReg_GetFreqHighEventFlag(obj->reg));
}
void CmuDrv_ClearFreqHighEventFlag(CmuDrvType *obj)
{
/* Clear the frequency high event flag */
CmuReg_ClearFreqHighEventFlag(obj->reg);
}
bool CmuDrv_IsFreqLowEventAcvt(const CmuDrvType *obj)
{
/* Get the frequency low event flag */
return (bool)(CmuReg_GetFreqLowEventFlag(obj->reg));
}
void CmuDrv_ClearFreqLowEventFlag(CmuDrvType *obj)
{
/* Clear the frequency low event flag */
CmuReg_ClearFreqLowEventFlag(obj->reg);
}

View File

@ -0,0 +1,192 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _CMU_DRV_H_
#define _CMU_DRV_H_
/*! \brief Contains public interface to various functions related
* to the driver of CMU module
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
/*! \addtogroup cmu_drv
* @{
*/
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief CMU type of interrupt or reset enable
*/
typedef enum
{
CMUDRV_DISABLE_INT_AND_RST = 0, /*!< disable interrupt, disable reset */
CMUDRV_ENABLE_INT_DISABLE_RST = 1, /*!< enable interrupt, disable reset */
CMUDRV_DISABLE_INT_ENABLE_RST = 2, /*!< disable interrupt, enable reset */
} CmuDrv_EventStateType;
/*! \brief Definition of configuration of CMU driver
*/
typedef struct _CmuDrv_ConfigType_
{
uint32_t refClkCnt; /*!< Reference frequency cnt Max Value. */
uint32_t highRefFreq; /*!< high frequency threshod value. */
uint32_t lowRefFreq; /*!< low frequency threshod value. */
CmuDrv_EventStateType highFreqEventSt; /*!< State of high interrupt or reset enable. */
CmuDrv_EventStateType lowFreqEventSt; /*!< State of low interrupt or reset enable. */
} CmuDrv_ConfigType;
/* Forward declaration of CMU register */
struct _CmuRegType_;
/*! \brief The definition of CMU driver class
*/
typedef struct _CmuDrvType_
{
struct _CmuRegType_ *reg;
} CmuDrvType;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Initializes the CMU driver module
*
* This function initializes CMU driver by setting the register
* instance to it.
*
* \param[in] obj : pointer to CMU driver instance
* \param[in] reg : pointer to CMU register instance
*/
extern void CmuDrv_Init(CmuDrvType *obj, struct _CmuRegType_ *reg);
/*! \brief Configures the CMU module from a user configuration structure
*
* This function configures the CMU module from a user configuration structure
*
* \param[in] obj : pointer to CMU driver instance
* \param[in] userConfig : pointer to configuration structure
*/
extern void CmuDrv_Configure(CmuDrvType *obj, const CmuDrv_ConfigType *userConfig);
/*! \brief Get configures of the CMU module currently
*
* This function gets configures of the CMU module currently
*
* \param[in] obj : pointer to CMU driver instance
* \param[out] userConfig : pointer to configuration structure
*/
extern void CmuDrv_GetConfig(const CmuDrvType *obj, CmuDrv_ConfigType *userConfig);
/*! \brief Get default configures the CMU module for configuration structure
*
* This function gets default configures the CMU module for user configuration structure
*
* \note This function is a "static" function regardless of instances
*
* \param[out] userConfig : pointer to configuration structure
*/
extern void CmuDrv_GetDefaultConfig(CmuDrv_ConfigType *userConfig);
/*! \brief Get the state of frequency check enable
*
* This function gets the state of frequency check enable
*
* \param[in] obj : pointer to CMU driver instance
* \return state of frequency check enable
*/
extern bool CmuDrv_IsFreqCheckEnable(const CmuDrvType *obj);
/*! \brief Set the state of frequency check enable
*
* This function sets the state of frequency check enable
*
* \param[in] obj : pointer to frequency check driver instance
* \param[in] state of CMU enable
*/
extern void CmuDrv_EnableFreqCheck(const CmuDrvType *obj, bool enable);
/*! \brief Get the state of CMU run
*
* This function gets the state of CMU run
*
* \param[in] obj : pointer to CMU driver instance
* \return state of CMU run
*/
extern bool CmuDrv_IsCmuRun(const CmuDrvType *obj);
/*! \brief Get the flag of frequency high
*
* This function gets the flag of frequency high
*
* \param[in] obj : pointer to CMU driver instance
* \return the flag of frequency high
*/
extern bool CmuDrv_IsFreqHighEventAcvt(const CmuDrvType *obj);
/*! \brief Clear the flag of frequency high
*
* This function clears the flag of frequency high
*
* \param[in] obj : pointer to CMU driver instance
* \return none
*/
extern void CmuDrv_ClearFreqHighEventFlag(CmuDrvType *obj);
/*! \brief Get the flag of frequency low
*
* This function gets the flag of frequency low
*
* \param[in] obj : pointer to CMU driver instance
* \return the flag of frequency low
*/
extern bool CmuDrv_IsFreqLowEventAcvt(const CmuDrvType *obj);
/*! \brief Clear the flag of frequency low
*
* This function clears the flag of frequency low
*
* \param[in] obj : pointer to CMU driver instance
* \return none
*/
extern void CmuDrv_ClearFreqLowEventFlag(CmuDrvType *obj);
#ifdef __cplusplus
}
#endif /* extern "C" */
/*! @}*/
#endif /* _CMU_DRV_H_ */

View File

@ -0,0 +1,136 @@
/* ----------------------------------------------------------------------
* Copyright (C) 2010-2014 ARM Limited. All rights reserved.
*
* $Date: 19. October 2015
* $Revision: V.1.4.5 a
*
* Project: CMSIS DSP Library
* Title: arm_common_tables.h
*
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
*
* Target Processor: Cortex-M4/Cortex-M3
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* - Neither the name of ARM LIMITED nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* -------------------------------------------------------------------- */
#ifndef _ARM_COMMON_TABLES_H
#define _ARM_COMMON_TABLES_H
#include "arm_math.h"
extern const uint16_t armBitRevTable[1024];
extern const q15_t armRecipTableQ15[64];
extern const q31_t armRecipTableQ31[64];
/* extern const q31_t realCoefAQ31[1024]; */
/* extern const q31_t realCoefBQ31[1024]; */
extern const float32_t twiddleCoef_16[32];
extern const float32_t twiddleCoef_32[64];
extern const float32_t twiddleCoef_64[128];
extern const float32_t twiddleCoef_128[256];
extern const float32_t twiddleCoef_256[512];
extern const float32_t twiddleCoef_512[1024];
extern const float32_t twiddleCoef_1024[2048];
extern const float32_t twiddleCoef_2048[4096];
extern const float32_t twiddleCoef_4096[8192];
#define twiddleCoef twiddleCoef_4096
extern const q31_t twiddleCoef_16_q31[24];
extern const q31_t twiddleCoef_32_q31[48];
extern const q31_t twiddleCoef_64_q31[96];
extern const q31_t twiddleCoef_128_q31[192];
extern const q31_t twiddleCoef_256_q31[384];
extern const q31_t twiddleCoef_512_q31[768];
extern const q31_t twiddleCoef_1024_q31[1536];
extern const q31_t twiddleCoef_2048_q31[3072];
extern const q31_t twiddleCoef_4096_q31[6144];
extern const q15_t twiddleCoef_16_q15[24];
extern const q15_t twiddleCoef_32_q15[48];
extern const q15_t twiddleCoef_64_q15[96];
extern const q15_t twiddleCoef_128_q15[192];
extern const q15_t twiddleCoef_256_q15[384];
extern const q15_t twiddleCoef_512_q15[768];
extern const q15_t twiddleCoef_1024_q15[1536];
extern const q15_t twiddleCoef_2048_q15[3072];
extern const q15_t twiddleCoef_4096_q15[6144];
extern const float32_t twiddleCoef_rfft_32[32];
extern const float32_t twiddleCoef_rfft_64[64];
extern const float32_t twiddleCoef_rfft_128[128];
extern const float32_t twiddleCoef_rfft_256[256];
extern const float32_t twiddleCoef_rfft_512[512];
extern const float32_t twiddleCoef_rfft_1024[1024];
extern const float32_t twiddleCoef_rfft_2048[2048];
extern const float32_t twiddleCoef_rfft_4096[4096];
/* floating-point bit reversal tables */
#define ARMBITREVINDEXTABLE__16_TABLE_LENGTH ((uint16_t)20 )
#define ARMBITREVINDEXTABLE__32_TABLE_LENGTH ((uint16_t)48 )
#define ARMBITREVINDEXTABLE__64_TABLE_LENGTH ((uint16_t)56 )
#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208 )
#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440 )
#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448 )
#define ARMBITREVINDEXTABLE1024_TABLE_LENGTH ((uint16_t)1800)
#define ARMBITREVINDEXTABLE2048_TABLE_LENGTH ((uint16_t)3808)
#define ARMBITREVINDEXTABLE4096_TABLE_LENGTH ((uint16_t)4032)
extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE__16_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE__32_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE__64_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE1024_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE2048_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE4096_TABLE_LENGTH];
/* fixed-point bit reversal tables */
#define ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH ((uint16_t)12 )
#define ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH ((uint16_t)24 )
#define ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH ((uint16_t)56 )
#define ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH ((uint16_t)112 )
#define ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH ((uint16_t)240 )
#define ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH ((uint16_t)480 )
#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992 )
#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984)
#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032)
extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED___16_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED___32_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED___64_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED__128_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED__256_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED__512_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH];
extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH];
/* Tables for Fast Math Sine and Cosine */
extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1];
extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1];
extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1];
#endif /* ARM_COMMON_TABLES_H */

View File

@ -0,0 +1,79 @@
/* ----------------------------------------------------------------------
* Copyright (C) 2010-2014 ARM Limited. All rights reserved.
*
* $Date: 19. March 2015
* $Revision: V.1.4.5
*
* Project: CMSIS DSP Library
* Title: arm_const_structs.h
*
* Description: This file has constant structs that are initialized for
* user convenience. For example, some can be given as
* arguments to the arm_cfft_f32() function.
*
* Target Processor: Cortex-M4/Cortex-M3
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* - Neither the name of ARM LIMITED nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* -------------------------------------------------------------------- */
#ifndef _ARM_CONST_STRUCTS_H
#define _ARM_CONST_STRUCTS_H
#include "arm_math.h"
#include "arm_common_tables.h"
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,865 @@
/**************************************************************************//**
* @file cmsis_armcc.h
* @brief CMSIS compiler ARMCC (Arm Compiler 5) header file
* @version V5.0.4
* @date 10. January 2018
******************************************************************************/
/*
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CMSIS_ARMCC_H
#define __CMSIS_ARMCC_H
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)
#error "Please use Arm Compiler Toolchain V4.0.677 or later!"
#endif
/* CMSIS compiler control architecture macros */
#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \
(defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) )
#define __ARM_ARCH_6M__ 1
#endif
#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1))
#define __ARM_ARCH_7M__ 1
#endif
#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))
#define __ARM_ARCH_7EM__ 1
#endif
/* __ARM_ARCH_8M_BASE__ not applicable */
/* __ARM_ARCH_8M_MAIN__ not applicable */
/* CMSIS compiler specific defines */
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE __inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static __inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE static __forceinline
#endif
#ifndef __NO_RETURN
#define __NO_RETURN __declspec(noreturn)
#endif
#ifndef __USED
#define __USED __attribute__((used))
#endif
#ifndef __WEAK
#define __WEAK __attribute__((weak))
#endif
#ifndef __PACKED
#define __PACKED __attribute__((packed))
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT __packed struct
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION __packed union
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
#define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x)))
#endif
#ifndef __UNALIGNED_UINT16_WRITE
#define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
#define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr)))
#endif
#ifndef __UNALIGNED_UINT32_WRITE
#define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
#define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr)))
#endif
#ifndef __ALIGNED
#define __ALIGNED(x) __attribute__((aligned(x)))
#endif
#ifndef __RESTRICT
#define __RESTRICT __restrict
#endif
/* ########################### Core Function Access ########################### */
/** \ingroup CMSIS_Core_FunctionInterface
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
@{
*/
/**
\brief Enable IRQ Interrupts
\details Enables IRQ interrupts by clearing the I-bit in the CPSR.
Can only be executed in Privileged modes.
*/
/* intrinsic void __enable_irq(); */
/**
\brief Disable IRQ Interrupts
\details Disables IRQ interrupts by setting the I-bit in the CPSR.
Can only be executed in Privileged modes.
*/
/* intrinsic void __disable_irq(); */
/**
\brief Get Control Register
\details Returns the content of the Control Register.
\return Control Register value
*/
__STATIC_INLINE uint32_t __get_CONTROL(void)
{
register uint32_t __regControl __ASM("control");
return(__regControl);
}
/**
\brief Set Control Register
\details Writes the given value to the Control Register.
\param [in] control Control Register value to set
*/
__STATIC_INLINE void __set_CONTROL(uint32_t control)
{
register uint32_t __regControl __ASM("control");
__regControl = control;
}
/**
\brief Get IPSR Register
\details Returns the content of the IPSR Register.
\return IPSR Register value
*/
__STATIC_INLINE uint32_t __get_IPSR(void)
{
register uint32_t __regIPSR __ASM("ipsr");
return(__regIPSR);
}
/**
\brief Get APSR Register
\details Returns the content of the APSR Register.
\return APSR Register value
*/
__STATIC_INLINE uint32_t __get_APSR(void)
{
register uint32_t __regAPSR __ASM("apsr");
return(__regAPSR);
}
/**
\brief Get xPSR Register
\details Returns the content of the xPSR Register.
\return xPSR Register value
*/
__STATIC_INLINE uint32_t __get_xPSR(void)
{
register uint32_t __regXPSR __ASM("xpsr");
return(__regXPSR);
}
/**
\brief Get Process Stack Pointer
\details Returns the current value of the Process Stack Pointer (PSP).
\return PSP Register value
*/
__STATIC_INLINE uint32_t __get_PSP(void)
{
register uint32_t __regProcessStackPointer __ASM("psp");
return(__regProcessStackPointer);
}
/**
\brief Set Process Stack Pointer
\details Assigns the given value to the Process Stack Pointer (PSP).
\param [in] topOfProcStack Process Stack Pointer value to set
*/
__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
{
register uint32_t __regProcessStackPointer __ASM("psp");
__regProcessStackPointer = topOfProcStack;
}
/**
\brief Get Main Stack Pointer
\details Returns the current value of the Main Stack Pointer (MSP).
\return MSP Register value
*/
__STATIC_INLINE uint32_t __get_MSP(void)
{
register uint32_t __regMainStackPointer __ASM("msp");
return(__regMainStackPointer);
}
/**
\brief Set Main Stack Pointer
\details Assigns the given value to the Main Stack Pointer (MSP).
\param [in] topOfMainStack Main Stack Pointer value to set
*/
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
{
register uint32_t __regMainStackPointer __ASM("msp");
__regMainStackPointer = topOfMainStack;
}
/**
\brief Get Priority Mask
\details Returns the current state of the priority mask bit from the Priority Mask Register.
\return Priority Mask value
*/
__STATIC_INLINE uint32_t __get_PRIMASK(void)
{
register uint32_t __regPriMask __ASM("primask");
return(__regPriMask);
}
/**
\brief Set Priority Mask
\details Assigns the given value to the Priority Mask Register.
\param [in] priMask Priority Mask
*/
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
{
register uint32_t __regPriMask __ASM("primask");
__regPriMask = (priMask);
}
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
/**
\brief Enable FIQ
\details Enables FIQ interrupts by clearing the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
#define __enable_fault_irq __enable_fiq
/**
\brief Disable FIQ
\details Disables FIQ interrupts by setting the F-bit in the CPSR.
Can only be executed in Privileged modes.
*/
#define __disable_fault_irq __disable_fiq
/**
\brief Get Base Priority
\details Returns the current value of the Base Priority register.
\return Base Priority register value
*/
__STATIC_INLINE uint32_t __get_BASEPRI(void)
{
register uint32_t __regBasePri __ASM("basepri");
return(__regBasePri);
}
/**
\brief Set Base Priority
\details Assigns the given value to the Base Priority register.
\param [in] basePri Base Priority value to set
*/
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
{
register uint32_t __regBasePri __ASM("basepri");
__regBasePri = (basePri & 0xFFU);
}
/**
\brief Set Base Priority with condition
\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,
or the new value increases the BASEPRI priority level.
\param [in] basePri Base Priority value to set
*/
__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
{
register uint32_t __regBasePriMax __ASM("basepri_max");
__regBasePriMax = (basePri & 0xFFU);
}
/**
\brief Get Fault Mask
\details Returns the current value of the Fault Mask register.
\return Fault Mask register value
*/
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
{
register uint32_t __regFaultMask __ASM("faultmask");
return(__regFaultMask);
}
/**
\brief Set Fault Mask
\details Assigns the given value to the Fault Mask register.
\param [in] faultMask Fault Mask value to set
*/
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
{
register uint32_t __regFaultMask __ASM("faultmask");
__regFaultMask = (faultMask & (uint32_t)1U);
}
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/**
\brief Get FPSCR
\details Returns the current value of the Floating Point Status/Control register.
\return Floating Point Status/Control register value
*/
__STATIC_INLINE uint32_t __get_FPSCR(void)
{
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
register uint32_t __regfpscr __ASM("fpscr");
return(__regfpscr);
#else
return(0U);
#endif
}
/**
\brief Set FPSCR
\details Assigns the given value to the Floating Point Status/Control register.
\param [in] fpscr Floating Point Status/Control value to set
*/
__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
{
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
register uint32_t __regfpscr __ASM("fpscr");
__regfpscr = (fpscr);
#else
(void)fpscr;
#endif
}
/*@} end of CMSIS_Core_RegAccFunctions */
/* ########################## Core Instruction Access ######################### */
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
Access to dedicated instructions
@{
*/
/**
\brief No Operation
\details No Operation does nothing. This instruction can be used for code alignment purposes.
*/
#define __NOP __nop
/**
\brief Wait For Interrupt
\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
*/
#define __WFI __wfi
/**
\brief Wait For Event
\details Wait For Event is a hint instruction that permits the processor to enter
a low-power state until one of a number of events occurs.
*/
#define __WFE __wfe
/**
\brief Send Event
\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
*/
#define __SEV __sev
/**
\brief Instruction Synchronization Barrier
\details Instruction Synchronization Barrier flushes the pipeline in the processor,
so that all instructions following the ISB are fetched from cache or memory,
after the instruction has been completed.
*/
#define __ISB() do {\
__schedule_barrier();\
__isb(0xF);\
__schedule_barrier();\
} while (0U)
/**
\brief Data Synchronization Barrier
\details Acts as a special kind of Data Memory Barrier.
It completes when all explicit memory accesses before this instruction complete.
*/
#define __DSB() do {\
__schedule_barrier();\
__dsb(0xF);\
__schedule_barrier();\
} while (0U)
/**
\brief Data Memory Barrier
\details Ensures the apparent order of the explicit memory operations before
and after the instruction, without ensuring their completion.
*/
#define __DMB() do {\
__schedule_barrier();\
__dmb(0xF);\
__schedule_barrier();\
} while (0U)
/**
\brief Reverse byte order (32 bit)
\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
\param [in] value Value to reverse
\return Reversed value
*/
#define __REV __rev
/**
\brief Reverse byte order (16 bit)
\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
\param [in] value Value to reverse
\return Reversed value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
{
rev16 r0, r0
bx lr
}
#endif
/**
\brief Reverse byte order (16 bit)
\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
\param [in] value Value to reverse
\return Reversed value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
{
revsh r0, r0
bx lr
}
#endif
/**
\brief Rotate Right in unsigned value (32 bit)
\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
\param [in] op1 Value to rotate
\param [in] op2 Number of Bits to rotate
\return Rotated value
*/
#define __ROR __ror
/**
\brief Breakpoint
\details Causes the processor to enter Debug state.
Debug tools can use this to investigate system state when the instruction at a particular address is reached.
\param [in] value is ignored by the processor.
If required, a debugger can use it to store additional information about the breakpoint.
*/
#define __BKPT(value) __breakpoint(value)
/**
\brief Reverse bit order of value
\details Reverses the bit order of the given value.
\param [in] value Value to reverse
\return Reversed value
*/
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
#define __RBIT __rbit
#else
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
{
uint32_t result;
uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
result = value; /* r will be reversed bits of v; first get LSB of v */
for (value >>= 1U; value != 0U; value >>= 1U)
{
result <<= 1U;
result |= value & 1U;
s--;
}
result <<= s; /* shift when v's highest bits are zero */
return result;
}
#endif
/**
\brief Count leading zeros
\details Counts the number of leading zeros of a data value.
\param [in] value Value to count the leading zeros
\return number of leading zeros in value
*/
#define __CLZ __clz
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
/**
\brief LDR Exclusive (8 bit)
\details Executes a exclusive LDR instruction for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
#else
#define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop")
#endif
/**
\brief LDR Exclusive (16 bit)
\details Executes a exclusive LDR instruction for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
#else
#define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop")
#endif
/**
\brief LDR Exclusive (32 bit)
\details Executes a exclusive LDR instruction for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
#else
#define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop")
#endif
/**
\brief STR Exclusive (8 bit)
\details Executes a exclusive STR instruction for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __STREXB(value, ptr) __strex(value, ptr)
#else
#define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
#endif
/**
\brief STR Exclusive (16 bit)
\details Executes a exclusive STR instruction for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __STREXH(value, ptr) __strex(value, ptr)
#else
#define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
#endif
/**
\brief STR Exclusive (32 bit)
\details Executes a exclusive STR instruction for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
\return 0 Function succeeded
\return 1 Function failed
*/
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
#define __STREXW(value, ptr) __strex(value, ptr)
#else
#define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
#endif
/**
\brief Remove the exclusive lock
\details Removes the exclusive lock which is created by LDREX.
*/
#define __CLREX __clrex
/**
\brief Signed Saturate
\details Saturates a signed value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (1..32)
\return Saturated value
*/
#define __SSAT __ssat
/**
\brief Unsigned Saturate
\details Saturates an unsigned value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (0..31)
\return Saturated value
*/
#define __USAT __usat
/**
\brief Rotate Right with Extend (32 bit)
\details Moves each bit of a bitstring right by one bit.
The carry input is shifted in at the left end of the bitstring.
\param [in] value Value to rotate
\return Rotated value
*/
#ifndef __NO_EMBEDDED_ASM
__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
{
rrx r0, r0
bx lr
}
#endif
/**
\brief LDRT Unprivileged (8 bit)
\details Executes a Unprivileged LDRT instruction for 8 bit value.
\param [in] ptr Pointer to data
\return value of type uint8_t at (*ptr)
*/
#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
/**
\brief LDRT Unprivileged (16 bit)
\details Executes a Unprivileged LDRT instruction for 16 bit values.
\param [in] ptr Pointer to data
\return value of type uint16_t at (*ptr)
*/
#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
/**
\brief LDRT Unprivileged (32 bit)
\details Executes a Unprivileged LDRT instruction for 32 bit values.
\param [in] ptr Pointer to data
\return value of type uint32_t at (*ptr)
*/
#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
/**
\brief STRT Unprivileged (8 bit)
\details Executes a Unprivileged STRT instruction for 8 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
#define __STRBT(value, ptr) __strt(value, ptr)
/**
\brief STRT Unprivileged (16 bit)
\details Executes a Unprivileged STRT instruction for 16 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
#define __STRHT(value, ptr) __strt(value, ptr)
/**
\brief STRT Unprivileged (32 bit)
\details Executes a Unprivileged STRT instruction for 32 bit values.
\param [in] value Value to store
\param [in] ptr Pointer to location
*/
#define __STRT(value, ptr) __strt(value, ptr)
#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/**
\brief Signed Saturate
\details Saturates a signed value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (1..32)
\return Saturated value
*/
__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
{
if ((sat >= 1U) && (sat <= 32U))
{
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
const int32_t min = -1 - max ;
if (val > max)
{
return max;
}
else if (val < min)
{
return min;
}
}
return val;
}
/**
\brief Unsigned Saturate
\details Saturates an unsigned value.
\param [in] value Value to be saturated
\param [in] sat Bit position to saturate to (0..31)
\return Saturated value
*/
__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
{
if (sat <= 31U)
{
const uint32_t max = ((1U << sat) - 1U);
if (val > (int32_t)max)
{
return max;
}
else if (val < 0)
{
return 0U;
}
}
return (uint32_t)val;
}
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
/* ################### Compiler specific Intrinsics ########################### */
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
Access to dedicated SIMD instructions
@{
*/
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
#define __SADD8 __sadd8
#define __QADD8 __qadd8
#define __SHADD8 __shadd8
#define __UADD8 __uadd8
#define __UQADD8 __uqadd8
#define __UHADD8 __uhadd8
#define __SSUB8 __ssub8
#define __QSUB8 __qsub8
#define __SHSUB8 __shsub8
#define __USUB8 __usub8
#define __UQSUB8 __uqsub8
#define __UHSUB8 __uhsub8
#define __SADD16 __sadd16
#define __QADD16 __qadd16
#define __SHADD16 __shadd16
#define __UADD16 __uadd16
#define __UQADD16 __uqadd16
#define __UHADD16 __uhadd16
#define __SSUB16 __ssub16
#define __QSUB16 __qsub16
#define __SHSUB16 __shsub16
#define __USUB16 __usub16
#define __UQSUB16 __uqsub16
#define __UHSUB16 __uhsub16
#define __SASX __sasx
#define __QASX __qasx
#define __SHASX __shasx
#define __UASX __uasx
#define __UQASX __uqasx
#define __UHASX __uhasx
#define __SSAX __ssax
#define __QSAX __qsax
#define __SHSAX __shsax
#define __USAX __usax
#define __UQSAX __uqsax
#define __UHSAX __uhsax
#define __USAD8 __usad8
#define __USADA8 __usada8
#define __SSAT16 __ssat16
#define __USAT16 __usat16
#define __UXTB16 __uxtb16
#define __UXTAB16 __uxtab16
#define __SXTB16 __sxtb16
#define __SXTAB16 __sxtab16
#define __SMUAD __smuad
#define __SMUADX __smuadx
#define __SMLAD __smlad
#define __SMLADX __smladx
#define __SMLALD __smlald
#define __SMLALDX __smlaldx
#define __SMUSD __smusd
#define __SMUSDX __smusdx
#define __SMLSD __smlsd
#define __SMLSDX __smlsdx
#define __SMLSLD __smlsld
#define __SMLSLDX __smlsldx
#define __SEL __sel
#define __QADD __qadd
#define __QSUB __qsub
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
((int64_t)(ARG3) << 32U) ) >> 32U))
#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
/*@} end of group CMSIS_SIMD_intrinsics */
#endif /* __CMSIS_ARMCC_H */

View File

@ -0,0 +1,266 @@
/**************************************************************************//**
* @file cmsis_compiler.h
* @brief CMSIS compiler generic header file
* @version V5.0.4
* @date 10. January 2018
******************************************************************************/
/*
* Copyright (c) 2009-2018 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CMSIS_COMPILER_H
#define __CMSIS_COMPILER_H
#include <stdint.h>
/*
* Arm Compiler 4/5
*/
#if defined ( __CC_ARM )
#include "cmsis_armcc.h"
/*
* Arm Compiler 6 (armclang)
*/
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#include "cmsis_armclang.h"
/*
* GNU Compiler
*/
#elif defined ( __GNUC__ )
#include "cmsis_gcc.h"
/*
* IAR Compiler
*/
#elif defined ( __ICCARM__ )
#include "cmsis_iccarm.h"
/*
* TI Arm Compiler
*/
#elif defined ( __TI_ARM__ )
#include <cmsis_ccs.h>
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __STATIC_INLINE
#endif
#ifndef __NO_RETURN
#define __NO_RETURN __attribute__((noreturn))
#endif
#ifndef __USED
#define __USED __attribute__((used))
#endif
#ifndef __WEAK
#define __WEAK __attribute__((weak))
#endif
#ifndef __PACKED
#define __PACKED __attribute__((packed))
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT struct __attribute__((packed))
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION union __attribute__((packed))
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
struct __attribute__((packed)) T_UINT32 { uint32_t v; };
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
#endif
#ifndef __ALIGNED
#define __ALIGNED(x) __attribute__((aligned(x)))
#endif
#ifndef __RESTRICT
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
#define __RESTRICT
#endif
/*
* TASKING Compiler
*/
#elif defined ( __TASKING__ )
/*
* The CMSIS functions have been implemented as intrinsics in the compiler.
* Please use "carm -?i" to get an up to date list of all intrinsics,
* Including the CMSIS ones.
*/
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __STATIC_INLINE
#endif
#ifndef __NO_RETURN
#define __NO_RETURN __attribute__((noreturn))
#endif
#ifndef __USED
#define __USED __attribute__((used))
#endif
#ifndef __WEAK
#define __WEAK __attribute__((weak))
#endif
#ifndef __PACKED
#define __PACKED __packed__
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT struct __packed__
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION union __packed__
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
struct __packed__ T_UINT32 { uint32_t v; };
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
#endif
#ifndef __ALIGNED
#define __ALIGNED(x) __align(x)
#endif
#ifndef __RESTRICT
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
#define __RESTRICT
#endif
/*
* COSMIC Compiler
*/
#elif defined ( __CSMC__ )
#include <cmsis_csm.h>
#ifndef __ASM
#define __ASM _asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __STATIC_INLINE
#endif
#ifndef __NO_RETURN
// NO RETURN is automatically detected hence no warning here
#define __NO_RETURN
#endif
#ifndef __USED
#warning No compiler specific solution for __USED. __USED is ignored.
#define __USED
#endif
#ifndef __WEAK
#define __WEAK __weak
#endif
#ifndef __PACKED
#define __PACKED @packed
#endif
#ifndef __PACKED_STRUCT
#define __PACKED_STRUCT @packed struct
#endif
#ifndef __PACKED_UNION
#define __PACKED_UNION @packed union
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
@packed struct T_UINT32 { uint32_t v; };
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT16_READ
__PACKED_STRUCT T_UINT16_READ { uint16_t v; };
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
#endif
#ifndef __UNALIGNED_UINT32_READ
__PACKED_STRUCT T_UINT32_READ { uint32_t v; };
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
#endif
#ifndef __ALIGNED
#warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.
#define __ALIGNED(x)
#endif
#ifndef __RESTRICT
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
#define __RESTRICT
#endif
#else
#error Unknown compiler.
#endif
#endif /* __CMSIS_COMPILER_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,935 @@
/**************************************************************************//**
* @file cmsis_iccarm.h
* @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file
* @version V5.0.7
* @date 19. June 2018
******************************************************************************/
//------------------------------------------------------------------------------
//
// Copyright (c) 2017-2018 IAR Systems
//
// Licensed under the Apache License, Version 2.0 (the "License")
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//------------------------------------------------------------------------------
#ifndef __CMSIS_ICCARM_H__
#define __CMSIS_ICCARM_H__
#ifndef __ICCARM__
#error This file should only be compiled by ICCARM
#endif
#pragma system_include
#define __IAR_FT _Pragma("inline=forced") __intrinsic
#if (__VER__ >= 8000000)
#define __ICCARM_V8 1
#else
#define __ICCARM_V8 0
#endif
#ifndef __ALIGNED
#if __ICCARM_V8
#define __ALIGNED(x) __attribute__((aligned(x)))
#elif (__VER__ >= 7080000)
/* Needs IAR language extensions */
#define __ALIGNED(x) __attribute__((aligned(x)))
#else
#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored.
#define __ALIGNED(x)
#endif
#endif
/* Define compiler macros for CPU architecture, used in CMSIS 5.
*/
#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__
/* Macros already defined */
#else
#if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)
#define __ARM_ARCH_8M_MAIN__ 1
#elif defined(__ARM8M_BASELINE__)
#define __ARM_ARCH_8M_BASE__ 1
#elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M'
#if __ARM_ARCH == 6
#define __ARM_ARCH_6M__ 1
#elif __ARM_ARCH == 7
#if __ARM_FEATURE_DSP
#define __ARM_ARCH_7EM__ 1
#else
#define __ARM_ARCH_7M__ 1
#endif
#endif /* __ARM_ARCH */
#endif /* __ARM_ARCH_PROFILE == 'M' */
#endif
/* Alternativ core deduction for older ICCARM's */
#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \
!defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__)
#if defined(__ARM6M__) && (__CORE__ == __ARM6M__)
#define __ARM_ARCH_6M__ 1
#elif defined(__ARM7M__) && (__CORE__ == __ARM7M__)
#define __ARM_ARCH_7M__ 1
#elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__)
#define __ARM_ARCH_7EM__ 1
#elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__)
#define __ARM_ARCH_8M_BASE__ 1
#elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__)
#define __ARM_ARCH_8M_MAIN__ 1
#elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__)
#define __ARM_ARCH_8M_MAIN__ 1
#else
#error "Unknown target."
#endif
#endif
#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1
#define __IAR_M0_FAMILY 1
#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1
#define __IAR_M0_FAMILY 1
#else
#define __IAR_M0_FAMILY 0
#endif
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __INLINE
#define __INLINE inline
#endif
#ifndef __NO_RETURN
#if __ICCARM_V8
#define __NO_RETURN __attribute__((__noreturn__))
#else
#define __NO_RETURN _Pragma("object_attribute=__noreturn")
#endif
#endif
#ifndef __PACKED
#if __ICCARM_V8
#define __PACKED __attribute__((packed, aligned(1)))
#else
/* Needs IAR language extensions */
#define __PACKED __packed
#endif
#endif
#ifndef __PACKED_STRUCT
#if __ICCARM_V8
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
#else
/* Needs IAR language extensions */
#define __PACKED_STRUCT __packed struct
#endif
#endif
#ifndef __PACKED_UNION
#if __ICCARM_V8
#define __PACKED_UNION union __attribute__((packed, aligned(1)))
#else
/* Needs IAR language extensions */
#define __PACKED_UNION __packed union
#endif
#endif
#ifndef __RESTRICT
#define __RESTRICT __restrict
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline
#endif
#ifndef __FORCEINLINE
#define __FORCEINLINE _Pragma("inline=forced")
#endif
#ifndef __STATIC_FORCEINLINE
#define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE
#endif
#ifndef __UNALIGNED_UINT16_READ
#pragma language=save
#pragma language=extended
__IAR_FT uint16_t __iar_uint16_read(void const *ptr)
{
return *(__packed uint16_t*)(ptr);
}
#pragma language=restore
#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR)
#endif
#ifndef __UNALIGNED_UINT16_WRITE
#pragma language=save
#pragma language=extended
__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val)
{
*(__packed uint16_t*)(ptr) = val;;
}
#pragma language=restore
#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL)
#endif
#ifndef __UNALIGNED_UINT32_READ
#pragma language=save
#pragma language=extended
__IAR_FT uint32_t __iar_uint32_read(void const *ptr)
{
return *(__packed uint32_t*)(ptr);
}
#pragma language=restore
#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR)
#endif
#ifndef __UNALIGNED_UINT32_WRITE
#pragma language=save
#pragma language=extended
__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val)
{
*(__packed uint32_t*)(ptr) = val;;
}
#pragma language=restore
#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL)
#endif
#ifndef __UNALIGNED_UINT32 /* deprecated */
#pragma language=save
#pragma language=extended
__packed struct __iar_u32 { uint32_t v; };
#pragma language=restore
#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v)
#endif
#ifndef __USED
#if __ICCARM_V8
#define __USED __attribute__((used))
#else
#define __USED _Pragma("__root")
#endif
#endif
#ifndef __WEAK
#if __ICCARM_V8
#define __WEAK __attribute__((weak))
#else
#define __WEAK _Pragma("__weak")
#endif
#endif
#ifndef __ICCARM_INTRINSICS_VERSION__
#define __ICCARM_INTRINSICS_VERSION__ 0
#endif
#if __ICCARM_INTRINSICS_VERSION__ == 2
#if defined(__CLZ)
#undef __CLZ
#endif
#if defined(__REVSH)
#undef __REVSH
#endif
#if defined(__RBIT)
#undef __RBIT
#endif
#if defined(__SSAT)
#undef __SSAT
#endif
#if defined(__USAT)
#undef __USAT
#endif
#include "iccarm_builtin.h"
#define __disable_fault_irq __iar_builtin_disable_fiq
#define __disable_irq __iar_builtin_disable_interrupt
#define __enable_fault_irq __iar_builtin_enable_fiq
#define __enable_irq __iar_builtin_enable_interrupt
#define __arm_rsr __iar_builtin_rsr
#define __arm_wsr __iar_builtin_wsr
#define __get_APSR() (__arm_rsr("APSR"))
#define __get_BASEPRI() (__arm_rsr("BASEPRI"))
#define __get_CONTROL() (__arm_rsr("CONTROL"))
#define __get_FAULTMASK() (__arm_rsr("FAULTMASK"))
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )
#define __get_FPSCR() (__arm_rsr("FPSCR"))
#define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE)))
#else
#define __get_FPSCR() ( 0 )
#define __set_FPSCR(VALUE) ((void)VALUE)
#endif
#define __get_IPSR() (__arm_rsr("IPSR"))
#define __get_MSP() (__arm_rsr("MSP"))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
#define __get_MSPLIM() (0U)
#else
#define __get_MSPLIM() (__arm_rsr("MSPLIM"))
#endif
#define __get_PRIMASK() (__arm_rsr("PRIMASK"))
#define __get_PSP() (__arm_rsr("PSP"))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
#define __get_PSPLIM() (0U)
#else
#define __get_PSPLIM() (__arm_rsr("PSPLIM"))
#endif
#define __get_xPSR() (__arm_rsr("xPSR"))
#define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE)))
#define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE)))
#define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE)))
#define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE)))
#define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE)))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
#define __set_MSPLIM(VALUE) ((void)(VALUE))
#else
#define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE)))
#endif
#define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE)))
#define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE)))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
#define __set_PSPLIM(VALUE) ((void)(VALUE))
#else
#define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE)))
#endif
#define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS"))
#define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE)))
#define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS"))
#define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE)))
#define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS"))
#define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE)))
#define __TZ_get_SP_NS() (__arm_rsr("SP_NS"))
#define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE)))
#define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS"))
#define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE)))
#define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS"))
#define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE)))
#define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS"))
#define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE)))
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
#define __TZ_get_PSPLIM_NS() (0U)
#define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE))
#else
#define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS"))
#define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE)))
#endif
#define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS"))
#define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE)))
#define __NOP __iar_builtin_no_operation
#define __CLZ __iar_builtin_CLZ
#define __CLREX __iar_builtin_CLREX
#define __DMB __iar_builtin_DMB
#define __DSB __iar_builtin_DSB
#define __ISB __iar_builtin_ISB
#define __LDREXB __iar_builtin_LDREXB
#define __LDREXH __iar_builtin_LDREXH
#define __LDREXW __iar_builtin_LDREX
#define __RBIT __iar_builtin_RBIT
#define __REV __iar_builtin_REV
#define __REV16 __iar_builtin_REV16
__IAR_FT int16_t __REVSH(int16_t val)
{
return (int16_t) __iar_builtin_REVSH(val);
}
#define __ROR __iar_builtin_ROR
#define __RRX __iar_builtin_RRX
#define __SEV __iar_builtin_SEV
#if !__IAR_M0_FAMILY
#define __SSAT __iar_builtin_SSAT
#endif
#define __STREXB __iar_builtin_STREXB
#define __STREXH __iar_builtin_STREXH
#define __STREXW __iar_builtin_STREX
#if !__IAR_M0_FAMILY
#define __USAT __iar_builtin_USAT
#endif
#define __WFE __iar_builtin_WFE
#define __WFI __iar_builtin_WFI
#if __ARM_MEDIA__
#define __SADD8 __iar_builtin_SADD8
#define __QADD8 __iar_builtin_QADD8
#define __SHADD8 __iar_builtin_SHADD8
#define __UADD8 __iar_builtin_UADD8
#define __UQADD8 __iar_builtin_UQADD8
#define __UHADD8 __iar_builtin_UHADD8
#define __SSUB8 __iar_builtin_SSUB8
#define __QSUB8 __iar_builtin_QSUB8
#define __SHSUB8 __iar_builtin_SHSUB8
#define __USUB8 __iar_builtin_USUB8
#define __UQSUB8 __iar_builtin_UQSUB8
#define __UHSUB8 __iar_builtin_UHSUB8
#define __SADD16 __iar_builtin_SADD16
#define __QADD16 __iar_builtin_QADD16
#define __SHADD16 __iar_builtin_SHADD16
#define __UADD16 __iar_builtin_UADD16
#define __UQADD16 __iar_builtin_UQADD16
#define __UHADD16 __iar_builtin_UHADD16
#define __SSUB16 __iar_builtin_SSUB16
#define __QSUB16 __iar_builtin_QSUB16
#define __SHSUB16 __iar_builtin_SHSUB16
#define __USUB16 __iar_builtin_USUB16
#define __UQSUB16 __iar_builtin_UQSUB16
#define __UHSUB16 __iar_builtin_UHSUB16
#define __SASX __iar_builtin_SASX
#define __QASX __iar_builtin_QASX
#define __SHASX __iar_builtin_SHASX
#define __UASX __iar_builtin_UASX
#define __UQASX __iar_builtin_UQASX
#define __UHASX __iar_builtin_UHASX
#define __SSAX __iar_builtin_SSAX
#define __QSAX __iar_builtin_QSAX
#define __SHSAX __iar_builtin_SHSAX
#define __USAX __iar_builtin_USAX
#define __UQSAX __iar_builtin_UQSAX
#define __UHSAX __iar_builtin_UHSAX
#define __USAD8 __iar_builtin_USAD8
#define __USADA8 __iar_builtin_USADA8
#define __SSAT16 __iar_builtin_SSAT16
#define __USAT16 __iar_builtin_USAT16
#define __UXTB16 __iar_builtin_UXTB16
#define __UXTAB16 __iar_builtin_UXTAB16
#define __SXTB16 __iar_builtin_SXTB16
#define __SXTAB16 __iar_builtin_SXTAB16
#define __SMUAD __iar_builtin_SMUAD
#define __SMUADX __iar_builtin_SMUADX
#define __SMMLA __iar_builtin_SMMLA
#define __SMLAD __iar_builtin_SMLAD
#define __SMLADX __iar_builtin_SMLADX
#define __SMLALD __iar_builtin_SMLALD
#define __SMLALDX __iar_builtin_SMLALDX
#define __SMUSD __iar_builtin_SMUSD
#define __SMUSDX __iar_builtin_SMUSDX
#define __SMLSD __iar_builtin_SMLSD
#define __SMLSDX __iar_builtin_SMLSDX
#define __SMLSLD __iar_builtin_SMLSLD
#define __SMLSLDX __iar_builtin_SMLSLDX
#define __SEL __iar_builtin_SEL
#define __QADD __iar_builtin_QADD
#define __QSUB __iar_builtin_QSUB
#define __PKHBT __iar_builtin_PKHBT
#define __PKHTB __iar_builtin_PKHTB
#endif
#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */
#if __IAR_M0_FAMILY
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
#define __CLZ __cmsis_iar_clz_not_active
#define __SSAT __cmsis_iar_ssat_not_active
#define __USAT __cmsis_iar_usat_not_active
#define __RBIT __cmsis_iar_rbit_not_active
#define __get_APSR __cmsis_iar_get_APSR_not_active
#endif
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
#define __get_FPSCR __cmsis_iar_get_FPSR_not_active
#define __set_FPSCR __cmsis_iar_set_FPSR_not_active
#endif
#ifdef __INTRINSICS_INCLUDED
#error intrinsics.h is already included previously!
#endif
#include <intrinsics.h>
#if __IAR_M0_FAMILY
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */
#undef __CLZ
#undef __SSAT
#undef __USAT
#undef __RBIT
#undef __get_APSR
__STATIC_INLINE uint8_t __CLZ(uint32_t data)
{
if (data == 0U) { return 32U; }
uint32_t count = 0U;
uint32_t mask = 0x80000000U;
while ((data & mask) == 0U)
{
count += 1U;
mask = mask >> 1U;
}
return count;
}
__STATIC_INLINE uint32_t __RBIT(uint32_t v)
{
uint8_t sc = 31U;
uint32_t r = v;
for (v >>= 1U; v; v >>= 1U)
{
r <<= 1U;
r |= v & 1U;
sc--;
}
return (r << sc);
}
__STATIC_INLINE uint32_t __get_APSR(void)
{
uint32_t res;
__asm("MRS %0,APSR" : "=r" (res));
return res;
}
#endif
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ))
#undef __get_FPSCR
#undef __set_FPSCR
#define __get_FPSCR() (0)
#define __set_FPSCR(VALUE) ((void)VALUE)
#endif
#pragma diag_suppress=Pe940
#pragma diag_suppress=Pe177
#define __enable_irq __enable_interrupt
#define __disable_irq __disable_interrupt
#define __NOP __no_operation
#define __get_xPSR __get_PSR
#if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0)
__IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr)
{
return __LDREX((unsigned long *)ptr);
}
__IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr)
{
return __STREX(value, (unsigned long *)ptr);
}
#endif
/* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
#if (__CORTEX_M >= 0x03)
__IAR_FT uint32_t __RRX(uint32_t value)
{
uint32_t result;
__ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc");
return(result);
}
__IAR_FT void __set_BASEPRI_MAX(uint32_t value)
{
__asm volatile("MSR BASEPRI_MAX,%0"::"r" (value));
}
#define __enable_fault_irq __enable_fiq
#define __disable_fault_irq __disable_fiq
#endif /* (__CORTEX_M >= 0x03) */
__IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2)
{
return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2));
}
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
__IAR_FT uint32_t __get_MSPLIM(void)
{
uint32_t res;
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
res = 0U;
#else
__asm volatile("MRS %0,MSPLIM" : "=r" (res));
#endif
return res;
}
__IAR_FT void __set_MSPLIM(uint32_t value)
{
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure MSPLIM is RAZ/WI
(void)value;
#else
__asm volatile("MSR MSPLIM,%0" :: "r" (value));
#endif
}
__IAR_FT uint32_t __get_PSPLIM(void)
{
uint32_t res;
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
res = 0U;
#else
__asm volatile("MRS %0,PSPLIM" : "=r" (res));
#endif
return res;
}
__IAR_FT void __set_PSPLIM(uint32_t value)
{
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
(void)value;
#else
__asm volatile("MSR PSPLIM,%0" :: "r" (value));
#endif
}
__IAR_FT uint32_t __TZ_get_CONTROL_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,CONTROL_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_CONTROL_NS(uint32_t value)
{
__asm volatile("MSR CONTROL_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_PSP_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,PSP_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_PSP_NS(uint32_t value)
{
__asm volatile("MSR PSP_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_MSP_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,MSP_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_MSP_NS(uint32_t value)
{
__asm volatile("MSR MSP_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_SP_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,SP_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_SP_NS(uint32_t value)
{
__asm volatile("MSR SP_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_PRIMASK_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,PRIMASK_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value)
{
__asm volatile("MSR PRIMASK_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_BASEPRI_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,BASEPRI_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value)
{
__asm volatile("MSR BASEPRI_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value)
{
__asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value));
}
__IAR_FT uint32_t __TZ_get_PSPLIM_NS(void)
{
uint32_t res;
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
res = 0U;
#else
__asm volatile("MRS %0,PSPLIM_NS" : "=r" (res));
#endif
return res;
}
__IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value)
{
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3)))
// without main extensions, the non-secure PSPLIM is RAZ/WI
(void)value;
#else
__asm volatile("MSR PSPLIM_NS,%0" :: "r" (value));
#endif
}
__IAR_FT uint32_t __TZ_get_MSPLIM_NS(void)
{
uint32_t res;
__asm volatile("MRS %0,MSPLIM_NS" : "=r" (res));
return res;
}
__IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value)
{
__asm volatile("MSR MSPLIM_NS,%0" :: "r" (value));
}
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */
#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value))
#if __IAR_M0_FAMILY
__STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat)
{
if ((sat >= 1U) && (sat <= 32U))
{
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
const int32_t min = -1 - max ;
if (val > max)
{
return max;
}
else if (val < min)
{
return min;
}
}
return val;
}
__STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat)
{
if (sat <= 31U)
{
const uint32_t max = ((1U << sat) - 1U);
if (val > (int32_t)max)
{
return max;
}
else if (val < 0)
{
return 0U;
}
}
return (uint32_t)val;
}
#endif
#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */
__IAR_FT uint8_t __LDRBT(volatile uint8_t *addr)
{
uint32_t res;
__ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
return ((uint8_t)res);
}
__IAR_FT uint16_t __LDRHT(volatile uint16_t *addr)
{
uint32_t res;
__ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
return ((uint16_t)res);
}
__IAR_FT uint32_t __LDRT(volatile uint32_t *addr)
{
uint32_t res;
__ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory");
return res;
}
__IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr)
{
__ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
}
__IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr)
{
__ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory");
}
__IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr)
{
__ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory");
}
#endif /* (__CORTEX_M >= 0x03) */
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) )
__IAR_FT uint8_t __LDAB(volatile uint8_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
return ((uint8_t)res);
}
__IAR_FT uint16_t __LDAH(volatile uint16_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
return ((uint16_t)res);
}
__IAR_FT uint32_t __LDA(volatile uint32_t *ptr)
{
uint32_t res;
__ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
return res;
}
__IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr)
{
__ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
}
__IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr)
{
__ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
}
__IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr)
{
__ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory");
}
__IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
return ((uint8_t)res);
}
__IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
return ((uint16_t)res);
}
__IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr)
{
uint32_t res;
__ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory");
return res;
}
__IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)
{
uint32_t res;
__ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
return res;
}
__IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)
{
uint32_t res;
__ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
return res;
}
__IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)
{
uint32_t res;
__ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory");
return res;
}
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */
#undef __IAR_FT
#undef __IAR_M0_FAMILY
#undef __ICCARM_V8
#pragma diag_default=Pe940
#pragma diag_default=Pe177
#endif /* __CMSIS_ICCARM_H__ */

View File

@ -0,0 +1,39 @@
/**************************************************************************//**
* @file cmsis_version.h
* @brief CMSIS Core(M) Version definitions
* @version V5.0.2
* @date 19. April 2017
******************************************************************************/
/*
* Copyright (c) 2009-2017 ARM Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */
#elif defined (__clang__)
#pragma clang system_header /* treat file as system include file */
#endif
#ifndef __CMSIS_VERSION_H
#define __CMSIS_VERSION_H
/* CMSIS Version definitions */
#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */
#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */
#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \
__CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */
#endif

View File

@ -0,0 +1,270 @@
/******************************************************************************
* @file mpu_armv7.h
* @brief CMSIS MPU API for Armv7-M MPU
* @version V5.0.4
* @date 10. January 2018
******************************************************************************/
/*
* Copyright (c) 2017-2018 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */
#elif defined (__clang__)
#pragma clang system_header /* treat file as system include file */
#endif
#ifndef ARM_MPU_ARMV7_H
#define ARM_MPU_ARMV7_H
#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes
#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes
#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes
#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes
#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes
#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte
#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes
#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes
#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes
#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes
#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes
#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes
#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes
#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes
#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes
#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte
#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes
#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes
#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes
#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes
#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes
#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes
#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes
#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes
#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes
#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte
#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes
#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes
#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access
#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only
#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only
#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access
#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only
#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access
/** MPU Region Base Address Register Value
*
* \param Region The region to be configured, number 0 to 15.
* \param BaseAddress The base address for the region.
*/
#define ARM_MPU_RBAR(Region, BaseAddress) \
(((BaseAddress) & MPU_RBAR_ADDR_Msk) | \
((Region) & MPU_RBAR_REGION_Msk) | \
(MPU_RBAR_VALID_Msk))
/**
* MPU Memory Access Attributes
*
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
* \param IsShareable Region is shareable between multiple bus masters.
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
*/
#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \
((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \
(((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \
(((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \
(((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk))
/**
* MPU Region Attribute and Size Register Value
*
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_.
* \param SubRegionDisable Sub-region disable field.
* \param Size Region size of the region to be configured, for example 4K, 8K.
*/
#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \
((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \
(((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \
(((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk)))
/**
* MPU Region Attribute and Size Register Value
*
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
* \param IsShareable Region is shareable between multiple bus masters.
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
* \param SubRegionDisable Sub-region disable field.
* \param Size Region size of the region to be configured, for example 4K, 8K.
*/
#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \
ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size)
/**
* MPU Memory Access Attribute for strongly ordered memory.
* - TEX: 000b
* - Shareable
* - Non-cacheable
* - Non-bufferable
*/
#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U)
/**
* MPU Memory Access Attribute for device memory.
* - TEX: 000b (if non-shareable) or 010b (if shareable)
* - Shareable or non-shareable
* - Non-cacheable
* - Bufferable (if shareable) or non-bufferable (if non-shareable)
*
* \param IsShareable Configures the device memory as shareable or non-shareable.
*/
#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U))
/**
* MPU Memory Access Attribute for normal memory.
* - TEX: 1BBb (reflecting outer cacheability rules)
* - Shareable or non-shareable
* - Cacheable or non-cacheable (reflecting inner cacheability rules)
* - Bufferable or non-bufferable (reflecting inner cacheability rules)
*
* \param OuterCp Configures the outer cache policy.
* \param InnerCp Configures the inner cache policy.
* \param IsShareable Configures the memory as shareable or non-shareable.
*/
#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U))
/**
* MPU Memory Access Attribute non-cacheable policy.
*/
#define ARM_MPU_CACHEP_NOCACHE 0U
/**
* MPU Memory Access Attribute write-back, write and read allocate policy.
*/
#define ARM_MPU_CACHEP_WB_WRA 1U
/**
* MPU Memory Access Attribute write-through, no write allocate policy.
*/
#define ARM_MPU_CACHEP_WT_NWA 2U
/**
* MPU Memory Access Attribute write-back, no write allocate policy.
*/
#define ARM_MPU_CACHEP_WB_NWA 3U
/**
* Struct for a single MPU Region
*/
typedef struct {
uint32_t RBAR; //!< The region base address register value (RBAR)
uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR
} ARM_MPU_Region_t;
/** Enable the MPU.
* \param MPU_Control Default access permissions for unconfigured regions.
*/
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)
{
__DSB();
__ISB();
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
#endif
}
/** Disable the MPU.
*/
__STATIC_INLINE void ARM_MPU_Disable(void)
{
__DSB();
__ISB();
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
#endif
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
}
/** Clear and disable the given MPU region.
* \param rnr Region number to be cleared.
*/
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
{
MPU->RNR = rnr;
MPU->RASR = 0U;
}
/** Configure an MPU region.
* \param rbar Value for RBAR register.
* \param rsar Value for RSAR register.
*/
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr)
{
MPU->RBAR = rbar;
MPU->RASR = rasr;
}
/** Configure the given MPU region.
* \param rnr Region number to be configured.
* \param rbar Value for RBAR register.
* \param rsar Value for RSAR register.
*/
__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr)
{
MPU->RNR = rnr;
MPU->RBAR = rbar;
MPU->RASR = rasr;
}
/** Memcopy with strictly ordered memory access, e.g. for register targets.
* \param dst Destination data is copied to.
* \param src Source data is copied from.
* \param len Amount of data words to be copied.
*/
__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
{
uint32_t i;
for (i = 0U; i < len; ++i)
{
dst[i] = src[i];
}
}
/** Load the given number of MPU regions from a table.
* \param table Pointer to the MPU configuration table.
* \param cnt Amount of regions to be configured.
*/
__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt)
{
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
while (cnt > MPU_TYPE_RALIASES) {
orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize);
table += MPU_TYPE_RALIASES;
cnt -= MPU_TYPE_RALIASES;
}
orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize);
}
#endif

View File

@ -0,0 +1,101 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _CPU_DRV_H_
#define _CPU_DRV_H_
/*! \brief Contains public interface to various functions related
* to the CPU
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "cva/CVM012x.h"
#include "irq/irq_drv.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Enter supervisor mode
*
* This function convert the CPU into supervisor mode.
*
*/
static inline void CpuDrv_EnterSupervisorMode(void)
{
/* if CPU in user mode */
if ((__get_CONTROL() & 0x1) == 1)
{
/* change to privilege mode */
__asm("svc #0x32");
}
}
/*! \brief Change to supervisor mode
*
* This function change the CPU into supervisor mode.
*
*/
static inline void CpuDrv_ChangeToSupervisorMode(void)
{
__asm(" MOVS R0, #0x0 ");
__asm(" MSR CONTROL, R0 ");
__asm("DSB");
__asm("ISB");
}
/*! \brief Enter user mode
*
* This function change the CPU into user mode.
*
*/
static inline void CpuDrv_EnterUserMode(void)
{
__asm(" MOVS R0, #0x1 ");
__asm(" MSR CONTROL, R0 ");
__asm("DSB");
__asm("ISB");
}
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _CPU_DRV_H_ */

View File

@ -0,0 +1,302 @@
/*
* Copyright (c) 2023, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _CVM012X_H_
#define _CVM012X_H_
/*! \brief Contains public interface to various functions related
* to all the registers of CVM012x series chips
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the Interrupt Number Definition
******************************************************************************/
typedef enum
{
/* Core interrupts */
NMI_IRQn = -14, /**< Non Maskable Interrupt */
HardFault_IRQn = -13, /**< Cortex-M0 SV Hard Fault Interrupt */
SVCall_IRQn = -5, /**< Cortex-M0 SV Call Interrupt */
PendSV_IRQn = -2, /**< Cortex-M0 Pend SV Interrupt */
SysTick_IRQn = -1, /**< Cortex-M0 System Tick Interrupt */
/* CVM012x specific interrupts */
DMA0_IRQn = 0u, /**< DMA channel 0 transfer complete */
DMA1_IRQn = 1u, /**< DMA channel 1 transfer complete */
DMA2_IRQn = 2u, /**< DMA channel 2 transfer complete */
DMA3_IRQn = 3u, /**< DMA channel 3 transfer complete */
DMA_Error_IRQn = 4u, /**< DMA error interrupt channels 0-3 */
FHU_IRQn = 5u, /**< FHU Interrupt, ERM single bit error correction */
RTC_Alarm_IRQn = 6u, /**< RTC alarm interrupt */
RTC_Seconds_IRQn = 7u, /**< RTC seconds interrupt */
LPTMR_IRQn = 8u, /**< LPTIMER interrupt request */
PORT_IRQn = 9u, /**< Port ABCDE pin detect interrupt */
CAN_ORed_IRQn = 10u, /**< CAN OR'ed [BusOff\BusOffDone\TransWarning\ReceiveWarning\..... ] */
CAN_ORed_0_31_MB_IRQn = 11u, /**< CAN OR'ed Message buffer (0-31) */
CAN_ORed_32_63_MB_IRQn = 12u, /**< CAN OR'ed Message buffer (32-63) */
MFT0_Ch0_Ch5_IRQn = 13u, /**< MFT0 Channel 0 to 7 interrupt */
MFT0_Fault_IRQn = 14u, /**< MFT0 Fault interrupt */
MFT0_Ovf_Reload_IRQn = 15u, /**< MFT0 Counter overflow and Reload interrupt */
MFT1_Ch0_Ch5_IRQn = 16u, /**< MFT1 Channel 0 to 7 interrupt */
MFT1_Fault_IRQn = 17u, /**< MFT1 Fault interrupt */
MFT1_Ovf_Reload_IRQn = 18u, /**< MFT1 Counter overflow and Reload interrupt */
FTFC_IRQn = 19u, /**< FTFC Command done,read collision,err response interrupt */
PDB_IRQn = 20u, /**< PDB interrupt */
LPIT_IRQn = 21u, /**< LPIT interrupt */
CMU_IRQn = 22u, /**< CMU PLL,SOSC interrupt */
WDOG_IRQn = 23u, /**< Interrupt request out before wdg reset out */
RCM_IRQn = 24u, /**< RCM Asynchronous Interrupt, Reset interrutpt */
I2C_IRQn = 25u, /**< I2C Interrupt */
SPI0_IRQn = 26u, /**< SPI0 Interrupt */
SPI1_IRQn = 27u, /**< SPI1 Interrupt */
ADC_IRQn = 28u, /**< ADC interrupt request. */
UART0_RxTx_IRQn = 29u, /**< UART0 Transmit / Receive Interrupt */
UART1_RxTx_IRQn = 30u, /**< UART1 Transmit / Receive Interrupt */
TOUCH_IRQn = 31u, /**< Touch Interrupt */
} IRQn_Type;
/*******************************************************************************
* the Processor and Core Peripheral Section
******************************************************************************/
#define __NVIC_PRIO_BITS 2 /*!< Number of Bits used for Priority Levels */
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
#define __MPU_PRESENT 0 /*!< MPU present or not */
/* ToDo: define __FPU_PRESENT if your devise is a CORTEX-M4 */
#define __FPU_PRESENT 0 /*!< FPU present or not */
#define __VTOR_PRESENT 1
#include "../cmsis/core_cm0plus.h"
/*******************************************************************************
* the Device Specific Peripheral registers structures
******************************************************************************/
#include "mscm_reg.h"
#include "cmu_reg.h"
#include "fhu_reg.h"
#include "edma_reg.h"
#include "crc_reg.h"
#include "mpu_reg.h"
#include "erm_reg.h"
#include "eim_reg.h"
#include "ftfc_reg.h"
#include "dmamux_reg.h"
#include "axbs_reg.h"
#include "adc_reg.h"
#include "pdb_reg.h"
#include "spi_reg.h"
#include "mft_reg.h"
#include "gpio_reg.h"
#include "flexcan_reg.h"
#include "pwmlite_reg.h"
#include "trgmux_reg.h"
#include "sim_reg.h"
#include "port_reg.h"
#include "i2c_reg.h"
#include "uart_reg.h"
#include "scg0_reg.h"
#include "scg1_reg.h"
#include "scg2_reg.h"
#include "pcc0_reg.h"
#include "pcc1_reg.h"
#include "lptmr_reg.h"
#include "lpit_reg.h"
#include "rtc_reg.h"
#include "wdg_reg.h"
#include "pmc_reg.h"
#include "rcm_reg.h"
/*******************************************************************************
* the Peripheral memory map
******************************************************************************/
/* MSCM module */
#define MSCM_BASE (0x40001000u)
#define MSCM ((MscmRegType *)MSCM_BASE)
/* CMU module */
#define CMU_PLL_BASE (0x40003000u)
#define CMU_PLL ((CmuRegType *)CMU_PLL_BASE)
#define CMU_SOSC_BASE (0x40004000u)
#define CMU_SOSC ((CmuRegType *)CMU_SOSC_BASE)
/* FHU module */
#define FHU_BASE (0x40005000u)
#define FHU ((FhuRegType *)FHU_BASE)
/* DMA module */
#define DMA_BASE (0x40008000u)
#define DMA ((EDmaRegType *)DMA_BASE)
/* CRC module */
#define CRC_BASE (0x4000C000u)
#define CRC ((CrcRegType *)CRC_BASE)
/* MPU module */
#define MPU_BASE (0x4000D000u)
#define MPU ((MpuRegType *)MPU_BASE)
/* ERM module */
#define ERM_BASE (0x40018000u)
#define ERM ((ErmRegType *)ERM_BASE)
/* EIM module */
#define EIM_BASE (0x40019000u)
#define EIM ((EimRegType *)EIM_BASE)
/* FTFC module */
#define FTFC_BASE (0x40020000u)
#define FTFC ((FtfcRegType *)FTFC_BASE)
/* DMAMUX module */
#define DMAMUX_BASE (0x40021000u)
#define DMAMUX ((DmamuxRegType *)DMAMUX_BASE)
/* AXBS module */
#define AXBS_BASE (0x40022000u)
#define AXBS ((AxbsRegType *)AXBS_BASE)
/* SPI modules */
#define SPI0_BASE (0x4002C000u)
#define SPI0 ((SpiRegType *)SPI0_BASE)
#define SPI1_BASE (0x4002D000u)
#define SPI1 ((SpiRegType *)SPI1_BASE)
/* MFT modules */
#define MFT0_BASE (0x40030000u)
#define MFT0 ((MftRegType *)MFT0_BASE)
#define MFT1_BASE (0x40031000u)
#define MFT1 ((MftRegType *)MFT1_BASE)
/* GPIO modules */
#define GPIOA_BASE (0x40035000u)
#define GPIOA ((GpioRegType *)GPIOA_BASE)
#define GPIOB_BASE (0x40035040u)
#define GPIOB ((GpioRegType *)GPIOB_BASE)
#define GPIOC_BASE (0x40035080u)
#define GPIOC ((GpioRegType *)GPIOC_BASE)
/* CAN modules */
#define CAN_BASE (0x40038000u)
#define CAN ((FlexCanRegType *)CAN_BASE)
/* PWMLITE modules */
#define PWMLITE0_BASE (0x40058000u)
#define PWMLITE0 ((PwmLiteRegType *)PWMLITE0_BASE)
#define PWMLITE1_BASE (0x40059000u)
#define PWMLITE1 ((PwmLiteRegType *)PWMLITE1_BASE)
/* TRGMUX module */
#define TRGMUX_BASE (0x4005E000u)
#define TRGMUX ((TrgMuxRegType *)TRGMUX_BASE)
/* SIM module */
#define SIM_BASE (0x4005F000u)
#define SIM ((SimRegType *)SIM_BASE)
/* PORT modules */
#define PORTA_BASE (0x40060000u)
#define PORTA ((PortRegType *)PORTA_BASE)
#define PORTB_BASE (0x40061000u)
#define PORTB ((PortRegType *)PORTB_BASE)
#define PORTC_BASE (0x40062000u)
#define PORTC ((PortRegType *)PORTC_BASE)
/* UART module */
#define UART0_BASE (0x4006A000u)
#define UART0 ((UartRegType *)UART0_BASE)
#define UART1_BASE (0x4006B000u)
#define UART1 ((UartRegType *)UART1_BASE)
/* SCG0 module */
#define SCG0_BASE (0x4006E000u)
#define SCG0 ((Scg0RegType *)SCG0_BASE)
/* SCG1 module */
#define SCG1_BASE (0x4006E400u)
#define SCG1 ((Scg1RegType *)SCG1_BASE)
/* SCG2 module */
#define SCG2_BASE (0x4006E800u)
#define SCG2 ((Scg2RegType *)SCG2_BASE)
/* PCC0 module */
#define PCC0_BASE (0x4006F000u)
#define PCC0 ((Pcc0RegType *)PCC0_BASE)
/* PCC1 module */
#define PCC1_BASE (0x4006F800u)
#define PCC1 ((Pcc1RegType *)PCC1_BASE)
/* ADC modules */
#define ADC_BASE (0x40070000u)
#define ADC ((AdcRegType *)ADC_BASE)
/* PDB modules */
#define PDB_BASE (0x40071000u)
#define PDB ((PdbRegType *)PDB_BASE)
/* LPTMR module */
#define LPTMR_BASE (0x40075000u)
#define LPTMR ((LptmrRegType *)LPTMR_BASE)
/* LPIT module */
#define LPIT_BASE (0x40077000u)
#define LPIT ((LpitRegType *)LPIT_BASE)
/* RTC module */
#define RTC_BASE (0x40078000u)
#define RTC ((RtcRegType *)RTC_BASE)
/* WDG module */
#define WDG_BASE (0x4007A000u)
#define WDG ((WdgRegType *)WDG_BASE)
/* I2C modules */
#define I2C_BASE (0x4007B000u)
#define I2C ((I2cRegType *)I2C_BASE)
/* PMC module */
#define PMC_BASE (0x4007D000u)
#define PMC ((PmcRegType *)PMC_BASE)
/* RCM module */
#define RCM_BASE (0x4007F000u)
#define RCM ((RcmRegType *)RCM_BASE)
/* GPIO_IOP modules */
#define GPIOA_IOP_BASE (0xF8000000u)
#define GPIOA_IOP ((GpioRegType *)GPIOA_IOP_BASE)
#define GPIOB_IOP_BASE (0xF8000040u)
#define GPIOB_IOP ((GpioRegType *)GPIOB_IOP_BASE)
#define GPIOC_IOP_BASE (0xF8000080u)
#define GPIOC_IOP ((GpioRegType *)GPIOC_IOP_BASE)
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _CVM012X_H_ */

View File

@ -0,0 +1,164 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "irq_drv.h"
#include "../cva/CVM012x.h"
/*******************************************************************************
* the defines
******************************************************************************/
/* The last IRQn defined by this chip */
#define LAST_IRQn (TOUCH_IRQn)
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*! Those symbols are defined in the startup code */
#if defined(__ARMCC_VERSION)
extern uint32_t __VECTOR_RAM;
extern uint32_t __VECTOR_ROM;
extern uint32_t __DATA_ROM;
extern uint32_t __RAM_START;
#else
#if defined(__ICCARM__)
extern uint32_t __RAM_START[];
#pragma section = "__CODE_ROM"
extern uint32_t CODE_ROM_SECTION_START = (uint32_t)__section_begin("__CODE_ROM");
#endif
extern uint32_t __VECTOR_RAM[((uint32_t)(LAST_IRQn)) + 16U + 1U];
extern uint32_t __VECTOR_TABLE[((uint32_t)(LAST_IRQn)) + 16U + 1U];
extern uint32_t __DATA_ROM[];
extern uint32_t __DATA_END[];
#endif
/*! Counter to manage the nested callings of global disable/enable interrupt. */
static int32_t s_interruptDisableCount = 0;
/*******************************************************************************
* the functions
******************************************************************************/
void IrqDrv_InstallHandler(uint16_t irqNumber, IrqHandlerType newHandler, IrqHandlerType *oldHandler)
{
const uint32_t *aVectorRam = (uint32_t *)__VECTOR_RAM;
#if defined(__ARMCC_VERSION)
const uint32_t *aVectorTable = (uint32_t *)__VECTOR_ROM;
#else
const uint32_t *aVectorTable = (uint32_t *)__VECTOR_TABLE;
#endif
/* Check whether there is vector table in RAM */
#if defined(__ARMCC_VERSION)
if((aVectorRam != aVectorTable) || (__DATA_ROM > __RAM_START)) /* polyspace DEFECT:USELESS_IF [No action planned:Low] "Depend on link script" */
#elif(defined(__ICCARM__))
if((aVectorRam != aVectorTable) || ((uint32_t)CODE_ROM_SECTION_START > (uint32_t)__RAM_START)) /* polyspace DEFECT:USELESS_IF [No action planned:Low] "Depend on link script" */
#else
const uint32_t *aDataRom = (uint32_t *)__DATA_ROM;
const uint32_t *aDataRam = (uint32_t *)__DATA_END;
if((aVectorRam != aVectorTable) || (aDataRom == aDataRam)) /* polyspace DEFECT:USELESS_IF [No action planned:Low] "Depend on link script" */
#endif
{
uint32_t *pVectorRam = (uint32_t *)__VECTOR_RAM;
/* Save the former handler pointer */
if(oldHandler != (IrqHandlerType *)0)
{
*oldHandler = (IrqHandlerType)pVectorRam[((int32_t)irqNumber) + 16];
}
/* Set handler into vector table */
pVectorRam[((int32_t)irqNumber) + 16] = (uint32_t)newHandler;
}
}
void IrqDrv_EnableGlobalInterrupt(void)
{
/* Check and update */
if(s_interruptDisableCount > 0)
{
s_interruptDisableCount--;
if(s_interruptDisableCount <= 0)
{
/* Enable the global interrupt*/
#if defined(__GNUC__)
__asm volatile("cpsie i"
:
:
: "memory");
#else
__asm("cpsie i");
#endif
}
}
}
void IrqDrv_DisableGlobalInterrupt(void)
{
/* Disable the global interrupt */
#if defined(__GNUC__)
__asm volatile("cpsid i"
:
:
: "memory");
#else
__asm("cpsid i");
#endif
/* Update counter*/
s_interruptDisableCount++;
}
void IrqDrv_EnableIrq(uint16_t irqNumber)
{
NVIC_EnableIRQ((IRQn_Type)irqNumber);
}
void IrqDrv_DisableIrq(uint16_t irqNumber)
{
NVIC_DisableIRQ((IRQn_Type)irqNumber);
}
void IrqDrv_SetPriority(uint16_t irqNumber, uint32_t preemptPriority, uint32_t subPriority)
{
NVIC_SetPriority((IRQn_Type)irqNumber, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority));
}
void IrqDrv_GetPriority(uint16_t irqNumber, uint32_t *pPreemptPriority, uint32_t *pSubPriority)
{
NVIC_DecodePriority(NVIC_GetPriority((IRQn_Type)irqNumber), NVIC_GetPriorityGrouping(), pPreemptPriority, pSubPriority);
}
void IrqDrv_ClearPending(uint16_t irqNumber)
{
NVIC_ClearPendingIRQ((IRQn_Type)irqNumber);
}
void IrqDrv_SetPending(uint16_t irqNumber)
{
NVIC_SetPendingIRQ((IRQn_Type)irqNumber);
}
bool IrqDrv_IsPending(uint16_t irqNumber)
{
return NVIC_GetPendingIRQ((IRQn_Type)irqNumber) == 1;
}

View File

@ -0,0 +1,158 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _IRQ_DRV_H_
#define _IRQ_DRV_H_
/*! \brief Contains public interface to various functions related
* to the driver of interrupt requests
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
/*! \addtogroup irq_drv
* @{
*/
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief Interrupt handler type */
typedef void (*IrqHandlerType)(void);
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Installs an interrupt handler routine for a given IRQ number.
*
* This function lets the application register/replace the interrupt
* handler for a specified IRQ number. See a chip-specific reference
* manual for details and the startup_<SoC>.s file for each chip
* family to find out the default interrupt handler for each device.
*
* \note This method is applicable only if interrupt vector is copied in RAM.
*
* \param[in] irqNumber : IRQ number
* \param[in] newHandler : New interrupt handler routine address pointer
* \param[in] oldHandler : Pointer to a location to store current interrupt handler
*/
extern void IrqDrv_InstallHandler(uint16_t irqNumber, IrqHandlerType newHandler, IrqHandlerType *oldHandler);
/*! \brief Enables system interrupt.
*
* This function enables the global interrupt by calling the core API.
*
*/
extern void IrqDrv_EnableGlobalInterrupt(void);
/*! \brief Disable system interrupt.
*
* This function disables the global interrupt by calling the core API.
*
*/
extern void IrqDrv_DisableGlobalInterrupt(void);
/*! \brief Enables an interrupt for a given IRQ number.
*
* This function enables the individual interrupt for a specified IRQ number.
*
* \param[in] irqNumber : IRQ number
*/
extern void IrqDrv_EnableIrq(uint16_t irqNumber);
/*! \brief Disables an interrupt for a given IRQ number.
*
* This function disables the individual interrupt for a specified IRQ number.
*
* \param[in] irqNumber : IRQ number
*/
extern void IrqDrv_DisableIrq(uint16_t irqNumber);
/*! \brief Set Interrupt Priority
*
* The function sets the priority of an interrupt.
*
* \param[in] irqNumber : Interrupt number
* \param[in] preemptPriority : Preemptive priority value (starting from 0).
* \param[in] subPriority : Subpriority value (starting from 0).
*/
extern void IrqDrv_SetPriority(uint16_t irqNumber, uint32_t preemptPriority, uint32_t subPriority);
/*! \brief Get Interrupt Priority
*
* The function gets the priority of an interrupt.
*
* \param[in] irqNumber : Interrupt number.
* \param[out] pPreemptPriority : Preemptive priority value (starting from 0).
* \param[out] pSubPriority : Subpriority value (starting from 0).
*/
extern void IrqDrv_GetPriority(uint16_t irqNumber, uint32_t *pPreemptPriority, uint32_t *pSubPriority);
/*! \brief Clear Pending Interrupt
*
* The function clears the pending bit of a peripheral interrupt
* or a directed interrupt to this CPU (if available).
*
* \param[in] irqNumber : IRQ number
*/
extern void IrqDrv_ClearPending(uint16_t irqNumber);
/*! \brief Set Pending Interrupt
*
* The function configures the pending bit of a peripheral interrupt.
*
* \param[in] irqNumber : IRQ number
*/
extern void IrqDrv_SetPending(uint16_t irqNumber);
/*! \brief Whether the Interrupt is Pending
*
* The function gets the pending bit of a peripheral interrupt
* or a directed interrupt to this CPU (if available).
*
* \param[in] irqNumber : IRQ number
* \return pending status
* - false : Interrupt status is not pending.
* - true : Interrupt status is pending.
*/
extern bool IrqDrv_IsPending(uint16_t irqNumber);
#ifdef __cplusplus
}
#endif /* extern "C" */
/*! @}*/
#endif /* _IRQ_DRV_H_ */

View File

@ -0,0 +1,197 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "startup.h"
#include <stdint.h>
#include "../cva/CVM012x.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void init_data_bss(void)
{
uint32_t n;
/* For ARMC we are using the library method of initializing DATA, Custom Section and
* Code RAM sections so the below variables are not needed */
#if !defined(__ARMCC_VERSION)
/* Declare pointers for various data sections. These pointers
* are initialized using values pulled in from the linker file */
uint8_t* data_ram;
uint8_t* code_ram;
uint8_t* bss_start;
uint8_t* custom_ram;
const uint8_t *data_rom, *data_rom_end;
const uint8_t *code_rom, *code_rom_end;
const uint8_t* bss_end;
const uint8_t *custom_rom, *custom_rom_end;
#endif
/* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */
#if defined(__ARMCC_VERSION)
extern uint32_t __RAM_VECTOR_TABLE_SIZE;
extern uint32_t __VECTOR_ROM;
extern uint32_t __VECTOR_RAM;
#else
extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
extern uint32_t __VECTOR_TABLE[];
extern uint32_t __VECTOR_RAM[];
#endif
/* Get section information from linker files */
#if defined(__ICCARM__)
/* Data */
data_ram = __section_begin(".data");
data_rom = __section_begin(".data_init");
data_rom_end = __section_end(".data_init");
/* CODE RAM */
#pragma section = "__CODE_ROM"
#pragma section = "__CODE_RAM"
code_ram = __section_begin("__CODE_RAM");
code_rom = __section_begin("__CODE_ROM");
code_rom_end = __section_end("__CODE_ROM");
/* BSS */
bss_start = __section_begin(".bss");
bss_end = __section_end(".bss");
custom_ram = __section_begin(".customSection");
custom_rom = __section_begin(".customSection_init");
custom_rom_end = __section_end(".customSection_init");
#elif defined(__ARMCC_VERSION)
/* VECTOR TABLE*/
uint8_t *vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE;
uint32_t *vector_rom = (uint32_t *)__VECTOR_ROM;
uint32_t *vector_ram = (uint32_t *)__VECTOR_RAM;
#else
extern uint32_t __DATA_ROM[];
extern uint32_t __DATA_RAM[];
extern uint32_t __DATA_END[];
extern uint32_t __CODE_RAM[];
extern uint32_t __CODE_ROM[];
extern uint32_t __CODE_END[];
extern uint32_t __BSS_START[];
extern uint32_t __BSS_END[];
extern uint32_t __CUSTOM_ROM[];
extern uint32_t __CUSTOM_END[];
/* Data */
data_ram = (uint8_t *)__DATA_RAM;
data_rom = (uint8_t *)__DATA_ROM;
data_rom_end = (uint8_t *)__DATA_END;
/* CODE RAM */
code_ram = (uint8_t *)__CODE_RAM;
code_rom = (uint8_t *)__CODE_ROM;
code_rom_end = (uint8_t *)__CODE_END;
/* BSS */
bss_start = (uint8_t *)__BSS_START;
bss_end = (uint8_t *)__BSS_END;
/* Custom section */
custom_ram = CUSTOMSECTION_SECTION_START;
custom_rom = (uint8_t *)__CUSTOM_ROM;
custom_rom_end = (uint8_t *)__CUSTOM_END;
#endif
#if !defined(__ARMCC_VERSION)
/* Copy initialized data from ROM to RAM */
while(data_rom_end != data_rom)
{
*data_ram = *data_rom;
data_ram++;
data_rom++;
}
/* Copy functions from ROM to RAM */
while(code_rom_end != code_rom)
{
*code_ram = *code_rom;
code_ram++;
code_rom++;
}
/* Clear the zero-initialized data section */
while(bss_end != bss_start)
{
*bss_start = 0;
bss_start++;
}
/* Copy customsection rom to ram */
while(custom_rom_end != custom_rom)
{
*custom_ram = *custom_rom;
custom_rom++;
custom_ram++;
}
#endif
#if defined(__ARMCC_VERSION)
/* Copy the vector table from ROM to RAM */
/* Workaround */
if(vector_ram != vector_rom)
{
for(n = 0; n < (((uint32_t)(vector_table_size)) / sizeof(uint32_t)); n++)
{
vector_ram[n] = vector_rom[n];
}
/* Point the VTOR to the position of vector table */
SCB->VTOR = (uint32_t)__VECTOR_RAM;
}
else
{
/* Point the VTOR to the position of vector table */
SCB->VTOR = (uint32_t)__VECTOR_ROM;
}
#else
/* Check if VECTOR_TABLE copy is needed */
if(__VECTOR_RAM != __VECTOR_TABLE) /* polyspace DEFECT:DEAD_CODE [No action planned:Low] "Depend on link script" */
{
/* Copy the vector table from ROM to RAM */
for(n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t)); n++)
{
__VECTOR_RAM[n] = __VECTOR_TABLE[n];
}
/* Point the VTOR to the position of vector table */
SCB->VTOR = (uint32_t)__VECTOR_RAM;
}
else
{
/* Point the VTOR to the position of vector table */
SCB->VTOR = (uint32_t)__VECTOR_TABLE;
}
#endif
}

View File

@ -0,0 +1,137 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _STARTUP_H_
#define _STARTUP_H_
#include <stdint.h>
/*! \brief Contains public interface to various functions related
* to the startup of this chip
*/
/*******************************************************************************
* the includes
******************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*! \brief define symbols that specific start and end addres of some basic sections.
*/
#if(defined(__ICCARM__))
#define INTERRUPTS_SECTION_START __section_begin(".intvec")
#define INTERRUPTS_SECTION_END __section_end(".intvec")
#define BSS_SECTION_START __section_begin(".bss")
#define BSS_SECTION_END __section_end(".bss")
#define DATA_SECTION_START __section_begin(".data")
#define DATA_SECTION_END __section_end(".data")
#define CUSTOMSECTION_SECTION_START __section_begin(".customSection")
#define CUSTOMSECTION_SECTION_END __section_end(".customSection")
#define CODE_RAM_SECTION_START __section_begin("__CODE_RAM")
#define CODE_RAM_SECTION_END __section_end("__CODE_RAM")
#define DATA_INIT_SECTION_START __section_begin(".data_init")
#define DATA_INIT_SECTION_END __section_end(".data_init")
#define CODE_ROM_SECTION_START __section_begin("__CODE_ROM")
#define CODE_ROM_SECTION_END __section_end("__CODE_ROM")
#elif(defined(__ARMCC_VERSION))
#define INTERRUPTS_SECTION_START (uint8_t *)__VECTOR_ROM_START
#define INTERRUPTS_SECTION_END (uint8_t *)__VECTOR_ROM_END
#define BSS_SECTION_START (uint8_t *)__BSS_START
#define BSS_SECTION_END (uint8_t *)__BSS_END
#define DATA_SECTION_START (uint8_t *)__DATA_RAM_START
#define DATA_SECTION_END (uint8_t *)__DATA_RAM_END
#define CUSTOMSECTION_SECTION_START (uint8_t *)__CUSTOM_SECTION_START
#define CUSTOMSECTION_SECTION_END (uint8_t *)__CUSTOM_SECTION_END
#define CODE_RAM_SECTION_START (uint8_t *)__CODE_RAM_START
#define CODE_RAM_SECTION_END (uint8_t *)__CODE_RAM_END
extern uint32_t __VECTOR_ROM_START;
extern uint32_t __VECTOR_ROM_END;
extern uint32_t __BSS_START;
extern uint32_t __BSS_END;
extern uint32_t __DATA_RAM_START;
extern uint32_t __DATA_RAM_END;
extern uint32_t __CUSTOM_SECTION_START;
extern uint32_t __CUSTOM_SECTION_END;
extern uint32_t __CODE_RAM_START;
extern uint32_t __CODE_RAM_END;
#else
#define INTERRUPTS_SECTION_START (uint8_t *)&__interrupts_start__
#define INTERRUPTS_SECTION_END (uint8_t *)&__interrupts_end__
#define BSS_SECTION_START (uint8_t *)&__bss_start__
#define BSS_SECTION_END (uint8_t *)&__bss_end__
#define DATA_SECTION_START (uint8_t *)&__data_start__
#define DATA_SECTION_END (uint8_t *)&__data_end__
#define CUSTOMSECTION_SECTION_START (uint8_t *)&__customSection_start__
#define CUSTOMSECTION_SECTION_END (uint8_t *)&__customSection_end__
#define CODE_RAM_SECTION_START (uint8_t *)&__code_ram_start__
#define CODE_RAM_SECTION_END (uint8_t *)&__code_ram_end__
extern uint32_t __interrupts_start__;
extern uint32_t __interrupts_end__;
extern uint32_t __bss_start__;
extern uint32_t __bss_end__;
extern uint32_t __data_start__;
extern uint32_t __data_end__;
extern uint32_t __customSection_start__;
extern uint32_t __customSection_end__;
extern uint32_t __code_ram_start__;
extern uint32_t __code_ram_end__;
#endif
#if(defined(__ICCARM__))
#pragma section = ".data"
#pragma section = ".data_init"
#pragma section = ".bss"
#pragma section = ".intvec"
#pragma section = ".customSection"
#pragma section = ".customSection_init"
#pragma section = "__CODE_RAM"
#pragma section = "__CODE_ROM"
#endif
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Make necessary initializations for RAM.
*
* - Copy initialized data from ROM to RAM.
* - Clear the zero-initialized data section.
* - Copy the vector table from ROM to RAM. This could be an option.
*/
void init_data_bss(void);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _STARTUP_H_ */

View File

@ -0,0 +1,256 @@
/*
* Copyright (c) 2023, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*****************************************************************************/
/* Version: GNU Compiler Collection */
/*****************************************************************************/
MODULE ?cstartup
;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:ROOT(2)
EXTERN main
EXTERN SystemInit
EXTERN init_data_bss
PUBLIC __vector_table
PUBLIC __vector_table_0x1c
PUBLIC __Vectors
PUBLIC __Vectors_End
PUBLIC __Vectors_Size
DATA
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; Non Maskable Interrupt
DCD HardFault_Handler ; Cortex-M0 SV Hard Fault Interrupt
DCD 0
DCD 0
DCD 0
__vector_table_0x1c
DCD 0
DCD 0
DCD 0
DCD 0
DCD SVC_Handler ; Cortex-M0 SV Call Interrupt
DCD 0
DCD 0
DCD PendSV_Handler ; Cortex-M0 Pend SV Interrupt
DCD SysTick_Handler ; Cortex-M0 System Tick Interrupt
DCD DMA0_Handler ; 0 (040H) DMA channel 0 transfer complete
DCD DMA1_Handler ; 1 (044H) DMA channel 1 transfer complete
DCD DMA2_Handler ; 2 (048H) DMA channel 2 transfer complete
DCD DMA3_Handler ; 3 (04CH) DMA channel 3 transfer complete
DCD DMA_Error_Handler ; 4 (050H) DMA error interrupt channels 0-3
DCD FHU_Handler ; 5 (054H) FHU Interrupt, ERM single bit error correction
DCD RTC_Alarm_Handler ; 6 (058H) RTC alarm interrupt
DCD RTC_Seconds_Handler ; 7 (05CH) RTC seconds interrupt
DCD LPTMR_Handler ; 8 (060H) LPTIMER interrupt request
DCD PORT_Handler ; 9 (064H) Port ABCDE pin detect interrupt
DCD CAN_ORed_Handler ; 10 (068H) CAN OR'ed [BusOff\BusOffDone\TransWarning\ReceiveWarning\..... ]
DCD CAN_ORed_0_31_MB_Handler ; 11 (06CH) CAN OR'ed Message buffer (0-31)
DCD CAN_ORed_32_63_MB_Handler ; 12 (070H) CAN OR'ed Message buffer (32-63)
DCD MFT0_Ch0_Ch5_Handler ; 13 (074H) MFT0 Channel 0 to 7 interrupt
DCD MFT0_Fault_Handler ; 14 (078H) MFT0 Fault interrupt
DCD MFT0_Ovf_Reload_Handler ; 15 (07CH) MFT0 Counter overflow and Reload interrupt
DCD MFT1_Ch0_Ch5_Handler ; 16 (080H) MFT1 Channel 0 to 7 interrupt
DCD MFT1_Fault_Handler ; 17 (084H) MFT1 Fault interrupt
DCD MFT1_Ovf_Reload_Handler ; 18 (088H) MFT1 Counter overflow and Reload interrupt
DCD FTFC_Handler ; 19 (08CH) FTFC Command done,read collision,err response interrupt
DCD PDB_Handler ; 20 (090H) PDB interrupt
DCD LPIT_Handler ; 21 (094H) LPIT interrupt
DCD CMU_Handler ; 22 (098H) CMU PLL,SOSC interrupt
DCD WDOG_Handler ; 23 (09CH) Interrupt request out before wdg reset out
DCD RCM_Handler ; 24 (0A0H) RCM Asynchronous Interrupt, Reset interrutpt
DCD I2C_Handler ; 25 (0A4H) I2C Interrupt
DCD SPI0_Handler ; 26 (0A8H) SPI0 Interrupt
DCD SPI1_Handler ; 27 (0ACH) SPI1 Interrupt
DCD ADC_Handler ; 28 (0B0H) ADC interrupt request.
DCD UART0_RxTx_Handler ; 29 (0B4H) UART0 Transmit / Receive Interrupt
DCD UART1_RxTx_Handler ; 30 (0B8H) UART1 Transmit / Receive Interrupt
DCD TOUCH_Handler ; 31 (0BCH) TOUCH Interrupt
__Vectors_End
__Vectors EQU __vector_table
__Vectors_Size EQU __Vectors_End - __Vectors
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
THUMB
PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
CPSID I ; Mask interrupts
;; Init the rest of the registers
LDR R1,=0
LDR R2,=0
LDR R3,=0
LDR R4,=0
LDR R5,=0
LDR R6,=0
LDR R7,=0
MOV R8,R7
MOV R9,R7
MOV R10,R7
MOV R11,R7
MOV R12,R7
#ifdef START_FROM_FLASH
IMPORT __RAM_START, __RAM_END
;; INIT ECC RAM
LDR R1, =__RAM_START
LDR R2, =__RAM_END
SUBS R2, R2, R1
SUBS R2, #1
BLE .LC5
MOVS R0, #0
MOVS R3, #4
.LC4:
STR R0, [R1]
ADD R1, R1, R3
SUBS R2, #4
BGE .LC4
.LC5:
#endif
;; Initialize the stack pointer
LDR R0, =sfe(CSTACK)
MOV R13,R0
#ifndef __NO_SYSTEM_INIT
;; Call the CMSIS system init routine
LDR R0, =SystemInit
BLX R0
#endif
;; Init .data and .bss sections
LDR R0, =init_data_bss
BLX R0
CPSIE I ; Unmask interrupts
BL main
JumpToSelf
B JumpToSelf
PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
B .
PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
HardFault_Handler
B .
PUBWEAK SVC_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SVC_Handler
B .
PUBWEAK PendSV_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
PendSV_Handler
B .
PUBWEAK SysTick_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SysTick_Handler
B .
PUBWEAK DMA0_Handler
PUBWEAK DMA1_Handler
PUBWEAK DMA2_Handler
PUBWEAK DMA3_Handler
PUBWEAK DMA_Error_Handler
PUBWEAK FHU_Handler
PUBWEAK RTC_Alarm_Handler
PUBWEAK RTC_Seconds_Handler
PUBWEAK LPTMR_Handler
PUBWEAK PORT_Handler
PUBWEAK CAN_ORed_Handler
PUBWEAK CAN_ORed_0_31_MB_Handler
PUBWEAK CAN_ORed_32_63_MB_Handler
PUBWEAK MFT0_Ch0_Ch5_Handler
PUBWEAK MFT0_Fault_Handler
PUBWEAK MFT0_Ovf_Reload_Handler
PUBWEAK MFT1_Ch0_Ch5_Handler
PUBWEAK MFT1_Fault_Handler
PUBWEAK MFT1_Ovf_Reload_Handler
PUBWEAK FTFC_Handler
PUBWEAK PDB_Handler
PUBWEAK LPIT_Handler
PUBWEAK CMU_Handler
PUBWEAK WDOG_Handler
PUBWEAK RCM_Handler
PUBWEAK I2C_Handler
PUBWEAK SPI0_Handler
PUBWEAK SPI1_Handler
PUBWEAK ADC_Handler
PUBWEAK UART0_RxTx_Handler
PUBWEAK UART1_RxTx_Handler
PUBWEAK TOUCH_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
HardFault_Handler
SVC_Handler
PendSV_Handler
SysTick_Handler
DMA0_Handler
DMA1_Handler
DMA2_Handler
DMA3_Handler
DMA_Error_Handler
FHU_Handler
RTC_Alarm_Handler
RTC_Seconds_Handler
LPTMR_Handler
PORT_Handler
CAN_ORed_Handler
CAN_ORed_0_31_MB_Handler
CAN_ORed_32_63_MB_Handler
MFT0_Ch0_Ch5_Handler
MFT0_Fault_Handler
MFT0_Ovf_Reload_Handler
MFT1_Ch0_Ch5_Handler
MFT1_Fault_Handler
MFT1_Ovf_Reload_Handler
FTFC_Handler
PDB_Handler
LPIT_Handler
CMU_Handler
WDOG_Handler
RCM_Handler
I2C_Handler
SPI0_Handler
SPI1_Handler
ADC_Handler
UART0_RxTx_Handler
UART1_RxTx_Handler
TOUCH_Handler
END

View File

@ -0,0 +1,163 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "system_M012x.h"
#include "../cpu_drv.h"
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void SystemInit(void)
{
/* PFLASH prefetch */
SimReg_SetFlashPFlsFlushEn(SIM, 1); /* Enable Flush PFLASH pre-fetch */
SimReg_SetFlashPFlsPfbEn(SIM, 1); /* Enable PFLASH pre-fetch*/
SimReg_SetFlashPFlsFlushEn(SIM, 0); /* Disable Flush PFLASH prefetch */
/* Unlock SCG and PCC */
Scg0Reg_SetKey(SCG0, 0x19962020);
Pcc0Reg_SetKey(PCC0, 0x55534552);
RcmReg_SetKey(RCM, 0x52434D4B);
Scg1Reg_SetCkSrcSysDiv(SCG1, 1); /* Divide-by-2, restore default value */
/* Switch system clock to default clock */
if(Scg2Reg_GetCsrSysSt(SCG2) == 2)
{
/* Flash AHB bus read access time configure */
FtfcReg_SetFcnfgBusReadTm(FTFC, 0); /* 1T required */
Scg2Reg_SetCsrSrcSys(SCG2, 0);
while(Scg2Reg_GetCsrSysSt(SCG2) != 0)
{
;
}
}
#ifdef _USE_EXT_OSC_
/* Use External oscillator */
Scg0Reg_SetOscCtrlRange(SCG0, 3); /* set SOSC frequency range(use max value when SOSC as the clock source of the PLL) */
Scg0Reg_SetOscCtrlEnSosc(SCG0, 1); /* enable SOSC */
while(Scg0Reg_GetStatusSoscRdy(SCG0) == 0)
{
; /* wait until SOSC is ready */
}
/* Disable PLL and PLL loss reset */
RcmReg_SetRstCtrlPllLossEn(RCM, 0);
Scg0Reg_SetPllCtrl0PllEn(SCG0, 0);
/* PLL configuration:
* - PLL input clock source : SOSC
* - PLL pre-divider : 1
* - feedback divider : 40
* - PLL OUT DIV : 2
* - PLL post-divider setting : 2
*/
Scg0Reg_SetPllCtrl1PllClkinSel(SCG0, 1);
Scg0Reg_SetPllCtrl0PllPreDiv(SCG0, 0);
Scg0Reg_SetPllCtrl0PllM(SCG0, 20);
Scg0Reg_SetPllCtrl0PllOutDiv(SCG0, 1);
Scg0Reg_SetPllCtrl0PllPosDiv(SCG0, 2);
/* Enable PLL */
Scg0Reg_SetPllCtrl0PllEn(SCG0, 1);
/* Use systick for delay: load:4000-1ms,8000-2ms based on 4M system clk */
SysTick->LOAD = 8000U;
SysTick->VAL = 0U;
SysTick->CTRL = 5U; /* SysTick uses the processor clock and enable sysTick */
while(SysTick->CTRL < 0x10000)
{
; /* wait for COUNTFLAG setting*/
}
/*recover sysTick register*/
SysTick->CTRL = 4U;
SysTick->LOAD = 0U;
SysTick->VAL = 0U;
while(Scg0Reg_GetStatusPllLock(SCG0) == 0)
{
;
}
/* Flash AHB bus read access time configure */
FtfcReg_SetFcnfgBusReadTm(FTFC, 1); /* 2T required for 80M AHB */
/* Set clk_pll as system clock */
Scg2Reg_SetCsrSrcSys(SCG2, 2);
while(Scg2Reg_GetCsrSysSt(SCG2) != 2)
{
;
}
#else
/* Disable PLL and PLL loss reset */
RcmReg_SetRstCtrlPllLossEn(RCM, 0);
Scg0Reg_SetPllCtrl0PllEn(SCG0, 0);
/* PLL configuration:
* - PLL input clock source : SIRC
* - PLL pre-divider : 1
* - feedback divider : 40
* - PLL OUT DIV : 2
* - PLL post-divider setting : 2
*/
Scg0Reg_SetPllCtrl1PllClkinSel(SCG0, 0);
Scg0Reg_SetPllCtrl0PllPreDiv(SCG0, 0);
Scg0Reg_SetPllCtrl0PllM(SCG0, 40);
Scg0Reg_SetPllCtrl0PllOutDiv(SCG0, 1);
Scg0Reg_SetPllCtrl0PllPosDiv(SCG0, 2);
/* Enable PLL */
Scg0Reg_SetPllCtrl0PllEn(SCG0, 1);
while(Scg0Reg_GetStatusPllLock(SCG0) == 0)
{
;
}
/* Flash AHB bus read access time configure */
FtfcReg_SetFcnfgBusReadTm(FTFC, 1); /* 2T required for 80M AHB */
/* Set clk_pll as system clock */
Scg2Reg_SetCsrSrcSys(SCG2, 2);
while(Scg2Reg_GetCsrSysSt(SCG2) != 2)
{
;
}
#endif
/* Set Core and APB clock source divider */
Scg1Reg_SetCkSrcSysDiv(SCG1, 0); /* Divide-by-1 */
Scg2Reg_SetCsrDivAips(SCG2, 0); /* Divide-by-1 */
/* Set FLASH clock, must be 8M */
Pcc1Reg_SetFlsCtlCntDiv(PCC1, 9); /* Divide-by-10 */
/* Finish setting up the clock */
Scg0Reg_SetKey(SCG0, 0); /* lock SCG again */
Pcc0Reg_SetKey(PCC0, 0); /* lock PCC again */
RcmReg_SetKey(RCM, 0); /* lock RCM again */
}

View File

@ -0,0 +1,79 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _SYSTEM_M012X_H_
#define _SYSTEM_M012X_H_
/*! \brief Contains public interface to various functions related
* to the System module of CVM012x series chips
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/* Value of the external crystal or oscillator clock frequency in Hz */
#define CPU_XTAL_CLK_HZ (16000000u)
#if CPU_XTAL_CLK_HZ > 40000000
#error "The external crystal or oscillator clock frequency is out of range."
#endif
/* Value of the slow internal oscillator clock frequency in Hz */
#define CPU_INT_SLOW_CLK_HZ (8000000u)
/* Default System clock value for the user code after SystemInit called */
#define DEFAULT_SYSTEM_CLOCK (80000000u)
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Setup the SoC.
*
* This function disables the watchdog, enables FPU.
* if the corresponding feature macro is enabled.
* SystemInit is called from startup_device file.
*/
extern void SystemInit(void);
#ifdef __cplusplus
}
#endif /* extern "C" */
#endif /* _SYSTEM_M012X_H_ */

View File

@ -0,0 +1,240 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include "crc_drv.h"
#include "crc_reg.h"
/*******************************************************************************
* the defines
******************************************************************************/
#define CRCDRV_FIFO_MAX (4)
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
void CrcDrv_Init(CrcDrvType *obj, struct _CrcRegType_ *reg)
{
obj->reg = reg;
}
void CrcDrv_Configure(CrcDrvType *obj, const CrcDrv_ConfigType *userConfig)
{
/* Set CRC mode */
CrcReg_SetCrProtocolWidth(obj->reg, (uint8_t)userConfig->crcWidth);
/* Set transposes options */
CrcReg_SetCrReverseOut(obj->reg, (uint8_t)userConfig->readTranspose);
/* Set CRC polynomial */
CrcReg_SetPolyReg(obj->reg, userConfig->polynomial);
/* Set writes transposes */
CrcReg_SetCrReverseIn(obj->reg, (uint8_t)userConfig->writeTranspose);
/* Sets complement or inversion checksum */
CrcReg_SetCrFXor(obj->reg, userConfig->complementChecksum);
/* Write a seed - initial checksum */
CrcReg_SetInitReg(obj->reg, userConfig->seed);
}
void CrcDrv_GetConfig(const CrcDrvType *obj, CrcDrv_ConfigType *userConfig)
{
/* Gets CRC mode */
userConfig->crcWidth = (CrcDrv_BitWidthType)CrcReg_GetCrProtocolWidth(obj->reg);
/* Gets transposes and complement options */
userConfig->readTranspose = (CrcDrv_TransposeType)CrcReg_GetCrReverseOut(obj->reg);
/* Get a polynomial */
userConfig->polynomial = CrcReg_GetPolyReg(obj->reg);
/* Gets transposes options */
userConfig->writeTranspose = (CrcDrv_TransposeType)CrcReg_GetCrReverseIn(obj->reg);
/* Gets complement or inversion checksum */
userConfig->complementChecksum = CrcReg_GetCrFXor(obj->reg);
/* Get a seed - initial checksum */
userConfig->seed = CrcReg_GetInitReg(obj->reg);
}
void CrcDrv_GetDefaultConfig(CrcDrv_ConfigType *userConfig)
{
/* Gets CRC mode default is 16 bit */
userConfig->crcWidth = CRCDRV_BITWIDTH_16;
/* Gets default a polynomial default is reset value */
userConfig->polynomial = 0x1021U;
/* Gets default read transposes none */
userConfig->readTranspose = CRCDRV_TRANSPOSE_NONE;
/* Gets default write transpose none */
userConfig->writeTranspose = CRCDRV_TRANSPOSE_NONE;
/* Gets default no complement or inversion checksum */
userConfig->complementChecksum = false;
/* Gets default a seed - initial checksum */
userConfig->seed = 0xFFFFFFFFU;
}
void CrcDrv_SetNewSeed(CrcDrvType *obj, uint32_t seed)
{
/* Write a seed - initial checksum */
CrcReg_SetInitReg(obj->reg, seed);
}
void CrcDrv_CrcReset(CrcDrvType *obj)
{
/* execute CRC rsset */
CrcReg_SetCrReset(obj->reg);
/* wait until CRC rsset execute completely */
while(CrcReg_GetCrReset(obj->reg) != 0)
{
}
}
uint32_t CrcDrv_GetCrcResult(CrcDrvType *obj)
{
CrcDrv_BitWidthType width = (CrcDrv_BitWidthType)(CrcReg_GetCrProtocolWidth(obj->reg));
CrcDrv_TransposeType transpose;
uint32_t result;
if(width == CRCDRV_BITWIDTH_16)
{
transpose = (CrcDrv_TransposeType)(CrcReg_GetCrReverseOut(obj->reg));
if((transpose == CRCDRV_TRANSPOSE_BITS_AND_BYTES) || (transpose == CRCDRV_TRANSPOSE_BYTES))
{
/* Wait until no remaining data in FIFO */
while(CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
/* Returns upper 16 bits of CRC because of transposition in 16-bit mode */
result = (uint32_t)((CrcReg_GetDataReg(obj->reg) >> 16) & 0xFFFF);
}
else
{
/* Wait until no remaining data in FIFO */
while(CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
/* Get the lower 16 bits */
result = (uint32_t)(CrcReg_GetDataReg(obj->reg) & 0xFFFF);
}
}
else
{
/* Wait until no remaining data in FIFO */
while(CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
result = CrcReg_GetDataReg(obj->reg);
}
return result;
}
void CrcDrv_WriteData8(CrcDrvType *obj, const uint8_t *data, uint32_t dataSize)
{
uint32_t group = 0;
uint32_t groupNum = dataSize / CRCDRV_FIFO_MAX;
uint32_t left = dataSize - groupNum * CRCDRV_FIFO_MAX;
uint32_t i = 0;
/* 8-bit writes till end of data buffer */
for(group = 0; group < groupNum; ++group)
{
/* Wait until no remaining data in FIFO */
while(CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
/* Write as many as possible until FIFO is full */
for(i = 0; i < CRCDRV_FIFO_MAX; ++i)
{
CrcReg_SetData8Reg(obj->reg, data[group * CRCDRV_FIFO_MAX + i]);
}
}
/* If still data buffering, wait until no remaining data in FIFO */
while(left != 0 && CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
for(i = 0; i < left; ++i)
{
CrcReg_SetData8Reg(obj->reg, data[dataSize - left + i]);
}
}
void CrcDrv_WriteData16(CrcDrvType *obj, const uint16_t *data, uint32_t dataSize)
{
uint32_t group = 0;
uint32_t groupNum = dataSize / CRCDRV_FIFO_MAX;
uint32_t left = dataSize - groupNum * CRCDRV_FIFO_MAX;
uint32_t i = 0;
/* 8-bit writes till end of data buffer */
for(group = 0; group < groupNum; ++group)
{
/* Wait until no remaining data in FIFO */
while(CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
/* Write as many as possible until FIFO is full */
for(i = 0; i < CRCDRV_FIFO_MAX; ++i)
{
CrcReg_SetData16Reg(obj->reg, data[group * CRCDRV_FIFO_MAX + i]);
}
}
/* If still data buffering, wait until no remaining data in FIFO */
while(left != 0 && CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
for(i = 0; i < left; ++i)
{
CrcReg_SetData16Reg(obj->reg, data[dataSize - left + i]);
}
}
void CrcDrv_WriteData32(CrcDrvType *obj, const uint32_t *data, uint32_t dataSize)
{
uint32_t group = 0;
uint32_t groupNum = dataSize / CRCDRV_FIFO_MAX;
uint32_t left = dataSize - groupNum * CRCDRV_FIFO_MAX;
uint32_t i = 0;
/* 8-bit writes till end of data buffer */
for(group = 0; group < groupNum; ++group)
{
/* Wait until no remaining data in FIFO */
while(CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
/* Write as many as possible until FIFO is full */
for(i = 0; i < CRCDRV_FIFO_MAX; ++i)
{
CrcReg_SetDataReg(obj->reg, data[group * CRCDRV_FIFO_MAX + i]);
}
}
/* If still data buffering, wait until no remaining data in FIFO */
while(left != 0 && CrcReg_GetDataNumInFifo(obj->reg) != 0)
{
}
for(i = 0; i < left; ++i)
{
CrcReg_SetDataReg(obj->reg, data[dataSize - left + i]);
}
}

View File

@ -0,0 +1,197 @@
/*
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
* All rights reserved.
*
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
* exclusively with CVA's microcontroller products. This file can be freely
* distributed within development tools that are supporting such microcontroller
* products.
*
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*/
#ifndef _CRC_DRV_H_
#define _CRC_DRV_H_
/*! \brief Contains public interface to various functions related
* to the driver of CRC module
*/
/*******************************************************************************
* the includes
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
/*! \addtogroup crc_drv
* @{
*/
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* the defines
******************************************************************************/
/*******************************************************************************
* the typedefs
******************************************************************************/
/*! \brief CRC type of transpose of read write data
*/
typedef enum
{
CRCDRV_TRANSPOSE_NONE = 0, /*!< No transpose */
CRCDRV_TRANSPOSE_BITS = 1, /*!< Transpose bits in bytes */
CRCDRV_TRANSPOSE_BITS_AND_BYTES = 2, /*!< Transpose bytes and bits in bytes */
CRCDRV_TRANSPOSE_BYTES = 3, /*!< Transpose bytes */
} CrcDrv_TransposeType;
/*! \brief CRC bit width
*/
typedef enum
{
CRCDRV_BITWIDTH_16 = 0, /*!< No transpose */
CRCDRV_BITWIDTH_32 = 1, /*!< Transpose bits in bytes */
} CrcDrv_BitWidthType;
/*! \brief Definition of configuration of CRC driver
*/
typedef struct _CrcDrv_ConfigType_
{
CrcDrv_BitWidthType crcWidth; /*!< Selects 16-bit or 32-bit CRC protocol. */
uint32_t polynomial; /*!< CRC Polynomial, MSBit first. */
CrcDrv_TransposeType readTranspose; /*!< Type of transpose when reading CRC result. */
CrcDrv_TransposeType writeTranspose; /*!< Type of transpose when writing CRC input data. */
bool complementChecksum; /*!< True if the result shall be complement of the actual checksum. */
uint32_t seed; /*!< Starting checksum value. */
} CrcDrv_ConfigType;
/* Forward declaration of CRC register */
struct _CrcRegType_;
/*! \brief The definition of CRC driver class
*/
typedef struct _CrcDrvType_
{
struct _CrcRegType_ *reg;
} CrcDrvType;
/*******************************************************************************
* the globals
******************************************************************************/
/*******************************************************************************
* the function prototypes
******************************************************************************/
/*! \brief Initializes the CRC driver module
*
* This function initializes CRC driver by setting the register
* instance to it.
*
* \param[in] obj : pointer to CRC driver instance
* \param[in] reg : pointer to CRC register instance
*/
extern void CrcDrv_Init(CrcDrvType *obj, struct _CrcRegType_ *reg);
/*! \brief Configures the CRC module from a user configuration structure
*
* This function configures the CRC module from a user configuration structure
*
* \param[in] obj : pointer to CRC driver instance
* \param[in] userConfig : pointer to configuration structure
*/
extern void CrcDrv_Configure(CrcDrvType *obj, const CrcDrv_ConfigType *userConfig);
/*! \brief Get configures of the CRC module currently
*
* This function gets configures of the CRC module currently
*
* \param[in] obj : pointer to CRC driver instance
* \param[out] userConfig : pointer to configuration structure
*/
extern void CrcDrv_GetConfig(const CrcDrvType *obj, CrcDrv_ConfigType *userConfig);
/*! \brief Get default configures the CRC module for configuration structure
*
* This function gets default configures the CRC module for user configuration structure
*
* \note This function is a "static" function regardless of instances
*
* \param[out] userConfig : pointer to configuration structure
*/
extern void CrcDrv_GetDefaultConfig(CrcDrv_ConfigType *userConfig);
/*! \brief Sets a new seed to register CRC_INIT
*
* This function sets a new seed to register CRC_INIT
* This operation will cause the value of register CRC_DR to be updated to the value of register CRC_INIT
*
* \param[in] obj : pointer to CRC driver instance
* \param[in] seed : new seed will writed to CRC_INIT
*/
extern void CrcDrv_SetNewSeed(CrcDrvType *obj, uint32_t seed);
/*! \brief Executes CRC reset operation
*
* This function executes CRC reset operation
* This opration will cause the value of register CRC_DR to be updated to the value of register CRC_INIT
*
* \param[in] obj : pointer to CRC driver instance
*/
extern void CrcDrv_CrcReset(CrcDrvType *obj);
/*! \brief Get the current result of the CRC calculation.
*
* This function returns the current result of the CRC calculation.
*
* \param[in] obj : pointer to CRC register instance
* \return the current CRC calculation result
*/
extern uint32_t CrcDrv_GetCrcResult(CrcDrvType *obj);
/*! \brief Appends a block of 8 bits data to the current CRC calculation
*
* This function appends a block of 8 bits data to the current CRC calculation
*
* \param[in] obj : pointer to CRC driver instance
* \param[in] data : pointer to input data for CRC calculation
* \param[in] dataSize : length of 8 bits data to be calculated
*/
extern void CrcDrv_WriteData8(CrcDrvType *obj, const uint8_t *data, uint32_t dataSize);
/*! \brief Appends a block of 16 bits data to the current CRC calculation
*
* This function appends a block of 16 bits data to the current CRC calculation
*
* \param[in] obj : pointer to CRC driver instance
* \param[in] data : pointer to input data for CRC calculation
* \param[in] dataSize : length of 16 bits data to be calculated
*/
extern void CrcDrv_WriteData16(CrcDrvType *obj, const uint16_t *data, uint32_t dataSize);
/*! \brief Appends a block of 32 bits data to the current CRC calculation
*
* This function appends a block of 32 bits data to the current CRC calculation
*
* \param[in] obj : pointer to CRC driver instance
* \param[in] data : pointer to input data for CRC calculation
* \param[in] dataSize : length of 32 bits data to be calculated
*/
extern void CrcDrv_WriteData32(CrcDrvType *obj, const uint32_t *data, uint32_t dataSize);
#ifdef __cplusplus
}
#endif /* extern "C" */
/*! @}*/
#endif /* _CRC_DRV_H_ */

Some files were not shown because too many files have changed in this diff Show More