mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-22 19:44:24 +08:00
[BSP][all ls1c]change license to Apache-2.0
[BSP][ls1c] add rtc library [BSP][ls1c] add pwm ,touch , rtc driver
This commit is contained in:
@@ -1,21 +1,7 @@
|
||||
/*
|
||||
* File : ls1c_can.c
|
||||
* This file is part of RT-Thread RTOS
|
||||
* COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -25,6 +11,7 @@
|
||||
#include "ls1c.h"
|
||||
#include "ls1c_public.h"
|
||||
#include "ls1c_can.h"
|
||||
#include "ls1c_delay.h"
|
||||
|
||||
unsigned char set_reset_mode(CAN_TypeDef* CANx)
|
||||
{
|
||||
@@ -51,7 +38,7 @@ unsigned char set_reset_mode(CAN_TypeDef* CANx)
|
||||
/*检查复位标志*/
|
||||
status = CANx->MOD;
|
||||
}
|
||||
rt_kprintf("\r\nSetting SJA1000 into reset mode failed!\r\n");
|
||||
printf("\r\nSetting SJA1000 into reset mode failed!\r\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -77,7 +64,7 @@ static unsigned char set_normal_mode(CAN_TypeDef* CANx)
|
||||
delay_us(10);
|
||||
status = CANx->MOD;
|
||||
}
|
||||
rt_kprintf("\r\nSetting SJA1000 into normal mode failed!\r\n");
|
||||
printf("\r\nSetting SJA1000 into normal mode failed!\r\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -102,7 +89,7 @@ unsigned char CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
|
||||
status = CANx->MOD;
|
||||
if( status == 0xFF)
|
||||
{
|
||||
rt_kprintf("\n Probe can0 failed \r\n");
|
||||
printf("\n Probe can0 failed \r\n");
|
||||
return CAN_InitStatus_Failed;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,22 +1,7 @@
|
||||
|
||||
/*
|
||||
* File : ls1c_can.h
|
||||
* This file is part of RT-Thread RTOS
|
||||
* COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs: (Pelican Mode)
|
||||
* Date Author Notes
|
||||
@@ -221,7 +206,7 @@ unsigned char CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
|
||||
void CAN_Receive(CAN_TypeDef* CANx, CanRxMsg* RxMessage);
|
||||
|
||||
unsigned char set_reset_mode(CAN_TypeDef* CANx);
|
||||
unsigned char set_start(CAN_TypeDef* CANx);
|
||||
unsigned char set_start(CAN_TypeDef* CANx);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,28 +1,32 @@
|
||||
/*************************************************************************
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* 时钟相关函数
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
*************************************************************************/
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
|
||||
#include "ls1c_regs.h"
|
||||
#include "ls1c_public.h"
|
||||
|
||||
|
||||
// 晶振的频率
|
||||
// 晶振的频率
|
||||
#define AHB_CLK (24000000)
|
||||
#define APB_CLK (AHB_CLK)
|
||||
|
||||
|
||||
// START_FREQ寄存器bits
|
||||
// START_FREQ寄存器bits
|
||||
#define M_PLL_SHIFT (8)
|
||||
#define M_PLL (0xff << M_PLL_SHIFT) // PLL倍频系数的整数部分
|
||||
#define M_PLL (0xff << M_PLL_SHIFT) // PLL倍频系数的整数部分
|
||||
#define FRAC_N_SHIFT (16)
|
||||
#define FRAC_N (0xff << FRAC_N_SHIFT) // PLL倍频系数的小数部分
|
||||
#define FRAC_N (0xff << FRAC_N_SHIFT) // PLL倍频系数的小数部分
|
||||
#define DIV_SDRAM_SHIFT (0)
|
||||
#define DIV_SDRAM (0x3 << DIV_SDRAM_SHIFT)
|
||||
|
||||
// CLK_DIV_PARAM寄存器bits
|
||||
// CLK_DIV_PARAM寄存器bits
|
||||
#define DIV_PIX_EN (0x1 << 31)
|
||||
#define DIV_PIX (0x7f << 24)
|
||||
#define DIV_CAM_EN (0x1 << 23)
|
||||
@@ -42,8 +46,8 @@
|
||||
|
||||
|
||||
/*
|
||||
* 获取PLL频率
|
||||
* @ret PLL频率
|
||||
* 获取PLL频率
|
||||
* @ret PLL频率
|
||||
*/
|
||||
unsigned long clk_get_pll_rate(void)
|
||||
{
|
||||
@@ -58,8 +62,8 @@ unsigned long clk_get_pll_rate(void)
|
||||
|
||||
|
||||
/*
|
||||
* 获取CPU频率
|
||||
* @ret CPU频率
|
||||
* 获取CPU频率
|
||||
* @ret CPU频率
|
||||
*/
|
||||
unsigned long clk_get_cpu_rate(void)
|
||||
{
|
||||
@@ -69,8 +73,8 @@ unsigned long clk_get_cpu_rate(void)
|
||||
pll_rate = clk_get_pll_rate();
|
||||
ctrl = reg_read_32((volatile unsigned int *)LS1C_CLK_DIV_PARAM);
|
||||
|
||||
// 选择时钟来源
|
||||
if (DIV_CPU_SEL & ctrl) // pll分频作为时钟信号
|
||||
// 选择时钟来源
|
||||
if (DIV_CPU_SEL & ctrl) // pll分频作为时钟信号
|
||||
{
|
||||
if (DIV_CPU_EN & ctrl)
|
||||
{
|
||||
@@ -81,7 +85,7 @@ unsigned long clk_get_cpu_rate(void)
|
||||
cpu_rate = pll_rate / 2;
|
||||
}
|
||||
}
|
||||
else // bypass模式,晶振作为时钟输入
|
||||
else // bypass模式,晶振作为时钟输入
|
||||
{
|
||||
cpu_rate = APB_CLK;
|
||||
}
|
||||
@@ -91,8 +95,8 @@ unsigned long clk_get_cpu_rate(void)
|
||||
|
||||
|
||||
/*
|
||||
* 获取DDR频率
|
||||
* @ret DDR频率
|
||||
* 获取DDR频率
|
||||
* @ret DDR频率
|
||||
*/
|
||||
unsigned long clk_get_ddr_rate(void)
|
||||
{
|
||||
@@ -125,8 +129,8 @@ unsigned long clk_get_ddr_rate(void)
|
||||
|
||||
|
||||
/*
|
||||
* 获取APB频率
|
||||
* @ret APB频率
|
||||
* 获取APB频率
|
||||
* @ret APB频率
|
||||
*/
|
||||
unsigned long clk_get_apb_rate(void)
|
||||
{
|
||||
@@ -135,8 +139,8 @@ unsigned long clk_get_apb_rate(void)
|
||||
|
||||
|
||||
/*
|
||||
* 获取DC频率
|
||||
* @ret DC频率
|
||||
* 获取DC频率
|
||||
* @ret DC频率
|
||||
*/
|
||||
unsigned long clk_get_dc_rate(void)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
/*************************************************************************
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* 时钟相关头文件
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
*************************************************************************/
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __OPENLOONGSON_CLOCK_H
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
// 软件延时源文件
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
|
||||
#include "ls1c_clock.h"
|
||||
@@ -12,7 +20,7 @@
|
||||
*/
|
||||
void delay_ms(int j)
|
||||
{
|
||||
int k_max = clk_get_cpu_rate()/1000/3; // 除以1000表示ms,除以3为测试所得的经验(可以理解为最内层循环执行一次需要的时钟个数)
|
||||
int k_max = clk_get_cpu_rate()/1000/92; // 除以1000表示ms,另外一个除数为实验测得的经验值
|
||||
int k = k_max;
|
||||
|
||||
for ( ; j > 0; j--)
|
||||
@@ -33,24 +41,25 @@ void delay_ms(int j)
|
||||
*/
|
||||
void delay_us(int n)
|
||||
{
|
||||
int count_1us = clk_get_cpu_rate() / 1000000 / 3; // 延时1us的循环次数
|
||||
int count_1us = 252000000 / 1000000 / 84; // 延时1us的循环次数
|
||||
// 252000000为cpu频率,除以1000000表示延时单位为us,92为实验测得的经验值
|
||||
int count_max; // 延时n微秒的循环次数
|
||||
int tmp;
|
||||
|
||||
// 根据延时长短微调(注意,这里是手动优化的,cpu频率改变了可能需要重新优化,此时cpu频率为252Mhz)
|
||||
// 微调
|
||||
count_max = n * count_1us;
|
||||
if (10 >= n) // <=10us
|
||||
{
|
||||
count_1us -= 35;
|
||||
count_max = count_max / 3;
|
||||
}
|
||||
else if (100 >= n) // <= 100us
|
||||
{
|
||||
count_1us -= 6;
|
||||
count_max = count_max - count_max / 5;
|
||||
}
|
||||
else // > 100us
|
||||
{
|
||||
count_1us -= 1;
|
||||
count_max = count_max - count_max / 10;
|
||||
}
|
||||
count_max = n * count_1us;
|
||||
|
||||
// 延时
|
||||
for (tmp = count_max; tmp > 0; tmp--)
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
// 软件延时头文件
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __OPENLOONGSON_DELAY_H
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
// 封装gpio接口
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
|
||||
#include "ls1c_public.h"
|
||||
@@ -8,13 +16,13 @@
|
||||
|
||||
|
||||
/*
|
||||
* 获取指定gpio的CFG寄存器
|
||||
* @gpio gpio编号
|
||||
* @ret CFG寄存器
|
||||
* 获取指定gpio的CFG寄存器
|
||||
* @gpio gpio编号
|
||||
* @ret CFG寄存器
|
||||
*/
|
||||
volatile unsigned int *gpio_get_cfg_reg(unsigned int gpio)
|
||||
{
|
||||
volatile unsigned int *gpio_cfgx = NULL; // GPIO_CFGx寄存器
|
||||
volatile unsigned int *gpio_cfgx = NULL; // GPIO_CFGx寄存器
|
||||
unsigned int port = GPIO_GET_PORT(gpio);
|
||||
|
||||
switch (port)
|
||||
@@ -45,13 +53,13 @@ volatile unsigned int *gpio_get_cfg_reg(unsigned int gpio)
|
||||
|
||||
|
||||
/*
|
||||
* 获取指定gpio的EN寄存器
|
||||
* @gpio gpio编号
|
||||
* @ret EN寄存器
|
||||
* 获取指定gpio的EN寄存器
|
||||
* @gpio gpio编号
|
||||
* @ret EN寄存器
|
||||
*/
|
||||
volatile unsigned int *gpio_get_en_reg(unsigned int gpio)
|
||||
{
|
||||
volatile unsigned int *gpio_enx = NULL; // GPIO_ENx寄存器
|
||||
volatile unsigned int *gpio_enx = NULL; // GPIO_ENx寄存器
|
||||
unsigned int port = GPIO_GET_PORT(gpio);
|
||||
|
||||
switch (port)
|
||||
@@ -81,28 +89,28 @@ volatile unsigned int *gpio_get_en_reg(unsigned int gpio)
|
||||
}
|
||||
|
||||
/*
|
||||
* gpio初始化
|
||||
* @gpio gpio引脚,取值范围[0, 127]
|
||||
* @mode gpio的工作模式(输入、输出)
|
||||
* gpio初始化
|
||||
* @gpio gpio引脚,取值范围[0, 127]
|
||||
* @mode gpio的工作模式(输入、输出)
|
||||
*
|
||||
* 例: 将gpio50初始化为输出
|
||||
* 例: 将gpio50初始化为输出
|
||||
* gpio_init(50, gpio_mode_output);
|
||||
*/
|
||||
void gpio_init(unsigned int gpio, gpio_mode_t mode)
|
||||
{
|
||||
volatile unsigned int *gpio_enx = NULL; // GPIO_ENx寄存器
|
||||
volatile unsigned int *gpio_enx = NULL; // GPIO_ENx寄存器
|
||||
unsigned int pin = GPIO_GET_PIN(gpio);
|
||||
|
||||
// 将pin设为普通GPIO
|
||||
// 将pin设为普通GPIO
|
||||
pin_set_purpose(gpio, PIN_PURPOSE_GPIO);
|
||||
|
||||
// 设置gpio工作模式(输入、输出)
|
||||
// 设置gpio工作模式(输入、输出)
|
||||
gpio_enx = gpio_get_en_reg(gpio);
|
||||
if (gpio_mode_output == mode) // 输出
|
||||
if (gpio_mode_output == mode) // 输出
|
||||
{
|
||||
reg_clr_one_bit(gpio_enx, pin);
|
||||
}
|
||||
else // 输入
|
||||
else // 输入
|
||||
{
|
||||
reg_set_one_bit(gpio_enx, pin);
|
||||
}
|
||||
@@ -112,20 +120,20 @@ void gpio_init(unsigned int gpio, gpio_mode_t mode)
|
||||
|
||||
|
||||
/*
|
||||
* 在指定gpio输出高电平或低电平
|
||||
* @gpio gpio引脚,取值范围[0, 127]
|
||||
* @level 电平值
|
||||
* 在指定gpio输出高电平或低电平
|
||||
* @gpio gpio引脚,取值范围[0, 127]
|
||||
* @level 电平值
|
||||
*
|
||||
* 例: 在gpio50上输出低电平
|
||||
* 例: 在gpio50上输出低电平
|
||||
* gpio_set(50, gpio_level_low);
|
||||
*/
|
||||
void gpio_set(unsigned int gpio, gpio_level_t level)
|
||||
{
|
||||
volatile unsigned int *gpio_outx = NULL; // GPIO_OUTx寄存器
|
||||
volatile unsigned int *gpio_outx = NULL; // GPIO_OUTx寄存器
|
||||
unsigned int port = GPIO_GET_PORT(gpio);
|
||||
unsigned int pin = GPIO_GET_PIN(gpio);
|
||||
|
||||
// 获取寄存器地址
|
||||
// 获取寄存器地址
|
||||
switch (port)
|
||||
{
|
||||
case 0:
|
||||
@@ -144,11 +152,11 @@ void gpio_set(unsigned int gpio, gpio_level_t level)
|
||||
gpio_outx = (volatile unsigned int *)LS1C_GPIO_OUT3;
|
||||
break;
|
||||
|
||||
default: // 正确的程序不应该走到这里,直接返回
|
||||
default: // 正确的程序不应该走到这里,直接返回
|
||||
return ;
|
||||
}
|
||||
|
||||
// 输出
|
||||
// 输出
|
||||
if (gpio_level_low == level)
|
||||
{
|
||||
reg_clr_one_bit(gpio_outx, pin);
|
||||
@@ -163,20 +171,20 @@ void gpio_set(unsigned int gpio, gpio_level_t level)
|
||||
|
||||
|
||||
/*
|
||||
* 读取指定gpio引脚的值
|
||||
* @gpio gpio引脚,取值范围[0,127]
|
||||
* 读取指定gpio引脚的值
|
||||
* @gpio gpio引脚,取值范围[0,127]
|
||||
*
|
||||
* 例: 读取gpio50引脚上的值
|
||||
* 例: 读取gpio50引脚上的值
|
||||
* gpio_level_t level;
|
||||
* level = gpio_get(50);
|
||||
*/
|
||||
unsigned int gpio_get(unsigned int gpio)
|
||||
{
|
||||
volatile unsigned int *gpio_inx = NULL; // GPIO_INx寄存器
|
||||
volatile unsigned int *gpio_inx = NULL; // GPIO_INx寄存器
|
||||
unsigned int port = GPIO_GET_PORT(gpio);
|
||||
unsigned int pin = GPIO_GET_PIN(gpio);
|
||||
|
||||
// 获取寄存器地址
|
||||
// 获取寄存器地址
|
||||
switch (port)
|
||||
{
|
||||
case 0:
|
||||
@@ -195,28 +203,28 @@ unsigned int gpio_get(unsigned int gpio)
|
||||
gpio_inx = (volatile unsigned int *)LS1C_GPIO_IN3;
|
||||
break;
|
||||
|
||||
default: // 正常的流程不应该走到这里,直接返回
|
||||
default: // 正常的流程不应该走到这里,直接返回
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 读取
|
||||
// 读取
|
||||
return reg_get_bit(gpio_inx, pin);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设置中断类型
|
||||
* @gpio gpio引脚
|
||||
* @type 触发中断的条件。高电平触发、低电平触发、上升沿触发 or 下降沿触发
|
||||
* 设置中断类型
|
||||
* @gpio gpio引脚
|
||||
* @type 触发中断的条件。高电平触发、低电平触发、上升沿触发 or 下降沿触发
|
||||
*/
|
||||
void gpio_set_irq_type(unsigned int gpio, gpio_irq_type_t type)
|
||||
{
|
||||
volatile unsigned int *int_pol = NULL; // 中断极性选择寄存器
|
||||
volatile unsigned int *int_edge = NULL; // 中断边沿选择寄存器
|
||||
volatile unsigned int *int_pol = NULL; // 中断极性选择寄存器
|
||||
volatile unsigned int *int_edge = NULL; // 中断边沿选择寄存器
|
||||
unsigned int port = GPIO_GET_PORT(gpio);
|
||||
unsigned int pin = GPIO_GET_PIN(gpio);
|
||||
|
||||
// 获取寄存器地址
|
||||
// 获取寄存器地址
|
||||
switch (port)
|
||||
{
|
||||
case 0: // GPIO[31:0]
|
||||
@@ -235,7 +243,7 @@ void gpio_set_irq_type(unsigned int gpio, gpio_irq_type_t type)
|
||||
break;
|
||||
}
|
||||
|
||||
// 设置中断类型
|
||||
// 设置中断类型
|
||||
switch (type)
|
||||
{
|
||||
case IRQ_TYPE_EDGE_RISING:
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __OPENLOONGSON_GPIO_H
|
||||
|
||||
@@ -1,21 +1,7 @@
|
||||
/*
|
||||
* File : ls1c_i2c.c
|
||||
* This file is part of RT-Thread RTOS
|
||||
* COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,21 +1,7 @@
|
||||
/*
|
||||
* File : ls1c_i2c.h
|
||||
* This file is part of RT-Thread RTOS
|
||||
* COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
// 引脚功能(普通gpio,pwm,复用等)相关接口
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
// 引脚功能(普通gpio,pwm,复用等)相关接口
|
||||
|
||||
#ifndef __OPENLOONGSON_PIN_H
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
// 一些常用的、共用的接口
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,4 +1,14 @@
|
||||
// 一些常用的、共用的接口
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
// 一些常用的、共用的接口
|
||||
|
||||
#ifndef __OPENLOONGSON_PUBLIC_H
|
||||
#define __OPENLOONGSON_PUBLIC_H
|
||||
@@ -7,7 +17,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
// pmon提供的打印函数,见main()函数
|
||||
// pmon提供的打印函数,见main()函数
|
||||
struct callvectors {
|
||||
int (*open) (char *, int, int);
|
||||
int (*close) (int);
|
||||
@@ -35,58 +45,58 @@ typedef enum
|
||||
}BOOL;
|
||||
|
||||
/*
|
||||
* 将指定寄存器的指定位置1
|
||||
* @reg 寄存器地址
|
||||
* @bit 需要置1的那一bit
|
||||
* 将指定寄存器的指定位置1
|
||||
* @reg 寄存器地址
|
||||
* @bit 需要置1的那一bit
|
||||
*/
|
||||
void reg_set_one_bit(volatile unsigned int *reg, unsigned int bit);
|
||||
|
||||
|
||||
/*
|
||||
* 将指定寄存器的指定位清零
|
||||
* @reg 寄存器地址
|
||||
* @bit 需要清零的那一bit
|
||||
* 将指定寄存器的指定位清零
|
||||
* @reg 寄存器地址
|
||||
* @bit 需要清零的那一bit
|
||||
*/
|
||||
void reg_clr_one_bit(volatile unsigned int *reg, unsigned int bit);
|
||||
|
||||
|
||||
/*
|
||||
* 获取指定寄存器的指定位的值
|
||||
* @reg 寄存器地址
|
||||
* @bit 需要读取值的那一bit
|
||||
* @ret 指定位的值
|
||||
* 获取指定寄存器的指定位的值
|
||||
* @reg 寄存器地址
|
||||
* @bit 需要读取值的那一bit
|
||||
* @ret 指定位的值
|
||||
*/
|
||||
unsigned int reg_get_bit(volatile unsigned int *reg, unsigned int bit);
|
||||
|
||||
|
||||
/*
|
||||
* 向寄存器中写入8bit(一个字节)数据
|
||||
* @data 待写入的数据
|
||||
* @addr 寄存器地址
|
||||
* 向寄存器中写入8bit(一个字节)数据
|
||||
* @data 待写入的数据
|
||||
* @addr 寄存器地址
|
||||
*/
|
||||
void reg_write_8(unsigned char data, volatile unsigned char *addr);
|
||||
|
||||
|
||||
/*
|
||||
* 从寄存器读出8bit(一个字节)数据
|
||||
* @addr 寄存器地址
|
||||
* @ret 读出的数据
|
||||
* 从寄存器读出8bit(一个字节)数据
|
||||
* @addr 寄存器地址
|
||||
* @ret 读出的数据
|
||||
*/
|
||||
unsigned char reg_read_8(volatile unsigned char *addr);
|
||||
|
||||
|
||||
/*
|
||||
* 向寄存器中写一个32bit的数据
|
||||
* @data 待写入的数据
|
||||
* @addr 寄存器地址
|
||||
* 向寄存器中写一个32bit的数据
|
||||
* @data 待写入的数据
|
||||
* @addr 寄存器地址
|
||||
*/
|
||||
void reg_write_32(unsigned int data, volatile unsigned int *addr);
|
||||
|
||||
|
||||
/*
|
||||
* 从寄存器读出一个32bit数据
|
||||
* @addr 寄存器地址
|
||||
* @ret 读出的数据
|
||||
* 从寄存器读出一个32bit数据
|
||||
* @addr 寄存器地址
|
||||
* @ret 读出的数据
|
||||
*/
|
||||
unsigned int reg_read_32(volatile unsigned int *addr);
|
||||
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
// 封装硬件pwm接口
|
||||
|
||||
#include "ls1c_public.h"
|
||||
@@ -6,13 +16,9 @@
|
||||
#include "ls1c_clock.h"
|
||||
#include "ls1c_regs.h"
|
||||
|
||||
|
||||
|
||||
// pwm的最大周期
|
||||
#define PWM_MAX_PERIOD (0xFFFFFF) // 计数器的值
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 根据gpio获取相应pwm的基地址
|
||||
* @gpio pwm引脚
|
||||
@@ -193,5 +199,3 @@ void pwm_init(pwm_info_t *pwm_info)
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __OPENLOONGSON_PWM_H
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-09-06 勤为本 first version
|
||||
*/
|
||||
|
||||
// 龙芯1c外设寄存器
|
||||
|
||||
|
||||
@@ -139,6 +149,8 @@
|
||||
#define LS1C_UART10_BASE (0xbfe4ca00)
|
||||
#define LS1C_UART11_BASE (0xbfe4cb00)
|
||||
|
||||
//RTC寄存器
|
||||
#define LS1C_RTC_BASE (0xbfe64024)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-05-06 sundm75 first version
|
||||
*/
|
||||
#include "ls1c.h"
|
||||
#include "ls1c_public.h"
|
||||
#include "ls1c_rtc.h"
|
||||
|
||||
#define LS1C_SEC_OFFSET (4)
|
||||
#define LS1C_MIN_OFFSET (10)
|
||||
#define LS1C_HOUR_OFFSET (16)
|
||||
#define LS1C_DAY_OFFSET (21)
|
||||
#define LS1C_MONTH_OFFSET (26)
|
||||
|
||||
#define LS1C_SEC_MASK (0x3f)
|
||||
#define LS1C_MIN_MASK (0x3f)
|
||||
#define LS1C_HOUR_MASK (0x1f)
|
||||
#define LS1C_DAY_MASK (0x1f)
|
||||
#define LS1C_MONTH_MASK (0x3f)
|
||||
#define LS1C_YEAR_MASK (0xff)
|
||||
|
||||
#define ls1c_get_sec(t) (((t) >> LS1C_SEC_OFFSET) & LS1C_SEC_MASK)
|
||||
#define ls1c_get_min(t) (((t) >> LS1C_MIN_OFFSET) & LS1C_MIN_MASK)
|
||||
#define ls1c_get_hour(t) (((t) >> LS1C_HOUR_OFFSET) & LS1C_HOUR_MASK)
|
||||
#define ls1c_get_day(t) (((t) >> LS1C_DAY_OFFSET) & LS1C_DAY_MASK)
|
||||
#define ls1c_get_month(t) (((t) >> LS1C_MONTH_OFFSET) & LS1C_MONTH_MASK)
|
||||
|
||||
int RTC_SetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime)
|
||||
{
|
||||
|
||||
hrtc->SYS_TOYWRITE0
|
||||
= (sTime->Month << LS1C_MONTH_OFFSET)
|
||||
| (sTime->Date << LS1C_DAY_OFFSET)
|
||||
| (sTime->Hours << LS1C_HOUR_OFFSET)
|
||||
| (sTime->Minutes << LS1C_MIN_OFFSET)
|
||||
| (sTime->Seconds << LS1C_SEC_OFFSET);
|
||||
hrtc->SYS_TOYWRITE1 = sTime->Year % 100;
|
||||
printf("\r\ntoy_read0 = 0x%x, toy_read1 = 0x%x.\r\n", hrtc->SYS_TOYREAD0, hrtc->SYS_TOYREAD1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RTC_GetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime)
|
||||
{
|
||||
unsigned long toy_read0, toy_read1;
|
||||
toy_read0 = hrtc->SYS_TOYREAD0;
|
||||
toy_read1 = hrtc->SYS_TOYREAD1;
|
||||
sTime->Seconds = ls1c_get_sec(toy_read0);
|
||||
sTime->Minutes = ls1c_get_min(toy_read0);
|
||||
sTime->Hours = ls1c_get_hour(toy_read0);
|
||||
sTime->Date = ls1c_get_day(toy_read0);
|
||||
sTime->Month = ls1c_get_month(toy_read0);
|
||||
sTime->Year = toy_read1 & LS1C_YEAR_MASK;
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
unsigned char RTC_IsLeapYear(unsigned int nYear)
|
||||
{
|
||||
if((nYear % 4U) != 0U)
|
||||
{
|
||||
return 0U;
|
||||
}
|
||||
|
||||
if((nYear % 100U) != 0U)
|
||||
{
|
||||
return 1U;
|
||||
}
|
||||
|
||||
if((nYear % 400U) == 0U)
|
||||
{
|
||||
return 1U;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0U;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned char RTC_WeekDayNum(unsigned long nYear, unsigned char nMonth, unsigned char nDay)
|
||||
{
|
||||
unsigned long year = 0U, weekday = 0U;
|
||||
|
||||
year = 2000U + nYear;
|
||||
|
||||
if(nMonth < 3U)
|
||||
{
|
||||
/*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/
|
||||
weekday = (((23U * nMonth)/9U) + nDay + 4U + year + ((year-1U)/4U) - ((year-1U)/100U) + ((year-1U)/400U)) % 7U;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/
|
||||
weekday = (((23U * nMonth)/9U) + nDay + 4U + year + (year/4U) - (year/100U) + (year/400U) - 2U ) % 7U;
|
||||
}
|
||||
|
||||
return (unsigned char)weekday;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-05-06 sundm75 first version
|
||||
*/
|
||||
|
||||
#ifndef __OPENLOONGSON_RTC_H
|
||||
#define __OPENLOONGSON_RTC_H
|
||||
|
||||
|
||||
#define RTC ( (RTC_TypeDef* )LS1C_RTC_BASE)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char Year; /*0 ~ 99 */
|
||||
unsigned char Month; /*1 ~ 12 */
|
||||
unsigned char Date; /*1 ~ 31 */
|
||||
unsigned char Hours; /*0 ~ 23 */
|
||||
unsigned char Minutes; /*0 ~ 59 */
|
||||
unsigned char Seconds; /*0 ~ 59 */
|
||||
}RTC_TimeTypeDef;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned long SYS_TOYWRITE0;
|
||||
unsigned long SYS_TOYWRITE1;
|
||||
unsigned long SYS_TOYREAD0;
|
||||
unsigned long SYS_TOYREAD1;
|
||||
} RTC_TypeDef;
|
||||
|
||||
int RTC_SetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime);
|
||||
int RTC_GetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime);
|
||||
|
||||
unsigned char RTC_IsLeapYear(unsigned int nYear);
|
||||
unsigned char RTC_WeekDayNum(unsigned long nYear, unsigned char nMonth, unsigned char nDay);
|
||||
|
||||
#endif
|
||||
@@ -1,21 +1,7 @@
|
||||
/*
|
||||
* File : ls1c_spi.c
|
||||
* This file is part of RT-Thread RTOS
|
||||
* COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -24,7 +10,6 @@
|
||||
|
||||
// 硬件spi接口源文件
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include "ls1c_public.h"
|
||||
#include "ls1c_regs.h"
|
||||
@@ -38,7 +23,7 @@
|
||||
* 获取指定SPI模块的基地址
|
||||
* @SPIx SPI模块的编号
|
||||
*/
|
||||
inline void *ls1c_spi_get_base(unsigned char SPIx)
|
||||
void *ls1c_spi_get_base(unsigned char SPIx)
|
||||
{
|
||||
void *base = NULL;
|
||||
|
||||
@@ -67,7 +52,7 @@ inline void *ls1c_spi_get_base(unsigned char SPIx)
|
||||
*/
|
||||
void ls1c_spi_print_all_regs_info(void *spi_base)
|
||||
{
|
||||
rt_kprintf("[%s] SPCR=0x%x, SPSR=0x%x, SPER=0x%x, SFC_PARAM=0x%x, SFC_SOFTCS=0x%x, SFC_TIMING=0x%x\r\n",
|
||||
printf("[%s] SPCR=0x%x, SPSR=0x%x, SPER=0x%x, SFC_PARAM=0x%x, SFC_SOFTCS=0x%x, SFC_TIMING=0x%x\r\n",
|
||||
__FUNCTION__,
|
||||
reg_read_8(spi_base + LS1C_SPI_SPCR_OFFSET),
|
||||
reg_read_8(spi_base + LS1C_SPI_SPSR_OFFSET),
|
||||
@@ -137,7 +122,7 @@ unsigned int ls1c_spi_get_div(unsigned int max_speed_hz)
|
||||
break;
|
||||
}
|
||||
/*
|
||||
rt_kprintf("[%s] clk=%ld, max_speed_hz=%d, div_tmp=%d, bit=%d\r\n",
|
||||
printf("[%s] clk=%ld, max_speed_hz=%d, div_tmp=%d, bit=%d\r\n",
|
||||
__FUNCTION__, clk, max_speed_hz, div_tmp, bit);
|
||||
*/
|
||||
return div_tmp;
|
||||
@@ -229,7 +214,7 @@ void ls1c_spi_set_cs(void *spi_base, unsigned char cs, int new_status)
|
||||
* 等待收发完成
|
||||
* @spi_base 基地址
|
||||
*/
|
||||
inline void ls1c_spi_wait_txrx_done(void *spi_base)
|
||||
void ls1c_spi_wait_txrx_done(void *spi_base)
|
||||
{
|
||||
int timeout = LS1C_SPI_TX_TIMEOUT;
|
||||
|
||||
@@ -247,7 +232,7 @@ inline void ls1c_spi_wait_txrx_done(void *spi_base)
|
||||
* 清中断和标志位
|
||||
* @spi_base 基地址
|
||||
*/
|
||||
inline void ls1c_spi_clear(void *spi_base)
|
||||
void ls1c_spi_clear(void *spi_base)
|
||||
{
|
||||
unsigned char val = 0;
|
||||
|
||||
@@ -260,7 +245,7 @@ inline void ls1c_spi_clear(void *spi_base)
|
||||
val = reg_read_8(spi_base + LS1C_SPI_SPSR_OFFSET);
|
||||
if (LS1C_SPI_SPSR_WCOL_MASK & val)
|
||||
{
|
||||
rt_kprintf("[%s] clear register SPSR's wcol!\r\n",__FUNCTION__); // 手册和linux源码中不一样,加个打印看看
|
||||
printf("[%s] clear register SPSR's wcol!\r\n"); // 手册和linux源码中不一样,加个打印看看
|
||||
reg_write_8(val & ~LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写0,linux源码中是写0
|
||||
// reg_write_8(val | LS1C_SPI_SPSR_WCOL_MASK, spi_base + LS1C_SPI_SPSR_OFFSET); // 写1,按照1c手册,应该写1
|
||||
}
|
||||
|
||||
@@ -1,61 +1,47 @@
|
||||
/*
|
||||
* File : ls1c_spi.h
|
||||
* This file is part of RT-Thread RTOS
|
||||
* COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2017-10-23 勤为本 first version
|
||||
* 2017-10-23 勤为本 first version
|
||||
*/
|
||||
|
||||
// 硬件spi接口的头文件
|
||||
// 硬件spi接口的头文件
|
||||
|
||||
#ifndef __OPENLOONGSON_SPI_H
|
||||
#define __OPENLOONGSON_SPI_H
|
||||
|
||||
|
||||
// SPI模块编号
|
||||
// SPI模块编号
|
||||
#define LS1C_SPI_0 (0)
|
||||
#define LS1C_SPI_1 (1)
|
||||
|
||||
// 片选
|
||||
// 片选
|
||||
#define LS1C_SPI_CS_0 (0)
|
||||
#define LS1C_SPI_CS_1 (1)
|
||||
#define LS1C_SPI_CS_2 (2)
|
||||
#define LS1C_SPI_CS_3 (3)
|
||||
|
||||
// 时钟极性和相位
|
||||
// 时钟极性和相位
|
||||
#define SPI_CPOL_1 (1)
|
||||
#define SPI_CPOL_0 (0)
|
||||
#define SPI_CPHA_1 (1)
|
||||
#define SPI_CPHA_0 (0)
|
||||
|
||||
|
||||
// 寄存器偏移
|
||||
#define LS1C_SPI_SPCR_OFFSET (0) // 控制寄存器
|
||||
#define LS1C_SPI_SPSR_OFFSET (1) // 状态寄存器
|
||||
#define LS1C_SPI_TxFIFO_OFFSET (2) // 发送的数据寄存器,与接收数据寄存器的偏移相同
|
||||
#define LS1C_SPI_RxFIFO_OFFSET (2) // 接收的数据寄存器,与发送数据寄存器的偏移相同
|
||||
#define LS1C_SPI_SPER_OFFSET (3) // 外部寄存器
|
||||
#define LS1C_SPI_SFC_PARAM_OFFSET (4) // 参数控制寄存器
|
||||
#define LS1C_SPI_SFC_SOFTCS_OFFSET (5) // 片选控制寄存器
|
||||
#define LS1C_SPI_SFC_TIMING_OFFSET (6) // 时序控制寄存器
|
||||
// 寄存器偏移
|
||||
#define LS1C_SPI_SPCR_OFFSET (0) // 控制寄存器
|
||||
#define LS1C_SPI_SPSR_OFFSET (1) // 状态寄存器
|
||||
#define LS1C_SPI_TxFIFO_OFFSET (2) // 发送的数据寄存器,与接收数据寄存器的偏移相同
|
||||
#define LS1C_SPI_RxFIFO_OFFSET (2) // 接收的数据寄存器,与发送数据寄存器的偏移相同
|
||||
#define LS1C_SPI_SPER_OFFSET (3) // 外部寄存器
|
||||
#define LS1C_SPI_SFC_PARAM_OFFSET (4) // 参数控制寄存器
|
||||
#define LS1C_SPI_SFC_SOFTCS_OFFSET (5) // 片选控制寄存器
|
||||
#define LS1C_SPI_SFC_TIMING_OFFSET (6) // 时序控制寄存器
|
||||
|
||||
// 寄存器SPCR中的位域
|
||||
// 寄存器SPCR中的位域
|
||||
#define LS1C_SPI_SPCR_SPIE_BIT (7)
|
||||
#define LS1C_SPI_SPCR_SPIE_MASK (0x01 << LS1C_SPI_SPCR_SPIE_BIT)
|
||||
#define LS1C_SPI_SPCR_SPE_BIT (6)
|
||||
@@ -67,75 +53,75 @@
|
||||
#define LS1C_SPI_SPCR_SPR_BIT (0)
|
||||
#define LS1C_SPI_SPCR_SPR_MASK (0x03 << LS1C_SPI_SPCR_SPR_BIT)
|
||||
|
||||
// 寄存器SPSR中的位域
|
||||
// 寄存器SPSR中的位域
|
||||
#define LS1C_SPI_SPSR_SPIF_BIT (7)
|
||||
#define LS1C_SPI_SPSR_SPIF_MASK (0x01 << LS1C_SPI_SPSR_SPIF_BIT)
|
||||
#define LS1C_SPI_SPSR_WCOL_BIT (6)
|
||||
#define LS1C_SPI_SPSR_WCOL_MASK (0x01 << LS1C_SPI_SPSR_WCOL_BIT)
|
||||
|
||||
// 寄存器SPER中的位域
|
||||
// 寄存器SPER中的位域
|
||||
#define LS1C_SPI_SPER_SPRE_BIT (0)
|
||||
#define LS1C_SPI_SPER_SPRE_MASK (0x3 << LS1C_SPI_SPER_SPRE_BIT)
|
||||
|
||||
// 寄存器SFC_SOFTCS的位域
|
||||
// 寄存器SFC_SOFTCS的位域
|
||||
#define LS1C_SPI_SFC_SOFTCS_CSN_BIT (4)
|
||||
#define LS1C_SPI_SFC_SOFTCS_CSN_MASK (0x0f << LS1C_SPI_SFC_SOFTCS_CSN_BIT)
|
||||
#define LS1C_SPI_SFC_SOFTCS_CSEN_BIT (0)
|
||||
#define LS1C_SPI_SFC_SOFTCS_CSEN_MASK (0x0f << LS1C_SPI_SFC_SOFTCS_CSEN_BIT)
|
||||
|
||||
// 发送超时的门限值
|
||||
// 发送超时的门限值
|
||||
#define LS1C_SPI_TX_TIMEOUT (20000)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 获取指定SPI模块的基地址
|
||||
* @SPIx SPI模块的编号
|
||||
* 获取指定SPI模块的基地址
|
||||
* @SPIx SPI模块的编号
|
||||
*/
|
||||
inline void *ls1c_spi_get_base(unsigned char SPIx);
|
||||
void *ls1c_spi_get_base(unsigned char SPIx);
|
||||
|
||||
|
||||
/*
|
||||
* 设置时钟
|
||||
* @spi_base 基地址
|
||||
* @max_hz 最大频率,单位hz
|
||||
* 设置时钟
|
||||
* @spi_base 基地址
|
||||
* @max_hz 最大频率,单位hz
|
||||
*/
|
||||
void ls1c_spi_set_clock(void *spi_base, unsigned long max_hz);
|
||||
|
||||
|
||||
/*
|
||||
* 设置通信模式(时钟极性和相位)
|
||||
* @spi_base 基地址
|
||||
* @cpol 时钟极性
|
||||
* @cpha 时钟相位
|
||||
* 设置通信模式(时钟极性和相位)
|
||||
* @spi_base 基地址
|
||||
* @cpol 时钟极性
|
||||
* @cpha 时钟相位
|
||||
*/
|
||||
void ls1c_spi_set_mode(void *spi_base, unsigned char cpol, unsigned char cpha);
|
||||
|
||||
|
||||
/*
|
||||
* 设置指定片选为指定状态
|
||||
* @spi_base 基地址
|
||||
* @cs 片选
|
||||
* @new_status 片选引脚的新状态,取值为0或1,即高电平或低电平
|
||||
* 设置指定片选为指定状态
|
||||
* @spi_base 基地址
|
||||
* @cs 片选
|
||||
* @new_status 片选引脚的新状态,取值为0或1,即高电平或低电平
|
||||
*/
|
||||
void ls1c_spi_set_cs(void *spi_base, unsigned char cs, int new_status);
|
||||
|
||||
|
||||
/*
|
||||
* 通过指定SPI发送接收一个字节
|
||||
* 注意,在多任务的系统中,此函数需要互斥。
|
||||
* 即保证在和某个从设备收发某个字节的过程中,不能被切换到其它任务同时与另外的在同一个SPI总线上的从设备通信
|
||||
* 因为龙芯1c的每路SPI上可能接有不同的从设备,通信频率、模式等可能不同
|
||||
* @spi_base 基地址
|
||||
* @tx_ch 待发送的数据
|
||||
* @ret 收到的数据
|
||||
* 通过指定SPI发送接收一个字节
|
||||
* 注意,在多任务的系统中,此函数需要互斥。
|
||||
* 即保证在和某个从设备收发某个字节的过程中,不能被切换到其它任务同时与另外的在同一个SPI总线上的从设备通信
|
||||
* 因为龙芯1c的每路SPI上可能接有不同的从设备,通信频率、模式等可能不同
|
||||
* @spi_base 基地址
|
||||
* @tx_ch 待发送的数据
|
||||
* @ret 收到的数据
|
||||
*/
|
||||
unsigned char ls1c_spi_txrx_byte(void *spi_base, unsigned char tx_ch);
|
||||
|
||||
|
||||
/*
|
||||
* 打印指定SPI模块的所有寄存器的值
|
||||
* @spi_base 基地址
|
||||
* 打印指定SPI模块的所有寄存器的值
|
||||
* @spi_base 基地址
|
||||
*/
|
||||
void ls1c_spi_print_all_regs_info(void *spi_base);
|
||||
|
||||
|
||||
@@ -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 ;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* first version
|
||||
*/
|
||||
// 硬件定时器头文件
|
||||
|
||||
|
||||
@@ -22,18 +31,16 @@ typedef enum
|
||||
typedef struct
|
||||
{
|
||||
ls1c_timer_t timer; // 硬件定时器
|
||||
unsigned long time_ns; // 定时时间
|
||||
unsigned long time_ns; // 低定时时间
|
||||
unsigned long time_h_ns; // 高定时时间
|
||||
}timer_info_t;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 初始化定时器,并开始定时
|
||||
* @timer_info 定时器和定时时间信息
|
||||
*/
|
||||
void timer_init(timer_info_t *timer_info);
|
||||
|
||||
|
||||
/*
|
||||
* 判断指定定时器是否超时
|
||||
* @timer_info 定时器
|
||||
@@ -41,15 +48,12 @@ void timer_init(timer_info_t *timer_info);
|
||||
*/
|
||||
BOOL timer_is_time_out(timer_info_t *timer_info);
|
||||
|
||||
|
||||
/*
|
||||
* 停止定时器
|
||||
* @timer_info 定时器
|
||||
*/
|
||||
void timer_stop(timer_info_t *timer_info);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 获取定时器从初始化到现在的时间(实现计时功能),单位ns
|
||||
* @timer_info 硬件定时器
|
||||
@@ -57,13 +61,29 @@ void timer_stop(timer_info_t *timer_info);
|
||||
*/
|
||||
unsigned long timer_get_time_ns(timer_info_t *timer_info);
|
||||
|
||||
|
||||
/*
|
||||
* 打印timer相关寄存器的值
|
||||
* @timer_info 硬件定时器
|
||||
*/
|
||||
void timer_print_regs(timer_info_t *timer_info);
|
||||
|
||||
/*
|
||||
* 定时器中断清
|
||||
* @timer_info 定时器信息
|
||||
*/
|
||||
void timer_int_clr(timer_info_t *timer_info);
|
||||
|
||||
/*
|
||||
* 定时器计数清
|
||||
* @timer_info 定时器信息
|
||||
*/
|
||||
void timer_cnt_clr(timer_info_t *timer_info);
|
||||
|
||||
/*
|
||||
* 初始化定时器,并开始中断定时
|
||||
* @timer_info 定时器和定时时间信息
|
||||
* @hrc 高中断 lrc 低中断 为1打开,为0关闭
|
||||
*/
|
||||
void timer_int_init(timer_info_t *timer_info, int hrc, int lrc);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* first version
|
||||
*/
|
||||
// 串口相关源码
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* first version
|
||||
*/
|
||||
// 串口相关头文件
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user