📄 drv_ftm_art.c
字号:
/************************************************************************/
/* */
/* Copyright (C) 2006 Oki Electric Industry Co., LTD. */
/* */
/* System Name : ML675050 series */
/* Module Name : ML675050 iccc driver program */
/* File Name : drv_ftm_art.c */
/* Date : 2006/01/06 initial version */
/* */
/************************************************************************/
#include "common.h"
#if defined(__arm)
#include "ml675050.h"
#else
#include "ml675050sim.h"
#endif
#include "hal_api.h"
#include "drv_common.h"
#include "drv_ftm_art.h"
#include "intrinsics.h"
#define FTM_PORT1_SEL_MASK 0xff30ffff
#define FTM_PORT1_SEL_SET 0x00450000
#define FTM_PORT4_SEL_MASK 0x3fff3fff
#define FTM_PORT4_SEL_SET 0x40004000
/******************************/
/* Private defines */
/******************************/
/*--------- variable ---------*/
volatile int16_t counter[6];
/*--------- function ---------*/
static void art0_callback(uint16_t state);
static void art1_callback(uint16_t state);
static void art3_callback(uint16_t state);
static void art4_callback(uint16_t state);
static void art5_callback(uint16_t state);
/************************************************************************/
/* */
/* Function Name : smpDrv_OpenFtm_Art */
/* Input : Art */
/* Output : DRV_OK(1) */
/* : DRV_PARAM_ERROR(-2) */
/* */
/* Note : Open the driver of ftm_art. */
/* */
/************************************************************************/
int16_t smpDrv_OpenFtm_Art(Art *art)
{
int16_t rtnVal = DRV_OK;
uPLAT_PioFunctionParam port_param;
int16_t i;
uPLAT_InterruptParam int_param;
/* Get port function. */
rtnVal = uplat7dHAL_PioGetFunction(&port_param);
if (rtnVal != DRV_OK) {
return rtnVal;
}
/* Set FTM port Secondary function. */
port_param.port_sel1 = (port_param.port_sel1 & FTM_PORT1_SEL_MASK)
| FTM_PORT1_SEL_SET;
port_param.port_sel4 = (port_param.port_sel4 & FTM_PORT4_SEL_MASK)
| FTM_PORT4_SEL_SET;
rtnVal = uplat7dHAL_PioSetFunction(&port_param);
if (rtnVal != DRV_OK) {
return rtnVal;
}
for(i=0; i<6; i++){
counter[i] = 0;
}
/* FTM0 Interrupt setting. */
int_param.primary = INT_FTM0_ART;
int_param.level = EXILCA_ILC16 & INT_LV3;
int_param.callback = art0_callback;
rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
if (rtnVal != DRV_OK) {
return rtnVal;
}
/* FTM1 Interrupt setting. */
int_param.primary = INT_FTM1_ART;
int_param.level = EXILCA_ILC16 & INT_LV3;
int_param.callback = art1_callback;
rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
if (rtnVal != DRV_OK) {
return rtnVal;
}
/* FTM3 Interrupt setting. */
int_param.primary = INT_FTM3;
int_param.level = EXILCA_ILC18 & INT_LV2;
int_param.callback = art3_callback;
rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
if (rtnVal != DRV_OK) {
return rtnVal;
}
/* FTM4 Interrupt setting. */
int_param.primary = INT_FTM4;
int_param.level = EXILCA_ILC20 & INT_LV1;
int_param.callback = art4_callback;
rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
if (rtnVal != DRV_OK) {
return rtnVal;
}
/* FTM5 Interrupt setting. */
int_param.primary = INT_FTM5;
int_param.level = EXILCA_ILC20 & INT_LV1;
int_param.callback = art5_callback;
rtnVal = uplat7dHAL_InterruptSetPrimary(&int_param);
if (rtnVal != DRV_OK) {
return rtnVal;
}
/* Initailize ART HAL. */
if (art->cycle0 != ART0CYC){
rtnVal = DRV_PARAM_ERROR;
}
if (art->cycle1 != ART1CYC){
rtnVal = DRV_PARAM_ERROR;
}
if (art->cycle3 != ART3CYC){
rtnVal = DRV_PARAM_ERROR;
}
if (art->cycle4 != ART4CYC){
rtnVal = DRV_PARAM_ERROR;
}
if (art->cycle5 != ART5CYC){
rtnVal = DRV_PARAM_ERROR;
}
if (rtnVal == DRV_OK) {
art->cycle0 = 65536 - (ART0CYC * FTM_APB_CLK * 1000) / 16 ;
art->cycle1 = 65536 - (ART1CYC * FTM_APB_CLK * 1000) / 16 ;
art->cycle3 = 65536 - (ART3CYC * FTM_APB_CLK * 1000) / 16 ;
art->cycle4 = 65536 - (ART4CYC * FTM_APB_CLK * 1000) / 16 ;
art->cycle5 = 65536 - (ART5CYC * FTM_APB_CLK * 1000) / 16 ;
rtnVal = ml675050HAL_FtmArtInit(art);
}
/* Enable irq interrupt. */
__enable_interrupt(); //irq_en();
return rtnVal;
}
/************************************************************************/
/* */
/* Function Name : smpDrv_CloseFtm_Art */
/* Input : void */
/* Output : DRV_OK(1) */
/* */
/* Note : Close the driver of ftm_art. */
/* */
/************************************************************************/
int16_t smpDrv_CloseFtm_Art(void)
{
int16_t rtnVal = DRV_OK;
__disable_interrupt(); //irq_dis(); /* Disable Interrupt */
return rtnVal;
}
/************************************************************************/
/* */
/* Function Name : smpDrv_IoctlFtm_Art */
/* Input : cmd The number of ART HAL-API. */
/* arg The argument of ART HAL-API. */
/* Output : DRV_OK(1) */
/* : DRV_PARAM_ERROR(-2) */
/* */
/* Note : Control the driver of ftm_art. */
/* */
/************************************************************************/
int16_t smpDrv_IoctlFtm_Art(uint16_t cmd, uint32_t arg) {
int16_t rtnVal = DRV_OK;
uint16_t *start;
switch (cmd) {
case ML675050_HAL_FTM_ART_START:
start = (uint16_t *)arg;
if ((start[0] != 1) && (start[0] != 0)) {
rtnVal = DRV_PARAM_ERROR;
}
if ((start[1] != 1) && (start[1] != 0)) {
rtnVal = DRV_PARAM_ERROR;
}
if ((start[2] != 1) && (start[2] != 0)) {
rtnVal = DRV_PARAM_ERROR;
}
if ((start[3] != 1) && (start[3] != 0)) {
rtnVal = DRV_PARAM_ERROR;
}
if ((start[4] != 1) && (start[4] != 0)) {
rtnVal = DRV_PARAM_ERROR;
}
if ((start[5] != 1) && (start[5] != 0)) {
rtnVal = DRV_PARAM_ERROR;
}
if (rtnVal == DRV_OK) {
rtnVal = ml675050HAL_FtmArtStart(start);
}
break;
default :
rtnVal = DRV_PARAM_ERROR;
break;
}
return rtnVal;
}
/************************************************************************/
/* */
/* Function Name : art_callback */
/* Input : state */
/* Output : void */
/* */
/* Note : ART call back function. */
/* */
/************************************************************************/
/* FTM0 call back function. */
static void art0_callback(uint16_t state) {
counter[0]++;
}
/* FTM1 call back function. */
static void art1_callback(uint16_t state) {
counter[1]++;
}
/* FTM3 call back function. */
static void art3_callback(uint16_t state) {
counter[3]++;
}
/* FTM4 call back function. */
static void art4_callback(uint16_t state) {
counter[4]++;
}
/* FTM5 call back function. */
static void art5_callback(uint16_t state) {
counter[5]++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -