diff options
| author | 勤为本 <[email protected]> | 2017-07-18 11:33:27 +0800 |
|---|---|---|
| committer | 勤为本 <[email protected]> | 2017-07-18 11:33:27 +0800 |
| commit | 878b222741dd2b628240d1b19401c04ae507860f (patch) | |
| tree | 6bae0edd135bb040778375d146147358eb8aae2f /bsp/ls1cdev | |
| parent | d22df879ace32d18a6fed07427a14f2f3b92b009 (diff) | |
将“龙芯1c库”中硬件定时器相关接口移植到RT-Thread
Diffstat (limited to 'bsp/ls1cdev')
| -rw-r--r-- | bsp/ls1cdev/libraries/ls1c_timer.c | 200 | ||||
| -rw-r--r-- | bsp/ls1cdev/libraries/ls1c_timer.h | 69 |
2 files changed, 269 insertions, 0 deletions
diff --git a/bsp/ls1cdev/libraries/ls1c_timer.c b/bsp/ls1cdev/libraries/ls1c_timer.c new file mode 100644 index 0000000000..8c3b164121 --- /dev/null +++ b/bsp/ls1cdev/libraries/ls1c_timer.c @@ -0,0 +1,200 @@ +// Ӳ����ʱ��Դ�� + + +#include "ls1c_public.h" +#include "ls1c_pin.h" +#include "ls1c_clock.h" +#include "ls1c_regs.h" +#include "ls1c_pwm.h" +#include "ls1c_timer.h" + + +// ��ʱ���м�����(CNTR��HRC��LRC)�����ֵ +#define TIMER_COUNTER_MAX (0xffffff) + + + +/* + * ��ȡָ����ʱ���ļĴ�������ַ + * @timer Ӳ����ʱ�� + * @ret ����ַ + */ +unsigned int timer_get_reg_base(ls1c_timer_t timer) +{ + unsigned int reg_base = 0; + + switch (timer) + { + case TIMER_PWM0: + reg_base = LS1C_REG_BASE_PWM0; + break; + + case TIMER_PWM1: + reg_base = LS1C_REG_BASE_PWM1; + break; + + case TIMER_PWM2: + reg_base = LS1C_REG_BASE_PWM2; + break; + + case TIMER_PWM3: + reg_base = LS1C_REG_BASE_PWM3; + break; + } + + return reg_base; +} + + +/* + * ��ʼ����ʱ��������ʼ��ʱ + * @timer_info ��ʱ���Ͷ�ʱʱ����Ϣ + */ +void timer_init(timer_info_t *timer_info) +{ + unsigned int timer_reg_base = 0; // �Ĵ�������ַ + unsigned long timer_clk = 0; // Ӳ����ʱ����ʱ�� + unsigned long tmp; + unsigned int ctrl = 0; // ���ƼĴ����еĿ�����Ϣ + + // �ж���� + if (NULL == timer_info) + { + return ; + } + + /* + * �Ѷ�ʱʱ�任��Ϊ��������ֵ + * ������ֵ = ��ʱ����ʱ�� * ��ʱʱ��(��λns) / 1000000000 + * ��о1c�Ķ�ʱ��ʱ��ΪAPBʱ�ӣ��ﵽ126Mhz�� + * Ϊ���������̷����������������ֶ��Ż�����ļ���ʽ��Ҳ���Բ��ø������� + */ + timer_clk = clk_get_apb_rate(); + tmp = (timer_clk / 1000000) * (timer_info->time_ns / 1000); // ��1000000000���Ϊ1000000��1000 + tmp = MIN(tmp, TIMER_COUNTER_MAX); + + // ���ƼĴ�����Ϣ + ctrl = (1 << LS1C_PWM_INT_LRC_EN) + | (0 << LS1C_PWM_INT_HRC_EN) + | (0 << LS1C_PWM_CNTR_RST) + | (0 << LS1C_PWM_INT_SR) + | (1 << LS1C_PWM_INTEN) + | (1 << LS1C_PWM_SINGLE) + | (1 << LS1C_PWM_OE) + | (1 << LS1C_PWM_CNT_EN); + + // ���ø����Ĵ��� + timer_reg_base = timer_get_reg_base(timer_info->timer); // ��ȡ�Ĵ�������ַ + reg_write_32(0, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_HRC)); + reg_write_32(tmp--, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_LRC)); + reg_write_32(0, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CNTR)); + reg_write_32(ctrl, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + + return ; +} + + +/* + * �ж�ָ����ʱ���Ƿ�ʱ(ʵ�ֶ�ʱ) + * @timer_info ��ʱ�� + * @ret TRUE or FALSE + */ +BOOL timer_is_time_out(timer_info_t *timer_info) +{ + unsigned int timer_reg_base = 0; // �Ĵ�������ַ + unsigned int ctrl; // ���ƼĴ�����ֵ + + // �ж���� + if (NULL == timer_info) + { + return FALSE; + } + + // ��ȡ���ƼĴ��� + timer_reg_base = timer_get_reg_base(timer_info->timer); + ctrl = reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + + // �ж��ж�״̬λ + if (ctrl & (1 << LS1C_PWM_INT_SR)) + { + return TRUE; + } + else + { + return FALSE; + } +} + + + +/* + * ֹͣ��ʱ�� + * @timer_info ��ʱ�� + */ +void timer_stop(timer_info_t *timer_info) +{ + unsigned int timer_reg_base = 0; + + // �ж���� + if (NULL == timer_info) + { + return ; + } + + timer_reg_base = timer_get_reg_base(timer_info->timer); + reg_write_32(0, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL)); + + return ; +} + + + +/* + * ��ȡ��ʱ���ӳ�ʼ�������ڵ�ʱ��(ʵ�ּ�ʱ����)����λns + * @timer_info Ӳ����ʱ�� + * @ret ʱ�䣬��λns + */ +unsigned long timer_get_time_ns(timer_info_t *timer_info) +{ + unsigned int timer_reg_base = 0; + unsigned int cntr = 0; // �Ĵ���CNTR��ֵ + unsigned long time_ns = 0; // ʱ�䣬��λns + unsigned long timer_clk = 0; // ��ʱ��ʱ�� + + // ��ȡ�Ĵ���CNTR��ֵ + timer_reg_base = timer_get_reg_base(timer_info->timer); + cntr = reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CNTR)); + + /* + * ��CNTRֵ����Ϊʱ�䣬��λus + * ʱ�� = (������ֵCNTR * 1000000000) / ��ʱ��ʱ��Ƶ�� + * Ϊ�������������ֶ��Ż���ʽΪ ʱ�� = (������ֵCNTR * 1000) / (��ʱ��ʱ��Ƶ�� / 1000000) + */ + timer_clk = clk_get_apb_rate(); + time_ns = (cntr * 1000 ) / (timer_clk /1000000); +// myprintf("[%s] time_us=%lu, cntr=%d, timer_clk=%d\n", __FUNCTION__, time_ns, cntr, timer_clk); + + return time_ns; +} + + + +/* + * ��ӡtimer��ؼĴ�����ֵ + * @timer_info Ӳ����ʱ�� + */ +void timer_print_regs(timer_info_t *timer_info) +{ + unsigned int timer_reg_base = 0; + + timer_reg_base = timer_get_reg_base(timer_info->timer); + myprintf("CNTR=0x%x, HRC=0x%x, LRC=0x%x, CTRL=0x%x\n", + reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CNTR)), + reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_HRC)), + reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_LRC)), + reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL))); + + return ; +} + + diff --git a/bsp/ls1cdev/libraries/ls1c_timer.h b/bsp/ls1cdev/libraries/ls1c_timer.h new file mode 100644 index 0000000000..df38c705f5 --- /dev/null +++ b/bsp/ls1cdev/libraries/ls1c_timer.h @@ -0,0 +1,69 @@ +// Ӳ����ʱ��ͷ�ļ� + + +#ifndef __OPENLOONGSON_TIMER_H +#define __OPENLOONGSON_TIMER_H + + +#include "ls1c_public.h" + + +// Ӳ����ʱ�� +typedef enum +{ + TIMER_PWM0, // PWM0����Ӳ����ʱ�� + TIMER_PWM1, // PWM1����Ӳ����ʱ�� + TIMER_PWM2, // PWM2����Ӳ����ʱ�� + TIMER_PWM3 // PWM3����Ӳ����ʱ�� +}ls1c_timer_t; + + +// Ӳ����ʱ����Ϣ +typedef struct +{ + ls1c_timer_t timer; // Ӳ����ʱ�� + unsigned long time_ns; // ��ʱʱ�� +}timer_info_t; + + + +/* + * ��ʼ����ʱ��������ʼ��ʱ + * @timer_info ��ʱ���Ͷ�ʱʱ����Ϣ + */ +void timer_init(timer_info_t *timer_info); + + +/* + * �ж�ָ����ʱ���Ƿ�ʱ + * @timer_info ��ʱ�� + * @ret TRUE or FALSE + */ +BOOL timer_is_time_out(timer_info_t *timer_info); + + +/* + * ֹͣ��ʱ�� + * @timer_info ��ʱ�� + */ +void timer_stop(timer_info_t *timer_info); + + + +/* + * ��ȡ��ʱ���ӳ�ʼ�������ڵ�ʱ��(ʵ�ּ�ʱ����)����λns + * @timer_info Ӳ����ʱ�� + * @ret ʱ�䣬��λns + */ +unsigned long timer_get_time_ns(timer_info_t *timer_info); + + +/* + * ��ӡtimer��ؼĴ�����ֵ + * @timer_info Ӳ����ʱ�� + */ +void timer_print_regs(timer_info_t *timer_info); + + +#endif + |
