Files
chrg/apps/chrg/applications/bsp/chrg_tmr.c
T
2025-08-27 23:16:25 +08:00

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