summaryrefslogtreecommitdiff
path: root/bsp/ls1cdev
diff options
context:
space:
mode:
author勤为本 <[email protected]>2017-07-18 11:33:27 +0800
committer勤为本 <[email protected]>2017-07-18 11:33:27 +0800
commit878b222741dd2b628240d1b19401c04ae507860f (patch)
tree6bae0edd135bb040778375d146147358eb8aae2f /bsp/ls1cdev
parentd22df879ace32d18a6fed07427a14f2f3b92b009 (diff)
将“龙芯1c库”中硬件定时器相关接口移植到RT-Thread
Diffstat (limited to 'bsp/ls1cdev')
-rw-r--r--bsp/ls1cdev/libraries/ls1c_timer.c200
-rw-r--r--bsp/ls1cdev/libraries/ls1c_timer.h69
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
+