178 lines
3.1 KiB
C
178 lines
3.1 KiB
C
|
|
#include <string.h>
|
|
|
|
#include "chrg_tmr.h"
|
|
|
|
#define LOG_TAG "chrg.tmr"
|
|
#define DBG_ENABLE
|
|
#define DBG_SECTION_NAME LOG_TAG
|
|
#define DBG_LEVEL DBG_LOG
|
|
#define DBG_COLOR
|
|
#include <rtdbg.h>
|
|
|
|
struct chrg_tmr_t chrgtmr[TOTAL_TMRS] = {
|
|
[IDX_TMR_1S] = {
|
|
.index = IDX_TMR_1S,
|
|
.dev = RT_NULL,
|
|
.name = DEV_NAME_HWTIMER_1S,
|
|
.mode = HWTIMER_MODE_PERIOD,
|
|
.timeout = 1000000, // 10ms
|
|
}
|
|
};
|
|
|
|
static rt_err_t chrg_tmr_1s_callback(rt_device_t dev, rt_size_t size)
|
|
{
|
|
rt_kprintf(".");
|
|
|
|
return RT_EOK;
|
|
}
|
|
|
|
int chrg_tmr_init (eIDX_TMR index)
|
|
{
|
|
rt_err_t ret = RT_EOK;
|
|
rt_uint32_t freq = 1000000;
|
|
if (index >= TOTAL_TMRS) {
|
|
return -1;
|
|
}
|
|
|
|
struct chrg_tmr_t *pTMR = &chrgtmr[index];
|
|
|
|
pTMR->dev = rt_device_find(pTMR->name);
|
|
if (RT_NULL == pTMR->dev) {
|
|
LOG_E("dev '%s' not found.", pTMR->name);
|
|
return -1;
|
|
}
|
|
|
|
ret = rt_device_open(pTMR->dev, RT_DEVICE_OFLAG_RDWR);
|
|
if (RT_EOK != ret) {
|
|
LOG_E("open dev '%s' failed. %d", pTMR->name, ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = rt_device_control(pTMR->dev, HWTIMER_CTRL_FREQ_SET, &freq);
|
|
if (RT_EOK != ret) {
|
|
LOG_E("set '%s' freq failed. %d", pTMR->name, ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = rt_device_control(pTMR->dev, HWTIMER_CTRL_MODE_SET, &pTMR->mode);
|
|
if (RT_EOK != ret) {
|
|
LOG_E("set '%s' mode failed. %d", pTMR->name, ret);
|
|
return ret;
|
|
}
|
|
|
|
switch (pTMR->index) {
|
|
case IDX_TMR_1S:
|
|
ret = rt_device_set_rx_indicate(pTMR->dev, chrg_tmr_1s_callback);
|
|
break;
|
|
|
|
default:
|
|
return -1;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
rt_err_t chrg_tmr_start (eIDX_TMR index, uint32_t timeo)
|
|
{
|
|
rt_err_t ret = RT_EOK;
|
|
|
|
if (index >= TOTAL_TMRS) {
|
|
return RT_EINVAL;
|
|
}
|
|
|
|
struct chrg_tmr_t *pTMR = &chrgtmr[index];
|
|
if (RT_NULL == pTMR->dev) {
|
|
LOG_E("dev '%s' not opened.", pTMR->name);
|
|
return 0;
|
|
}
|
|
|
|
pTMR->timeout.sec = timeo/1000000;
|
|
pTMR->timeout.usec = timeo%1000000;
|
|
|
|
if (rt_device_write(pTMR->dev, 0, &pTMR->timeout, sizeof(rt_hwtimerval_t)) != sizeof(rt_hwtimerval_t)) {
|
|
rt_kprintf("set '%s' timeout failed.\r\n", pTMR->name);
|
|
return ret;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
rt_err_t chrg_tmr_stop (eIDX_TMR index)
|
|
{
|
|
rt_err_t ret = RT_EOK;
|
|
|
|
if (index >= TOTAL_TMRS) {
|
|
return RT_EINVAL;
|
|
}
|
|
|
|
struct chrg_tmr_t *pTMR = &chrgtmr[index];
|
|
if (RT_NULL == pTMR->dev) {
|
|
LOG_E("dev '%s' not opened.", pTMR->name);
|
|
return 0;
|
|
}
|
|
|
|
ret = rt_device_control(pTMR->dev, HWTIMER_CTRL_STOP, RT_NULL);
|
|
if (RT_EOK != ret) {
|
|
LOG_E("set '%s' stop failed. %d", pTMR->name, ret);
|
|
return ret;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void chrg_tmr_release (eIDX_TMR index)
|
|
{
|
|
if (index >= TOTAL_TMRS) {
|
|
return ;
|
|
}
|
|
|
|
struct chrg_tmr_t *pTMR = &chrgtmr[index];
|
|
if (RT_NULL != pTMR->dev) {
|
|
rt_device_close(pTMR->dev);
|
|
pTMR->dev = RT_NULL;
|
|
}
|
|
}
|
|
|
|
int chrg_tmrs_init (void)
|
|
{
|
|
int i = 0;
|
|
|
|
for (i = 0; i < TOTAL_TMRS; i++) {
|
|
chrg_tmr_init((eIDX_TMR)i);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
INIT_ENV_EXPORT(chrg_tmrs_init);
|
|
|
|
#if 1
|
|
|
|
static int sec_tmr(int argc, char **argv)
|
|
{
|
|
if (argc != 2) {
|
|
rt_kprintf("sec_tmr <start|stop>\r\n");
|
|
return RT_ERROR;
|
|
}
|
|
|
|
if (strcmp(argv[1], "start") == 0) {
|
|
chrg_tmr_start(IDX_TMR_1S, 1000000);
|
|
} else if (strcmp(argv[1], "stop") == 0) {
|
|
chrg_tmr_stop(IDX_TMR_1S);
|
|
} else {
|
|
rt_kprintf("sec_tmr start|stop\r\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
MSH_CMD_EXPORT(sec_tmr, second timer);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|