summaryrefslogtreecommitdiff
path: root/bsp/ls1cdev/libraries/ls1c_timer.c
diff options
context:
space:
mode:
authorsundm75 <[email protected]>2018-12-24 18:49:00 +0800
committersundm75 <[email protected]>2018-12-24 18:49:00 +0800
commit029e161f594ec46eb96ed878ea31f17037740848 (patch)
tree1a6eb411e17fd8c282b495f295f05cf97d72a8ec /bsp/ls1cdev/libraries/ls1c_timer.c
parentd592b41dfdc0b3b627c7d4eda9d7b85633f73c4b (diff)
[BSP][all ls1c]change license to Apache-2.0
[BSP][ls1c] add rtc library [BSP][ls1c] add pwm ,touch , rtc driver
Diffstat (limited to 'bsp/ls1cdev/libraries/ls1c_timer.c')
-rw-r--r--bsp/ls1cdev/libraries/ls1c_timer.c115
1 files changed, 108 insertions, 7 deletions
diff --git a/bsp/ls1cdev/libraries/ls1c_timer.c b/bsp/ls1cdev/libraries/ls1c_timer.c
index 0075e6e3f6..11cadf18aa 100644
--- a/bsp/ls1cdev/libraries/ls1c_timer.c
+++ b/bsp/ls1cdev/libraries/ls1c_timer.c
@@ -1,6 +1,15 @@
+ /*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * first version
+ */
// Ӳ����ʱ��Դ��
-
+#include <ls1c.h>
#include "ls1c_public.h"
#include "ls1c_pin.h"
#include "ls1c_clock.h"
@@ -147,8 +156,6 @@ void timer_stop(timer_info_t *timer_info)
return ;
}
-
-
/*
* ��ȡ��ʱ���ӳ�ʼ�������ڵ�ʱ��(ʵ�ּ�ʱ����)����λns
* @timer_info Ӳ����ʱ��
@@ -172,13 +179,11 @@ unsigned long timer_get_time_ns(timer_info_t *timer_info)
*/
timer_clk = clk_get_apb_rate();
time_ns = (cntr * 1000 ) / (timer_clk /1000000);
-// rt_kprintf("[%s] time_us=%lu, cntr=%d, timer_clk=%d\n", __FUNCTION__, time_ns, cntr, timer_clk);
+// printf("[%s] time_us=%lu, cntr=%d, timer_clk=%d\n", __FUNCTION__, time_ns, cntr, timer_clk);
return time_ns;
}
-
-
/*
* ��ӡtimer��ؼĴ�����ֵ
* @timer_info Ӳ����ʱ��
@@ -188,7 +193,7 @@ 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);
- rt_kprintf("CNTR=0x%x, HRC=0x%x, LRC=0x%x, CTRL=0x%x\n",
+ printf("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)),
@@ -197,4 +202,100 @@ void timer_print_regs(timer_info_t *timer_info)
return ;
}
+/*
+ * ��ʱ���ж���
+ * @timer_info ��ʱ����Ϣ
+ */
+void timer_int_clr(timer_info_t *timer_info)
+{
+ unsigned int timer_reg_base = 0; // �Ĵ�������ַ
+ unsigned int ctrl ;
+
+ // ����
+ if (NULL == timer_info)
+ {
+ return ;
+ }
+ timer_reg_base = timer_get_reg_base(timer_info->timer); // ��ȡ�Ĵ�������ַ
+ ctrl = reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL));
+ ctrl = ctrl | (1<<LS1C_PWM_INT_SR) ;
+ reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL));
+ ctrl = ctrl & (~(1<<LS1C_PWM_INT_SR)) ;
+ reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL));
+ return ;
+}
+/*
+ * ��ʱ��������
+ * @timer_info ��ʱ����Ϣ
+ */
+void timer_cnt_clr(timer_info_t *timer_info)
+{
+ unsigned int timer_reg_base = 0; // �Ĵ�������ַ
+ unsigned int ctrl ;
+
+ // ����
+ if (NULL == timer_info)
+ {
+ return ;
+ }
+ timer_reg_base = timer_get_reg_base(timer_info->timer); // ��ȡ�Ĵ�������ַ
+ ctrl = reg_read_32((volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL));
+ ctrl = ctrl | (1<<LS1C_PWM_CNTR_RST);
+ reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL));
+ ctrl = ctrl & (~(1<<LS1C_PWM_CNTR_RST)) ;
+ reg_write_32(ctrl , (volatile unsigned int *)(timer_reg_base + LS1C_PWM_CTRL));
+
+ return ;
+}
+
+/*
+ * ��ʼ����ʱ��������ʼ�ж϶�ʱ
+ * @timer_info ��ʱ���Ͷ�ʱʱ����Ϣ
+ * @hrc ���ж� lrc ���ж� Ϊ1�򿪣�Ϊ0�ر�
+*/
+void timer_int_init(timer_info_t *timer_info, int hrc, int lrc)
+{
+ unsigned int timer_reg_base = 0; // �Ĵ�������ַ
+ unsigned long timer_clk = 0; // Ӳ����ʱ����ʱ��
+ unsigned long h_value, l_value;
+ unsigned int ctrl = 0; // ���ƼĴ����еĿ�����Ϣ
+
+ // ����
+ if (NULL == timer_info)
+ {
+ return ;
+ }
+
+ /*
+ * �Ѷ�ʱʱ�任��Ϊ��������ֵ
+ * ������ֵ = ��ʱ����ʱ�� * ��ʱʱ��(��λns) / 1000000000
+ * ��о1c�Ķ�ʱ��ʱ��ΪAPBʱ�ӣ��ﵽ126Mhz��
+ * Ϊ���������̷����������������ֶ��Ż�����ļ���ʽ��Ҳ���Բ��ø�������
+ */
+ timer_clk = clk_get_apb_rate();
+ l_value = (timer_clk / 1000000) * (timer_info->time_ns / 1000); // ��1000000000���Ϊ1000000��1000
+ l_value = MIN(l_value, TIMER_COUNTER_MAX);
+ h_value = (timer_clk / 1000000) * (timer_info->time_h_ns / 1000); // ��1000000000���Ϊ1000000��1000
+ h_value = MIN(h_value, l_value);
+
+ // ���ƼĴ�����Ϣ
+ ctrl = (lrc << LS1C_PWM_INT_LRC_EN)
+ | (hrc << 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(l_value--, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_LRC));
+ reg_write_32(h_value--, (volatile unsigned int *)(timer_reg_base + LS1C_PWM_HRC));
+ 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 ;
+}