mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-03-27 09:32:28 +08:00
[fh8620] auto formatted
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -27,18 +27,18 @@
|
||||
|
||||
void init_thread(void *parameter)
|
||||
{
|
||||
rt_components_init();
|
||||
rt_components_init();
|
||||
|
||||
return ;
|
||||
return ;
|
||||
}
|
||||
|
||||
int rt_application_init(void)
|
||||
{
|
||||
rt_thread_t tid;
|
||||
rt_thread_t tid;
|
||||
|
||||
tid = rt_thread_create("init", init_thread, RT_NULL,
|
||||
4096, RT_THREAD_PRIORITY_MAX/3, 20);
|
||||
if (tid) rt_thread_startup(tid);
|
||||
tid = rt_thread_create("init", init_thread, RT_NULL,
|
||||
4096, RT_THREAD_PRIORITY_MAX/3, 20);
|
||||
if (tid) rt_thread_startup(tid);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -30,12 +30,12 @@
|
||||
#include "dma.h"
|
||||
#ifdef RT_USING_FH_ACW
|
||||
#if 1
|
||||
typedef struct
|
||||
typedef struct
|
||||
{
|
||||
unsigned int base;
|
||||
void *vbase;
|
||||
unsigned int size;
|
||||
unsigned int align;
|
||||
unsigned int base;
|
||||
void *vbase;
|
||||
unsigned int size;
|
||||
unsigned int align;
|
||||
}MEM_DESC;
|
||||
#define ACW_SELFTEST 0
|
||||
int buffer_malloc_withname(MEM_DESC *mem, int size, int align, char* name);
|
||||
@@ -222,9 +222,9 @@ void fh_acw_stop_playback(struct fh_audio_cfg *audio_config)
|
||||
audio_config->playback.state = stopping;
|
||||
writel(0, audio_dev.reg_base + ACW_TXFIFO_CTRL);//tx fifo disable
|
||||
if(audio_config->plauback_trans->channel_number != ACW_PLY_DMA_CHAN)
|
||||
goto free_mem;
|
||||
goto free_mem;
|
||||
if(!audio_config->plauback_trans->first_lli)
|
||||
goto free_channel;
|
||||
goto free_channel;
|
||||
audio_config->playback_dma->ops->control(audio_config->playback_dma,RT_DEVICE_CTRL_DMA_CYCLIC_STOP,audio_config->plauback_trans);
|
||||
audio_config->playback_dma->ops->control(audio_config->playback_dma,RT_DEVICE_CTRL_DMA_CYCLIC_FREE,audio_config->plauback_trans);
|
||||
free_channel:
|
||||
@@ -259,9 +259,9 @@ void fh_acw_stop_capture(struct fh_audio_cfg *audio_config)
|
||||
|
||||
writel(0, audio_dev.reg_base + 8);//rx fifo disable
|
||||
if(audio_config->capture_trans->channel_number != ACW_CAP_DMA_CHAN)
|
||||
goto free_mem;
|
||||
goto free_mem;
|
||||
if(!audio_config->capture_trans->first_lli)
|
||||
goto free_channel;
|
||||
goto free_channel;
|
||||
audio_config->capture_dma->ops->control(audio_config->capture_dma,RT_DEVICE_CTRL_DMA_CYCLIC_STOP,audio_config->capture_trans);
|
||||
|
||||
audio_config->capture_dma->ops->control(audio_config->capture_dma,RT_DEVICE_CTRL_DMA_CYCLIC_FREE,audio_config->capture_trans);
|
||||
@@ -286,10 +286,10 @@ void switch_io_type(enum audio_type type, enum io_select io_type)
|
||||
{
|
||||
rt_kprintf("audio input changed to mic_in\n");
|
||||
writel( reg & (~(1<<1)),audio_dev.reg_base + ACW_ADC_PATH_CTRL);
|
||||
reg = readl(audio_dev.reg_base + ACW_ADC_PATH_CTRL);
|
||||
reg = reg & (~(1<<3));
|
||||
reg |=(0x1<<3);
|
||||
writel(reg, audio_dev.reg_base + ACW_ADC_PATH_CTRL);
|
||||
reg = readl(audio_dev.reg_base + ACW_ADC_PATH_CTRL);
|
||||
reg = reg & (~(1<<3));
|
||||
reg |=(0x1<<3);
|
||||
writel(reg, audio_dev.reg_base + ACW_ADC_PATH_CTRL);
|
||||
}
|
||||
else if (line_in == io_type)
|
||||
{
|
||||
@@ -397,7 +397,7 @@ void switch_input_volume(int volume)
|
||||
param = get_param_from_volume(volume);
|
||||
if (param < 0)
|
||||
{
|
||||
rt_kprintf("capture volume error\n");
|
||||
rt_kprintf("capture volume error\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -511,25 +511,25 @@ int register_tx_dma(struct fh_audio_cfg *audio_config)
|
||||
|
||||
if(playback_trans->channel_number == ACW_PLY_DMA_CHAN){
|
||||
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_PREPARE,playback_trans);
|
||||
if(ret){
|
||||
rt_kprintf("can't playback cyclic prepare \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_START,playback_trans);
|
||||
if(ret){
|
||||
rt_kprintf("can't playback cyclic start \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_PREPARE,playback_trans);
|
||||
if(ret){
|
||||
rt_kprintf("can't playback cyclic prepare \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_START,playback_trans);
|
||||
if(ret){
|
||||
rt_kprintf("can't playback cyclic start \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
return RT_ERROR;
|
||||
return RT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int register_rx_dma( struct fh_audio_cfg *audio_config)
|
||||
{
|
||||
int ret;
|
||||
int ret;
|
||||
struct dma_transfer *capture_slave;
|
||||
capture_slave = audio_config->capture_trans;
|
||||
struct rt_dma_device *rt_dma_dev;
|
||||
@@ -546,19 +546,19 @@ int register_rx_dma( struct fh_audio_cfg *audio_config)
|
||||
return RT_ERROR;
|
||||
}
|
||||
if(capture_slave->channel_number==ACW_CAP_DMA_CHAN){
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_PREPARE,capture_slave);
|
||||
if(ret){
|
||||
rt_kprintf("can't capture cyclic prepare \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_START,capture_slave);
|
||||
if(ret){
|
||||
rt_kprintf("can't capture cyclic start \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_PREPARE,capture_slave);
|
||||
if(ret){
|
||||
rt_kprintf("can't capture cyclic prepare \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_CYCLIC_START,capture_slave);
|
||||
if(ret){
|
||||
rt_kprintf("can't capture cyclic start \n");
|
||||
return RT_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
return RT_ERROR;
|
||||
return RT_ERROR;
|
||||
writel(0x11,audio_dev.reg_base + ACW_RXFIFO_CTRL);//clear rx fifo
|
||||
writel(0x30029,audio_dev.reg_base + ACW_RXFIFO_CTRL);/*enable rx fifo*/
|
||||
|
||||
@@ -614,13 +614,13 @@ int fh_acw_start_playback(struct fh_audio_cfg *audio_config)
|
||||
audio_config->playback.state = running;
|
||||
ret = audio_request_playback_channel(audio_config);
|
||||
if(ret){
|
||||
rt_kprintf("can't request playback channel\n");
|
||||
return ret;
|
||||
rt_kprintf("can't request playback channel\n");
|
||||
return ret;
|
||||
}
|
||||
ret = register_tx_dma(audio_config);
|
||||
if (ret < 0)
|
||||
{
|
||||
rt_kprintf("can't register tx dma\n");
|
||||
rt_kprintf("can't register tx dma\n");
|
||||
return ret;
|
||||
}
|
||||
rt_list_init(&(playback_wq.list));
|
||||
@@ -638,7 +638,7 @@ int fh_acw_start_playback(struct fh_audio_cfg *audio_config)
|
||||
|
||||
int fh_acw_start_capture(struct fh_audio_cfg *audio_config)
|
||||
{
|
||||
int ret;
|
||||
int ret;
|
||||
if(audio_config->capture.state == running)
|
||||
{
|
||||
return 0;
|
||||
@@ -654,8 +654,8 @@ int fh_acw_start_capture(struct fh_audio_cfg *audio_config)
|
||||
audio_config->capture.state = running;
|
||||
ret = audio_request_capture_channel(audio_config);
|
||||
if(ret){
|
||||
rt_kprintf("can't request capture channel \n");
|
||||
return ret;
|
||||
rt_kprintf("can't request capture channel \n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return register_rx_dma(audio_config);
|
||||
@@ -698,12 +698,12 @@ static void fh_acw_tx_dma_done(void *arg)
|
||||
audio_config->playback.hw_ptr = audio_config->playback.hw_ptr - audio_config->playback.size;
|
||||
}
|
||||
|
||||
int avail = avail_data_len(playback,audio_config);
|
||||
if (avail > audio_config->playback.cfg.period_bytes)
|
||||
{
|
||||
int avail = avail_data_len(playback,audio_config);
|
||||
if (avail > audio_config->playback.cfg.period_bytes)
|
||||
{
|
||||
|
||||
rt_sem_release(&audio_config->sem_playback);
|
||||
}
|
||||
rt_sem_release(&audio_config->sem_playback);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
@@ -719,12 +719,12 @@ int arg_config_support(struct fh_audio_cfg_arg * cfg)
|
||||
|
||||
ret = get_param_from_volume(cfg->volume);
|
||||
if (ret < 0) {
|
||||
rt_kprintf("invalid volume\n");
|
||||
rt_kprintf("invalid volume\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = get_factor_from_table(cfg->rate);
|
||||
if (ret < 0) {
|
||||
rt_kprintf("invalid rate\n");
|
||||
rt_kprintf("invalid rate\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
@@ -1084,7 +1084,7 @@ static void fh_audio_interrupt(int irq, void *param)
|
||||
void audio_prealloc_dma_buffer(int aiaotype,struct fh_audio_cfg *audio_config)
|
||||
{
|
||||
|
||||
if(aiaotype == mic_in || aiaotype == line_in){
|
||||
if(aiaotype == mic_in || aiaotype == line_in){
|
||||
audio_config->capture.area = (void *)fh_dma_mem_malloc(audio_config->capture.cfg.buffer_bytes \
|
||||
+ audio_config->capture.cfg.period_bytes);
|
||||
|
||||
@@ -1093,8 +1093,8 @@ void audio_prealloc_dma_buffer(int aiaotype,struct fh_audio_cfg *audio_config)
|
||||
rt_kprintf("no enough mem for capture buffer alloc\n");
|
||||
return ;
|
||||
}
|
||||
}
|
||||
if(aiaotype == speaker_out || aiaotype == line_out){
|
||||
}
|
||||
if(aiaotype == speaker_out || aiaotype == line_out){
|
||||
audio_config->playback.area = (void *)fh_dma_mem_malloc(audio_config->playback.cfg.buffer_bytes \
|
||||
+ audio_config->playback.cfg.period_bytes);
|
||||
|
||||
@@ -1169,9 +1169,9 @@ int audio_request_capture_channel(struct fh_audio_cfg *audio_config){
|
||||
rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_OPEN,dma_rx_transfer);
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_REQUEST_CHANNEL,dma_rx_transfer);
|
||||
if(ret){
|
||||
rt_kprintf("can't request capture channel\n");
|
||||
dma_rx_transfer->channel_number =0xff;
|
||||
return -ret;
|
||||
rt_kprintf("can't request capture channel\n");
|
||||
dma_rx_transfer->channel_number =0xff;
|
||||
return -ret;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1219,9 +1219,9 @@ int audio_request_playback_channel(struct fh_audio_cfg *audio_config)
|
||||
rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_OPEN,dma_tx_transfer);
|
||||
ret = rt_dma_dev->ops->control(rt_dma_dev,RT_DEVICE_CTRL_DMA_REQUEST_CHANNEL,dma_tx_transfer);
|
||||
if(ret){
|
||||
rt_kprintf("can't request playbak channel\n");
|
||||
dma_tx_transfer->channel_number = 0xff;
|
||||
return -ret;
|
||||
rt_kprintf("can't request playbak channel\n");
|
||||
dma_tx_transfer->channel_number = 0xff;
|
||||
return -ret;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -1320,7 +1320,7 @@ void fh_acw_test(){
|
||||
cfg.frame_bit = 16;
|
||||
|
||||
cfg.io_type = mic_in;
|
||||
|
||||
|
||||
cfg.period_size = BUFF_SIZE/8;
|
||||
cfg.rate = 8000;
|
||||
cfg.volume = 80;
|
||||
@@ -1344,18 +1344,18 @@ void fh_acw_test(){
|
||||
|
||||
ret = acw_dev->control(acw_dev,AC_AI_EN,&cfg);
|
||||
if(ret)
|
||||
acw_dev->control(acw_dev,AC_AI_DISABLE,&cfg);
|
||||
acw_dev->control(acw_dev,AC_AI_DISABLE,&cfg);
|
||||
cfg.io_type = line_out;
|
||||
acw_dev->control(acw_dev,AC_INIT_PLAYBACK_MEM,&cfg);
|
||||
ret = acw_dev->control(acw_dev,AC_AO_EN,&cfg);
|
||||
if(ret){
|
||||
acw_dev->control(acw_dev,AC_AO_DISABLE,&cfg);
|
||||
acw_dev->control(acw_dev,AC_AO_DISABLE,&cfg);
|
||||
// acw_dev->control(acw_dev,AC_SET_OUTPUT_MODE,&output);
|
||||
return ;
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
for(i=0;i<100;i++)
|
||||
for(i=0;i<100;i++)
|
||||
{
|
||||
|
||||
rx:
|
||||
@@ -1374,7 +1374,7 @@ tx:
|
||||
acw_dev->write(acw_dev,0,&rx_buff[0],1024*8);
|
||||
|
||||
}
|
||||
acw_dev->close(acw_dev);
|
||||
acw_dev->close(acw_dev);
|
||||
|
||||
}
|
||||
#ifdef RT_USING_FINSH
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ACW_H_
|
||||
#define ACW_H_
|
||||
#include <rtthread.h>
|
||||
@@ -37,86 +37,86 @@
|
||||
typedef unsigned long long dma_addr_t;
|
||||
struct scatterlist {
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
unsigned long sg_magic;
|
||||
unsigned long sg_magic;
|
||||
#endif
|
||||
unsigned long page_link;
|
||||
unsigned int offset;
|
||||
unsigned int length;
|
||||
dma_addr_t dma_address;
|
||||
unsigned long page_link;
|
||||
unsigned int offset;
|
||||
unsigned int length;
|
||||
dma_addr_t dma_address;
|
||||
#ifdef CONFIG_NEED_SG_DMA_LENGTH
|
||||
unsigned int dma_length;
|
||||
unsigned int dma_length;
|
||||
#endif
|
||||
};
|
||||
#define readl(a) (*(volatile rt_uint32_t *)(a))
|
||||
#define rkqueue_struct rt_workqueue
|
||||
#define work_struct rt_work
|
||||
#define INIT_WORK(work,func) rt_work_init(work,func,RT_NULL);
|
||||
#define queue_work rt_workqueue_dowork
|
||||
#define rkqueue_struct rt_workqueue
|
||||
#define work_struct rt_work
|
||||
#define INIT_WORK(work,func) rt_work_init(work,func,RT_NULL);
|
||||
#define queue_work rt_workqueue_dowork
|
||||
|
||||
|
||||
//timer
|
||||
#define timer_list rt_timer
|
||||
#define wait_queue_head_t struct rt_event
|
||||
#define init_waitqueue_head(event_t) rt_event_init(event_t, "audio_event", RT_IPC_FLAG_FIFO)
|
||||
#define timer_list rt_timer
|
||||
#define wait_queue_head_t struct rt_event
|
||||
#define init_waitqueue_head(event_t) rt_event_init(event_t, "audio_event", RT_IPC_FLAG_FIFO)
|
||||
typedef enum{
|
||||
AC_SR_8K = 8000,
|
||||
AC_SR_16K = 16000,
|
||||
AC_SR_32K = 32000,
|
||||
AC_SR_441K = 44100,
|
||||
AC_SR_48K = 48000,
|
||||
AC_SR_8K = 8000,
|
||||
AC_SR_16K = 16000,
|
||||
AC_SR_32K = 32000,
|
||||
AC_SR_441K = 44100,
|
||||
AC_SR_48K = 48000,
|
||||
} FH_AC_SAMPLE_RATE_E;
|
||||
|
||||
typedef enum{
|
||||
AC_BW_8 = 8,
|
||||
AC_BW_16 = 16,
|
||||
AC_BW_24 = 24,
|
||||
AC_BW_8 = 8,
|
||||
AC_BW_16 = 16,
|
||||
AC_BW_24 = 24,
|
||||
} FH_AC_BIT_WIDTH_E;
|
||||
|
||||
enum io_select{
|
||||
mic_in = 0,
|
||||
line_in = 1,
|
||||
speaker_out = 2,
|
||||
line_out = 3,
|
||||
mic_in = 0,
|
||||
line_in = 1,
|
||||
speaker_out = 2,
|
||||
line_out = 3,
|
||||
};
|
||||
|
||||
struct fh_audio_cfg_arg{
|
||||
enum io_select io_type;
|
||||
int volume;
|
||||
int rate;
|
||||
int frame_bit;
|
||||
int channels;
|
||||
int buffer_size;
|
||||
int period_size;
|
||||
enum io_select io_type;
|
||||
int volume;
|
||||
int rate;
|
||||
int frame_bit;
|
||||
int channels;
|
||||
int buffer_size;
|
||||
int period_size;
|
||||
};
|
||||
typedef struct{
|
||||
unsigned int len;
|
||||
unsigned char *data;
|
||||
unsigned int len;
|
||||
unsigned char *data;
|
||||
}FH_AC_FRAME_S;
|
||||
|
||||
typedef enum{
|
||||
FH_AC_MIC_IN = 0,
|
||||
FH_AC_LINE_IN = 1,
|
||||
FH_AC_SPK_OUT = 2,
|
||||
FH_AC_LINE_OUT = 3
|
||||
FH_AC_MIC_IN = 0,
|
||||
FH_AC_LINE_IN = 1,
|
||||
FH_AC_SPK_OUT = 2,
|
||||
FH_AC_LINE_OUT = 3
|
||||
}FH_AC_IO_TYPE_E;
|
||||
|
||||
|
||||
typedef struct {
|
||||
FH_AC_IO_TYPE_E io_type;
|
||||
FH_AC_SAMPLE_RATE_E sample_rate;
|
||||
FH_AC_BIT_WIDTH_E bit_width;
|
||||
unsigned int channels;
|
||||
unsigned int period_size;
|
||||
unsigned int volume;
|
||||
FH_AC_IO_TYPE_E io_type;
|
||||
FH_AC_SAMPLE_RATE_E sample_rate;
|
||||
FH_AC_BIT_WIDTH_E bit_width;
|
||||
unsigned int channels;
|
||||
unsigned int period_size;
|
||||
unsigned int volume;
|
||||
} FH_AC_CONFIG;
|
||||
|
||||
struct device_dma_parameters {
|
||||
/*
|
||||
* a low level driver may set these to teach IOMMU code about
|
||||
* sg limitations.
|
||||
*/
|
||||
unsigned int max_segment_size;
|
||||
unsigned long segment_boundary_mask;
|
||||
/*
|
||||
* a low level driver may set these to teach IOMMU code about
|
||||
* sg limitations.
|
||||
*/
|
||||
unsigned int max_segment_size;
|
||||
unsigned long segment_boundary_mask;
|
||||
};
|
||||
|
||||
struct list_head {
|
||||
@@ -124,32 +124,32 @@ struct list_head {
|
||||
struct list_head *prev;
|
||||
};
|
||||
struct dma_coherent_mem {
|
||||
void *virt_base;
|
||||
dma_addr_t device_base;
|
||||
int size;
|
||||
int flags;
|
||||
unsigned long *bitmap;
|
||||
void *virt_base;
|
||||
dma_addr_t device_base;
|
||||
int size;
|
||||
int flags;
|
||||
unsigned long *bitmap;
|
||||
};
|
||||
struct device_acw{
|
||||
unsigned long long *dma_mask; /* dma mask (if dma'able device) */
|
||||
unsigned long long coherent_dma_mask;/* Like dma_mask, but for
|
||||
alloc_coherent mappings as
|
||||
not all hardware supports
|
||||
64 bit addresses for consistent
|
||||
allocations such descriptors. */
|
||||
struct device_dma_parameters *dma_parms;
|
||||
unsigned long long *dma_mask; /* dma mask (if dma'able device) */
|
||||
unsigned long long coherent_dma_mask;/* Like dma_mask, but for
|
||||
alloc_coherent mappings as
|
||||
not all hardware supports
|
||||
64 bit addresses for consistent
|
||||
allocations such descriptors. */
|
||||
struct device_dma_parameters *dma_parms;
|
||||
|
||||
struct list_head dma_pools;
|
||||
struct list_head dma_pools;
|
||||
|
||||
struct dma_coherent_mem *dma_mem;
|
||||
struct dma_coherent_mem *dma_mem;
|
||||
};
|
||||
#define false 0
|
||||
#define true 1
|
||||
|
||||
|
||||
|
||||
#define AC_INIT_CAPTURE_MEM 0x10
|
||||
#define AC_INIT_PLAYBACK_MEM 0x11
|
||||
#define AC_INIT_CAPTURE_MEM 0x10
|
||||
#define AC_INIT_PLAYBACK_MEM 0x11
|
||||
|
||||
|
||||
#define AC_SET_VOL 0x12
|
||||
@@ -160,73 +160,73 @@ struct device_acw{
|
||||
#define AC_AI_EN 0x15
|
||||
#define AC_AO_EN 0x16
|
||||
#define AC_AI_DISABLE 0x17
|
||||
#define AC_AO_DISABLE 0x18
|
||||
#define AC_AI_PAUSE 0x19
|
||||
#define AC_AI_RESUME 0x1a
|
||||
#define AC_AO_PAUSE 0x1b
|
||||
#define AC_AO_RESUME 0x1c
|
||||
#define AC_MIC_BOOST 0x1d
|
||||
#define AC_AO_DISABLE 0x18
|
||||
#define AC_AI_PAUSE 0x19
|
||||
#define AC_AI_RESUME 0x1a
|
||||
#define AC_AO_PAUSE 0x1b
|
||||
#define AC_AO_RESUME 0x1c
|
||||
#define AC_MIC_BOOST 0x1d
|
||||
|
||||
#define POLLIN 0x001 /* There is data to read. */
|
||||
#define POLLPRI 0x002 /* There is urgent data to read. */
|
||||
#define POLLOUT 0x004 /* Writing now will not block. */
|
||||
#define POLLIN 0x001 /* There is data to read. */
|
||||
#define POLLPRI 0x002 /* There is urgent data to read. */
|
||||
#define POLLOUT 0x004 /* Writing now will not block. */
|
||||
|
||||
|
||||
/* These values are defined in XPG4.2. */
|
||||
# define POLLRDNORM 0x040 /* Normal data may be read. */
|
||||
# define POLLRDBAND 0x080 /* Priority data may be read. */
|
||||
# define POLLWRNORM 0x100 /* Writing now will not block. */
|
||||
# define POLLWRBAND 0x200 /* Priority data may be written. */
|
||||
# define POLLRDNORM 0x040 /* Normal data may be read. */
|
||||
# define POLLRDBAND 0x080 /* Priority data may be read. */
|
||||
# define POLLWRNORM 0x100 /* Writing now will not block. */
|
||||
# define POLLWRBAND 0x200 /* Priority data may be written. */
|
||||
|
||||
|
||||
|
||||
/* These are extensions for Linux. */
|
||||
# define POLLMSG 0x400
|
||||
# define POLLREMOVE 0x1000
|
||||
# define POLLRDHUP 0x2000
|
||||
# define POLLMSG 0x400
|
||||
# define POLLREMOVE 0x1000
|
||||
# define POLLRDHUP 0x2000
|
||||
|
||||
|
||||
/* Event types always implicitly polled for. These bits need not be set in
|
||||
`events', but they will appear in `revents' to indicate the status of
|
||||
the file descriptor. */
|
||||
#define POLLERR 0x008 /* Error condition. */
|
||||
#define POLLHUP 0x010 /* Hung up. */
|
||||
#define POLLNVAL 0x020 /* Invalid polling request. */
|
||||
#define POLLERR 0x008 /* Error condition. */
|
||||
#define POLLHUP 0x010 /* Hung up. */
|
||||
#define POLLNVAL 0x020 /* Invalid polling request. */
|
||||
|
||||
#define EPERM 1 /* Operation not permitted */
|
||||
#define ENOENT 2 /* No such file or directory */
|
||||
#define ESRCH 3 /* No such process */
|
||||
#define EINTR 4 /* Interrupted system call */
|
||||
#define EIO 5 /* I/O error */
|
||||
#define ENXIO 6 /* No such device or address */
|
||||
#define E2BIG 7 /* Argument list too long */
|
||||
#define ENOEXEC 8 /* Exec format error */
|
||||
#define EBADF 9 /* Bad file number */
|
||||
#define ECHILD 10 /* No child processes */
|
||||
#define EAGAIN 11 /* Try again */
|
||||
#define ENOMEM 12 /* Out of memory */
|
||||
#define EACCES 13 /* Permission denied */
|
||||
#define EFAULT 14 /* Bad address */
|
||||
#define ENOTBLK 15 /* Block device required */
|
||||
#define EBUSY 16 /* Device or resource busy */
|
||||
#define EEXIST 17 /* File exists */
|
||||
#define EXDEV 18 /* Cross-device link */
|
||||
#define ENODEV 19 /* No such device */
|
||||
#define ENOTDIR 20 /* Not a directory */
|
||||
#define EISDIR 21 /* Is a directory */
|
||||
#define EINVAL 22 /* Invalid argument */
|
||||
#define ENFILE 23 /* File table overflow */
|
||||
#define EMFILE 24 /* Too many open files */
|
||||
#define ENOTTY 25 /* Not a typewriter */
|
||||
#define ETXTBSY 26 /* Text file busy */
|
||||
#define EFBIG 27 /* File too large */
|
||||
#define ENOSPC 28 /* No space left on device */
|
||||
#define ESPIPE 29 /* Illegal seek */
|
||||
#define EROFS 30 /* Read-only file system */
|
||||
#define EMLINK 31 /* Too many links */
|
||||
#define EPIPE 32 /* Broken pipe */
|
||||
#define EDOM 33 /* Math argument out of domain of func */
|
||||
#define ERANGE 34 /* Math result not representable */
|
||||
#define EPERM 1 /* Operation not permitted */
|
||||
#define ENOENT 2 /* No such file or directory */
|
||||
#define ESRCH 3 /* No such process */
|
||||
#define EINTR 4 /* Interrupted system call */
|
||||
#define EIO 5 /* I/O error */
|
||||
#define ENXIO 6 /* No such device or address */
|
||||
#define E2BIG 7 /* Argument list too long */
|
||||
#define ENOEXEC 8 /* Exec format error */
|
||||
#define EBADF 9 /* Bad file number */
|
||||
#define ECHILD 10 /* No child processes */
|
||||
#define EAGAIN 11 /* Try again */
|
||||
#define ENOMEM 12 /* Out of memory */
|
||||
#define EACCES 13 /* Permission denied */
|
||||
#define EFAULT 14 /* Bad address */
|
||||
#define ENOTBLK 15 /* Block device required */
|
||||
#define EBUSY 16 /* Device or resource busy */
|
||||
#define EEXIST 17 /* File exists */
|
||||
#define EXDEV 18 /* Cross-device link */
|
||||
#define ENODEV 19 /* No such device */
|
||||
#define ENOTDIR 20 /* Not a directory */
|
||||
#define EISDIR 21 /* Is a directory */
|
||||
#define EINVAL 22 /* Invalid argument */
|
||||
#define ENFILE 23 /* File table overflow */
|
||||
#define EMFILE 24 /* Too many open files */
|
||||
#define ENOTTY 25 /* Not a typewriter */
|
||||
#define ETXTBSY 26 /* Text file busy */
|
||||
#define EFBIG 27 /* File too large */
|
||||
#define ENOSPC 28 /* No space left on device */
|
||||
#define ESPIPE 29 /* Illegal seek */
|
||||
#define EROFS 30 /* Read-only file system */
|
||||
#define EMLINK 31 /* Too many links */
|
||||
#define EPIPE 32 /* Broken pipe */
|
||||
#define EDOM 33 /* Math argument out of domain of func */
|
||||
#define ERANGE 34 /* Math result not representable */
|
||||
extern void fh_audio_init(void);
|
||||
extern void fh_acw_test();
|
||||
#endif
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Include Section
|
||||
* add all #include here
|
||||
@@ -88,7 +88,7 @@ static rt_err_t rt_dma_control(struct rt_device *dev,
|
||||
*****************************************************************************/
|
||||
static rt_err_t rt_dma_init(struct rt_device *dev)
|
||||
{
|
||||
struct rt_dma_device *dma;
|
||||
struct rt_dma_device *dma;
|
||||
|
||||
RT_ASSERT(dev != RT_NULL);
|
||||
dma = (struct rt_dma_device *)dev;
|
||||
@@ -107,7 +107,7 @@ static rt_err_t rt_dma_open(struct rt_device *dev, rt_uint16_t oflag)
|
||||
|
||||
static rt_err_t rt_dma_close(struct rt_device *dev)
|
||||
{
|
||||
struct rt_dma_device *dma;
|
||||
struct rt_dma_device *dma;
|
||||
|
||||
RT_ASSERT(dev != RT_NULL);
|
||||
dma = (struct rt_dma_device *)dev;
|
||||
@@ -124,7 +124,7 @@ static rt_err_t rt_dma_control(struct rt_device *dev,
|
||||
rt_uint8_t cmd,
|
||||
void *args)
|
||||
{
|
||||
struct rt_dma_device *dma;
|
||||
struct rt_dma_device *dma;
|
||||
|
||||
RT_ASSERT(dev != RT_NULL);
|
||||
dma = (struct rt_dma_device *)dev;
|
||||
@@ -141,7 +141,7 @@ rt_err_t rt_hw_dma_register(struct rt_dma_device *dma,
|
||||
rt_uint32_t flag,
|
||||
void *data)
|
||||
{
|
||||
rt_uint32_t ret;
|
||||
rt_uint32_t ret;
|
||||
struct rt_device *device;
|
||||
RT_ASSERT(dma != RT_NULL);
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -29,31 +29,31 @@
|
||||
#include <rtthread.h>
|
||||
/****************************************************************************
|
||||
* #include section
|
||||
* add #include here if any
|
||||
* add #include here if any
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* #define section
|
||||
* add constant #define here if any
|
||||
* add constant #define here if any
|
||||
***************************************************************************/
|
||||
#define RT_DEVICE_CTRL_DMA_OPEN (1)
|
||||
#define RT_DEVICE_CTRL_DMA_CLOSE (2)
|
||||
#define RT_DEVICE_CTRL_DMA_REQUEST_CHANNEL (3)
|
||||
#define RT_DEVICE_CTRL_DMA_RELEASE_CHANNEL (4)
|
||||
#define RT_DEVICE_CTRL_DMA_SINGLE_TRANSFER (5)
|
||||
#define RT_DEVICE_CTRL_DMA_OPEN (1)
|
||||
#define RT_DEVICE_CTRL_DMA_CLOSE (2)
|
||||
#define RT_DEVICE_CTRL_DMA_REQUEST_CHANNEL (3)
|
||||
#define RT_DEVICE_CTRL_DMA_RELEASE_CHANNEL (4)
|
||||
#define RT_DEVICE_CTRL_DMA_SINGLE_TRANSFER (5)
|
||||
|
||||
|
||||
//cyclic add func below....
|
||||
|
||||
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_PREPARE (6)
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_START (7)
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_STOP (8)
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_FREE (9)
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_PREPARE (6)
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_START (7)
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_STOP (8)
|
||||
#define RT_DEVICE_CTRL_DMA_CYCLIC_FREE (9)
|
||||
|
||||
|
||||
//#define RT_DEVICE_CTRL_ (3) /* get the left time before reboot(in seconds) */
|
||||
//#define RT_DEVICE_CTRL_ (3) /* get the left time before reboot(in seconds) */
|
||||
//#define RT_DEVICE_CTRL_ (4) /* refresh watchdog */
|
||||
//#define RT_DEVICE_CTRL_ (5) /* start watchdog */
|
||||
//#define RT_DEVICE_CTRL_ (6) /* stop watchdog */
|
||||
@@ -64,13 +64,13 @@
|
||||
|
||||
/****************************************************************************
|
||||
* ADT section
|
||||
* add Abstract Data Type definition here
|
||||
* add Abstract Data Type definition here
|
||||
***************************************************************************/
|
||||
|
||||
struct rt_dma_ops;
|
||||
struct rt_dma_device
|
||||
{
|
||||
// the parent must be the fitst para..
|
||||
// the parent must be the fitst para..
|
||||
struct rt_device parent;
|
||||
struct rt_dma_ops *ops;
|
||||
};
|
||||
@@ -91,7 +91,7 @@ struct rt_dma_ops
|
||||
|
||||
/****************************************************************************
|
||||
* section
|
||||
* add function prototype here if any
|
||||
* add function prototype here if any
|
||||
***************************************************************************/
|
||||
rt_err_t rt_hw_dma_register(struct rt_dma_device *dma,
|
||||
const char *name,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Include Section
|
||||
* add all #include here
|
||||
@@ -86,27 +86,27 @@ static struct rt_memheap dma_heap = {0};
|
||||
* what does this function returned?
|
||||
*****************************************************************************/
|
||||
rt_err_t fh_dma_mem_init(rt_uint32_t *mem_start,rt_uint32_t size){
|
||||
return rt_memheap_init(&dma_heap,"dma_heap",mem_start,size);
|
||||
return rt_memheap_init(&dma_heap,"dma_heap",mem_start,size);
|
||||
}
|
||||
|
||||
|
||||
void *fh_dma_mem_malloc(rt_uint32_t size){
|
||||
return rt_memheap_alloc(&dma_heap, size);
|
||||
return rt_memheap_alloc(&dma_heap, size);
|
||||
}
|
||||
|
||||
|
||||
void fh_dma_mem_free(void *ptr){
|
||||
rt_memheap_free(ptr);
|
||||
rt_memheap_free(ptr);
|
||||
}
|
||||
|
||||
#ifdef FH_TEST_DMA_MEM
|
||||
int dma_mem_debug(void *ptr){
|
||||
//rt_memheap_free(ptr);
|
||||
rt_kprintf("dma mem start 0x%08x\n",(rt_uint32_t)dma_heap.start_addr);
|
||||
rt_kprintf("dma mem total size 0x%08x\n",dma_heap.pool_size);
|
||||
rt_kprintf("dma mem left size 0x%08x\n",dma_heap.available_size);
|
||||
rt_kprintf("dma mem max use size 0x%08x\n",dma_heap.max_used_size);
|
||||
return 0;
|
||||
//rt_memheap_free(ptr);
|
||||
rt_kprintf("dma mem start 0x%08x\n",(rt_uint32_t)dma_heap.start_addr);
|
||||
rt_kprintf("dma mem total size 0x%08x\n",dma_heap.pool_size);
|
||||
rt_kprintf("dma mem left size 0x%08x\n",dma_heap.available_size);
|
||||
rt_kprintf("dma mem max use size 0x%08x\n",dma_heap.max_used_size);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef DMA_MEM_H_
|
||||
#define DMA_MEM_H_
|
||||
|
||||
@@ -36,20 +36,20 @@
|
||||
#include <rtthread.h>
|
||||
/****************************************************************************
|
||||
* #include section
|
||||
* add #include here if any
|
||||
* add #include here if any
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* #define section
|
||||
* add constant #define here if any
|
||||
* add constant #define here if any
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* ADT section
|
||||
* add Abstract Data Type definition here
|
||||
* add Abstract Data Type definition here
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
/****************************************************************************
|
||||
* section
|
||||
* add function prototype here if any
|
||||
* add function prototype here if any
|
||||
***************************************************************************/
|
||||
#ifdef RT_USING_DMA_MEM
|
||||
rt_err_t fh_dma_mem_init(rt_uint32_t *mem_start,rt_uint32_t size);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,19 +18,19 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FH_DMA_H_
|
||||
#define FH_DMA_H_
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* #include section
|
||||
* add #include here if any
|
||||
* add #include here if any
|
||||
***************************************************************************/
|
||||
|
||||
#include <rtthread.h>
|
||||
@@ -43,24 +43,24 @@
|
||||
*********************************/
|
||||
|
||||
|
||||
#define FH81_MAX_CHANNEL (4)
|
||||
#define FH81_CHANNEL_MAX_TRANSFER_SIZE (4095)
|
||||
#define FH81_MAX_CHANNEL (4)
|
||||
#define FH81_CHANNEL_MAX_TRANSFER_SIZE (4095)
|
||||
|
||||
|
||||
|
||||
|
||||
enum DMA_HW_HS_MAP{
|
||||
ACODEC_RX = 0,
|
||||
ACODEC_TX,
|
||||
SPI0_RX,
|
||||
SPI0_TX,
|
||||
SPI1_RX,
|
||||
SPI1_TX,
|
||||
UART0_RX,
|
||||
UART0_TX,
|
||||
UART1_RX,
|
||||
UART1_TX,
|
||||
DMA_HW_HS_END,
|
||||
ACODEC_RX = 0,
|
||||
ACODEC_TX,
|
||||
SPI0_RX,
|
||||
SPI0_TX,
|
||||
SPI1_RX,
|
||||
SPI1_TX,
|
||||
UART0_RX,
|
||||
UART0_TX,
|
||||
UART1_RX,
|
||||
UART1_TX,
|
||||
DMA_HW_HS_END,
|
||||
};
|
||||
|
||||
/*********************************
|
||||
@@ -76,7 +76,7 @@ typedef void (*user_prepare)(void *prepare_para);
|
||||
|
||||
|
||||
|
||||
/**************************** i'm cut-off line ************************************/
|
||||
/**************************** i'm cut-off line ************************************/
|
||||
|
||||
|
||||
|
||||
@@ -88,128 +88,128 @@ struct fh81_dma;
|
||||
|
||||
|
||||
struct dw_lli {
|
||||
/* values that are not changed by hardware */
|
||||
rt_uint32_t sar;
|
||||
rt_uint32_t dar;
|
||||
rt_uint32_t llp; /* chain to next lli */
|
||||
rt_uint32_t ctllo;
|
||||
/* values that may get written back: */
|
||||
rt_uint32_t ctlhi;
|
||||
/* sstat and dstat can snapshot peripheral register state.
|
||||
* silicon config may discard either or both...
|
||||
*/
|
||||
rt_uint32_t sstat;
|
||||
rt_uint32_t dstat;
|
||||
rt_uint32_t reserve;
|
||||
/* values that are not changed by hardware */
|
||||
rt_uint32_t sar;
|
||||
rt_uint32_t dar;
|
||||
rt_uint32_t llp; /* chain to next lli */
|
||||
rt_uint32_t ctllo;
|
||||
/* values that may get written back: */
|
||||
rt_uint32_t ctlhi;
|
||||
/* sstat and dstat can snapshot peripheral register state.
|
||||
* silicon config may discard either or both...
|
||||
*/
|
||||
rt_uint32_t sstat;
|
||||
rt_uint32_t dstat;
|
||||
rt_uint32_t reserve;
|
||||
|
||||
};
|
||||
|
||||
//transfer use below
|
||||
struct dma_transfer{
|
||||
//this is private for the dma drive....app don't touch it,the driver will manger it
|
||||
//link interface for more transfer to the controller...
|
||||
rt_list_t transfer_list;
|
||||
struct fh81_dma *dma_controller;
|
||||
//this the mem add....the dma controller will load the setting to move data ....
|
||||
//user don't touch it
|
||||
struct dw_lli *first_lli;
|
||||
rt_uint32_t lli_size;
|
||||
//new add for allign get desc...
|
||||
rt_uint32_t actual_lli_size;
|
||||
//this is private for the dma drive....app don't touch it,the driver will manger it
|
||||
//link interface for more transfer to the controller...
|
||||
rt_list_t transfer_list;
|
||||
struct fh81_dma *dma_controller;
|
||||
//this the mem add....the dma controller will load the setting to move data ....
|
||||
//user don't touch it
|
||||
struct dw_lli *first_lli;
|
||||
rt_uint32_t lli_size;
|
||||
//new add for allign get desc...
|
||||
rt_uint32_t actual_lli_size;
|
||||
|
||||
|
||||
//user could set paras below~~~
|
||||
#define AUTO_FIND_CHANNEL (0xff)
|
||||
//transfer with which dma channel...if the data is 0xff, the driver will auto find a free channel.
|
||||
rt_uint32_t channel_number;
|
||||
//which dma you want to use...for fh81....only 0!!!
|
||||
rt_uint32_t dma_number;
|
||||
//user could set paras below~~~
|
||||
#define AUTO_FIND_CHANNEL (0xff)
|
||||
//transfer with which dma channel...if the data is 0xff, the driver will auto find a free channel.
|
||||
rt_uint32_t channel_number;
|
||||
//which dma you want to use...for fh81....only 0!!!
|
||||
rt_uint32_t dma_number;
|
||||
|
||||
|
||||
//user should set the para below
|
||||
#define DMA_M2M (0) // MEM <=> MEM
|
||||
#define DMA_M2P (1) // MEM => peripheral A
|
||||
#define DMA_P2M (2) // MEM <= peripheral A
|
||||
#define DMA_P2P (3) // peripheral A <=> peripheral B
|
||||
rt_uint32_t fc_mode;//ip->mem. mem->mem. mem->ip
|
||||
//user should set the para below
|
||||
#define DMA_M2M (0) // MEM <=> MEM
|
||||
#define DMA_M2P (1) // MEM => peripheral A
|
||||
#define DMA_P2M (2) // MEM <= peripheral A
|
||||
#define DMA_P2P (3) // peripheral A <=> peripheral B
|
||||
rt_uint32_t fc_mode;//ip->mem. mem->mem. mem->ip
|
||||
|
||||
|
||||
|
||||
|
||||
#define DMA_HW_HANDSHAKING (0)
|
||||
#define DMA_SW_HANDSHAKING (1)
|
||||
rt_uint32_t src_hs; //src
|
||||
//if use hw handshaking ,you need to set the hw handshaking number, this SOC defined
|
||||
rt_uint32_t src_per; //src hw handshake number
|
||||
//rt_uint32_t irq_mode;//for each transfer,irq maybe not same. suggest for the default(transfer isr)
|
||||
#define DMA_HW_HANDSHAKING (0)
|
||||
#define DMA_SW_HANDSHAKING (1)
|
||||
rt_uint32_t src_hs; //src
|
||||
//if use hw handshaking ,you need to set the hw handshaking number, this SOC defined
|
||||
rt_uint32_t src_per; //src hw handshake number
|
||||
//rt_uint32_t irq_mode;//for each transfer,irq maybe not same. suggest for the default(transfer isr)
|
||||
|
||||
#define DW_DMA_SLAVE_WIDTH_8BIT (0)
|
||||
#define DW_DMA_SLAVE_WIDTH_16BIT (1)
|
||||
#define DW_DMA_SLAVE_WIDTH_32BIT (2)
|
||||
rt_uint32_t src_width;
|
||||
#define DW_DMA_SLAVE_WIDTH_8BIT (0)
|
||||
#define DW_DMA_SLAVE_WIDTH_16BIT (1)
|
||||
#define DW_DMA_SLAVE_WIDTH_32BIT (2)
|
||||
rt_uint32_t src_width;
|
||||
|
||||
//the user should reference the hw handshaking watermark..
|
||||
#define DW_DMA_SLAVE_MSIZE_1 (0)
|
||||
#define DW_DMA_SLAVE_MSIZE_4 (1)
|
||||
#define DW_DMA_SLAVE_MSIZE_8 (2)
|
||||
#define DW_DMA_SLAVE_MSIZE_16 (3)
|
||||
#define DW_DMA_SLAVE_MSIZE_32 (4)
|
||||
#define DW_DMA_SLAVE_MSIZE_64 (5)
|
||||
#define DW_DMA_SLAVE_MSIZE_128 (6)
|
||||
#define DW_DMA_SLAVE_MSIZE_256 (7)
|
||||
rt_uint32_t src_msize;
|
||||
rt_uint32_t src_add;
|
||||
#define DW_DMA_SLAVE_INC (0)
|
||||
#define DW_DMA_SLAVE_DEC (1)
|
||||
#define DW_DMA_SLAVE_FIX (2)
|
||||
rt_uint32_t src_inc_mode; //increase mode: increase or not change
|
||||
//the user should reference the hw handshaking watermark..
|
||||
#define DW_DMA_SLAVE_MSIZE_1 (0)
|
||||
#define DW_DMA_SLAVE_MSIZE_4 (1)
|
||||
#define DW_DMA_SLAVE_MSIZE_8 (2)
|
||||
#define DW_DMA_SLAVE_MSIZE_16 (3)
|
||||
#define DW_DMA_SLAVE_MSIZE_32 (4)
|
||||
#define DW_DMA_SLAVE_MSIZE_64 (5)
|
||||
#define DW_DMA_SLAVE_MSIZE_128 (6)
|
||||
#define DW_DMA_SLAVE_MSIZE_256 (7)
|
||||
rt_uint32_t src_msize;
|
||||
rt_uint32_t src_add;
|
||||
#define DW_DMA_SLAVE_INC (0)
|
||||
#define DW_DMA_SLAVE_DEC (1)
|
||||
#define DW_DMA_SLAVE_FIX (2)
|
||||
rt_uint32_t src_inc_mode; //increase mode: increase or not change
|
||||
|
||||
|
||||
//#define DMA_DST_HW_HANDSHAKING (0)
|
||||
//#define DMA_DST_SW_HANDSHAKING (1)
|
||||
rt_uint32_t dst_hs; //src
|
||||
//if use hw handshaking ,you need to set the hw handshaking number, this SOC defined
|
||||
rt_uint32_t dst_per; //dst hw handshake number
|
||||
//#define DW_DMA_SLAVE_WIDTH_8BIT (0)
|
||||
//#define DW_DMA_SLAVE_WIDTH_16BIT (1)
|
||||
//#define DW_DMA_SLAVE_WIDTH_32BIT (2)
|
||||
rt_uint32_t dst_width;
|
||||
//#define DW_DMA_SLAVE_MSIZE_1 (0)
|
||||
//#define DW_DMA_SLAVE_MSIZE_4 (1)
|
||||
//#define DW_DMA_SLAVE_MSIZE_8 (2)
|
||||
//#define DW_DMA_SLAVE_MSIZE_16 (3)
|
||||
//#define DW_DMA_SLAVE_MSIZE_32 (4)
|
||||
//#define DW_DMA_SLAVE_MSIZE_64 (5)
|
||||
//#define DW_DMA_SLAVE_MSIZE_128 (6)
|
||||
//#define DW_DMA_SLAVE_MSIZE_256 (7)
|
||||
rt_uint32_t dst_msize;
|
||||
rt_uint32_t dst_add;
|
||||
//#define DW_DMA_SLAVE_INC (0)
|
||||
//#define DW_DMA_SLAVE_DEC (1)
|
||||
//#define DW_DMA_SLAVE_FIX (2)
|
||||
rt_uint32_t dst_inc_mode; //increase mode: increase or not change
|
||||
//#define DMA_DST_HW_HANDSHAKING (0)
|
||||
//#define DMA_DST_SW_HANDSHAKING (1)
|
||||
rt_uint32_t dst_hs; //src
|
||||
//if use hw handshaking ,you need to set the hw handshaking number, this SOC defined
|
||||
rt_uint32_t dst_per; //dst hw handshake number
|
||||
//#define DW_DMA_SLAVE_WIDTH_8BIT (0)
|
||||
//#define DW_DMA_SLAVE_WIDTH_16BIT (1)
|
||||
//#define DW_DMA_SLAVE_WIDTH_32BIT (2)
|
||||
rt_uint32_t dst_width;
|
||||
//#define DW_DMA_SLAVE_MSIZE_1 (0)
|
||||
//#define DW_DMA_SLAVE_MSIZE_4 (1)
|
||||
//#define DW_DMA_SLAVE_MSIZE_8 (2)
|
||||
//#define DW_DMA_SLAVE_MSIZE_16 (3)
|
||||
//#define DW_DMA_SLAVE_MSIZE_32 (4)
|
||||
//#define DW_DMA_SLAVE_MSIZE_64 (5)
|
||||
//#define DW_DMA_SLAVE_MSIZE_128 (6)
|
||||
//#define DW_DMA_SLAVE_MSIZE_256 (7)
|
||||
rt_uint32_t dst_msize;
|
||||
rt_uint32_t dst_add;
|
||||
//#define DW_DMA_SLAVE_INC (0)
|
||||
//#define DW_DMA_SLAVE_DEC (1)
|
||||
//#define DW_DMA_SLAVE_FIX (2)
|
||||
rt_uint32_t dst_inc_mode; //increase mode: increase or not change
|
||||
|
||||
|
||||
//total sizes, unit: src_width/DW_DMA_SLAVE_WIDTH_8BIT...
|
||||
//exg: src_width = DW_DMA_SLAVE_WIDTH_32BIT. trans_len = 2...means that: the dma will transfer 2*4 bytes..
|
||||
//exg: src_width = DW_DMA_SLAVE_WIDTH_8BIT. trans_len = 6...means that: the dma will transfer 1*6 bytes..
|
||||
rt_uint32_t trans_len;
|
||||
//total sizes, unit: src_width/DW_DMA_SLAVE_WIDTH_8BIT...
|
||||
//exg: src_width = DW_DMA_SLAVE_WIDTH_32BIT. trans_len = 2...means that: the dma will transfer 2*4 bytes..
|
||||
//exg: src_width = DW_DMA_SLAVE_WIDTH_8BIT. trans_len = 6...means that: the dma will transfer 1*6 bytes..
|
||||
rt_uint32_t trans_len;
|
||||
|
||||
|
||||
|
||||
//this is used when dma finish transfer job
|
||||
dma_complete_callback complete_callback;
|
||||
void *complete_para; //for the driver data use the dma driver.
|
||||
//this is used when dma finish transfer job
|
||||
dma_complete_callback complete_callback;
|
||||
void *complete_para; //for the driver data use the dma driver.
|
||||
|
||||
|
||||
//this is used when dma before work..the user maybe need to set his own private para..
|
||||
user_prepare prepare_callback;
|
||||
void *prepare_para;
|
||||
//this is used when dma before work..the user maybe need to set his own private para..
|
||||
user_prepare prepare_callback;
|
||||
void *prepare_para;
|
||||
|
||||
|
||||
//add cyclic para...
|
||||
//period len..
|
||||
rt_uint32_t period_len;
|
||||
//add cyclic para...
|
||||
//period len..
|
||||
rt_uint32_t period_len;
|
||||
|
||||
|
||||
};
|
||||
@@ -223,13 +223,13 @@ struct dma_transfer{
|
||||
|
||||
/****************************************************************************
|
||||
* #define section
|
||||
* add constant #define here if any
|
||||
* add constant #define here if any
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* ADT section
|
||||
* add Abstract Data Type definition here
|
||||
* add Abstract Data Type definition here
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ struct dma_transfer{
|
||||
|
||||
/****************************************************************************
|
||||
* section
|
||||
* add function prototype here if any
|
||||
* add function prototype here if any
|
||||
***************************************************************************/
|
||||
rt_err_t fh81_dma_register(struct fh81_dma * fh81_dma_p,
|
||||
char * dma_name);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -410,10 +410,10 @@ int fh_gpio_probe(void *priv_data)
|
||||
int i;
|
||||
|
||||
if(gpio_obj->id == 0){
|
||||
rt_hw_interrupt_install(gpio_obj->irq, fh_gpio_interrupt, (void *)gpio_obj, "gpio_0");
|
||||
rt_hw_interrupt_install(gpio_obj->irq, fh_gpio_interrupt, (void *)gpio_obj, "gpio_0");
|
||||
}
|
||||
else if(gpio_obj->id == 1){
|
||||
rt_hw_interrupt_install(gpio_obj->irq, fh_gpio_interrupt, (void *)gpio_obj, "gpio_1");
|
||||
rt_hw_interrupt_install(gpio_obj->irq, fh_gpio_interrupt, (void *)gpio_obj, "gpio_1");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef GPIO_H_
|
||||
#define GPIO_H_
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -105,10 +105,10 @@ void rt_hw_interrupt_init(void)
|
||||
{
|
||||
rt_int32_t i;
|
||||
register rt_uint32_t idx;
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
|
||||
|
||||
ictl_close_all_isr(p);
|
||||
ictl_close_all_isr(p);
|
||||
/* init exceptions table */
|
||||
for(idx=0; idx < MAX_HANDLERS; idx++)
|
||||
{
|
||||
@@ -137,27 +137,27 @@ void rt_hw_interrupt_init(void)
|
||||
void rt_hw_interrupt_mask(int irq)
|
||||
{
|
||||
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
/* Disable irq on AIC */
|
||||
ictl_mask_isr(p,irq);
|
||||
ictl_mask_isr(p,irq);
|
||||
|
||||
// if (irq < 32)
|
||||
// p->IRQ_EN_L &= ~(1 << irq);
|
||||
// else
|
||||
// p->IRQ_EN_H &= ~(1 << (irq - 32));
|
||||
// if (irq < 32)
|
||||
// p->IRQ_EN_L &= ~(1 << irq);
|
||||
// else
|
||||
// p->IRQ_EN_H &= ~(1 << (irq - 32));
|
||||
}
|
||||
|
||||
|
||||
void rt_hw_interrupt_umask(int irq)
|
||||
{
|
||||
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
/* Enable irq on AIC */
|
||||
ictl_unmask_isr(p,irq);
|
||||
ictl_unmask_isr(p,irq);
|
||||
// if (irq < 32)
|
||||
// p->IRQ_EN_L |= 1 << irq;
|
||||
// else
|
||||
// p->IRQ_EN_H |= 1 << (irq - 32);
|
||||
// p->IRQ_EN_L |= 1 << irq;
|
||||
// else
|
||||
// p->IRQ_EN_H |= 1 << (irq - 32);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -168,7 +168,7 @@ void rt_hw_interrupt_umask(int irq)
|
||||
* @param name the interrupt name
|
||||
* @return old handler
|
||||
*/
|
||||
rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
|
||||
rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
|
||||
void *param, const char *name)
|
||||
{
|
||||
rt_isr_handler_t old_handler = RT_NULL;
|
||||
@@ -182,7 +182,7 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
|
||||
irq_desc[vector].param = param;
|
||||
#ifdef RT_USING_INTERRUPT_INFO
|
||||
rt_snprintf(irq_desc[vector].name, RT_NAME_MAX - 1, "%s", name);
|
||||
irq_desc[vector].counter = 0;
|
||||
irq_desc[vector].counter = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -195,7 +195,7 @@ void list_irq(void)
|
||||
{
|
||||
|
||||
#ifdef RT_USING_INTERRUPT_INFO
|
||||
int irq;
|
||||
int irq;
|
||||
rt_kprintf("number\tcount\tname\n");
|
||||
for (irq = 0; irq < MAX_HANDLERS; irq++)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -35,6 +35,6 @@ void rt_hw_interrupt_init(void);
|
||||
void rt_hw_interrupt_mask(int irq);
|
||||
void rt_hw_interrupt_umask(int irq);
|
||||
rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
|
||||
void *param, const char *name);
|
||||
void *param, const char *name);
|
||||
|
||||
#endif /* INTERRUPT_H_ */
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -28,52 +28,52 @@
|
||||
#include <rtdevice.h>
|
||||
#include "mmu.h"
|
||||
|
||||
#define CHANGLINE_SIZE (1)
|
||||
#define CHANGLINE_SIZE (1)
|
||||
|
||||
//#define FH_DBG_MEM_PROCESS
|
||||
|
||||
#ifdef FH_DBG_MEM_PROCESS
|
||||
void mem_input(rt_uint32_t t_addr, rt_uint32_t t_size, rt_uint8_t t_value) {
|
||||
|
||||
rt_kprintf("mem process add:%x \tsize:%x\tvalue:%x\n", t_addr, t_size,
|
||||
t_value);
|
||||
rt_kprintf("mem process add:%x \tsize:%x\tvalue:%x\n", t_addr, t_size,
|
||||
t_value);
|
||||
|
||||
rt_memset((void *) t_addr, t_value, t_size);
|
||||
rt_memset((void *) t_addr, t_value, t_size);
|
||||
|
||||
mmu_clean_invalidated_dcache(t_addr, t_size);
|
||||
mmu_clean_invalidated_dcache(t_addr, t_size);
|
||||
|
||||
}
|
||||
|
||||
void mem_output(rt_uint32_t t_addr, rt_uint32_t t_size) {
|
||||
|
||||
rt_uint32_t i;
|
||||
rt_uint32_t cnt = 0;
|
||||
rt_uint32_t value;
|
||||
rt_uint32_t addr, size;
|
||||
rt_uint32_t i;
|
||||
rt_uint32_t cnt = 0;
|
||||
rt_uint32_t value;
|
||||
rt_uint32_t addr, size;
|
||||
|
||||
addr = t_addr;
|
||||
if (t_size % 4) {
|
||||
rt_kprintf("mem must be alligned\n");
|
||||
}
|
||||
size = t_size / 4;
|
||||
rt_int32_t *p = (rt_uint32_t *) t_addr;
|
||||
addr = t_addr;
|
||||
if (t_size % 4) {
|
||||
rt_kprintf("mem must be alligned\n");
|
||||
}
|
||||
size = t_size / 4;
|
||||
rt_int32_t *p = (rt_uint32_t *) t_addr;
|
||||
|
||||
//mmu_clean_invalidated_dcache(addr,t_size);
|
||||
rt_kprintf("mem process add:0x%x \tsize:0x%x\n", addr, t_size);
|
||||
rt_kprintf("0x%08x:", addr);
|
||||
for (i = 0; i < size; i++) {
|
||||
value = *p++;
|
||||
if ((cnt / CHANGLINE_SIZE) && (cnt % CHANGLINE_SIZE == 0)) {
|
||||
rt_kprintf("\n");
|
||||
}
|
||||
if (cnt / CHANGLINE_SIZE && (cnt % CHANGLINE_SIZE) == 0) {
|
||||
rt_kprintf("0x%08x:", addr + i * 4);
|
||||
}
|
||||
rt_kprintf("\t%08x", value);
|
||||
cnt++;
|
||||
//mmu_clean_invalidated_dcache(addr,t_size);
|
||||
rt_kprintf("mem process add:0x%x \tsize:0x%x\n", addr, t_size);
|
||||
rt_kprintf("0x%08x:", addr);
|
||||
for (i = 0; i < size; i++) {
|
||||
value = *p++;
|
||||
if ((cnt / CHANGLINE_SIZE) && (cnt % CHANGLINE_SIZE == 0)) {
|
||||
rt_kprintf("\n");
|
||||
}
|
||||
if (cnt / CHANGLINE_SIZE && (cnt % CHANGLINE_SIZE) == 0) {
|
||||
rt_kprintf("0x%08x:", addr + i * 4);
|
||||
}
|
||||
rt_kprintf("\t%08x", value);
|
||||
cnt++;
|
||||
|
||||
}
|
||||
rt_kprintf("\n");
|
||||
}
|
||||
rt_kprintf("\n");
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -193,7 +193,7 @@ int fh_pwm_probe(void *priv_data)
|
||||
rt_kprintf("ERROR: %s rt_device calloc failed\n", __func__);
|
||||
return -RT_ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
pwm_dev->user_data = &pwm_drv;
|
||||
pwm_dev->open =fh_pwm_open;
|
||||
pwm_dev->close = fh_pwm_close;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef PWM_H_
|
||||
#define PWM_H_
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -50,123 +50,123 @@
|
||||
|
||||
|
||||
|
||||
#define __raw_writeb(v,a) ( *(volatile unsigned char *)(a) = (v))
|
||||
#define __raw_writew(v,a) ( *(volatile unsigned short *)(a) = (v))
|
||||
#define __raw_writel(v,a) ( *(volatile unsigned int *)(a) = (v))
|
||||
#define __raw_writeb(v,a) ( *(volatile unsigned char *)(a) = (v))
|
||||
#define __raw_writew(v,a) ( *(volatile unsigned short *)(a) = (v))
|
||||
#define __raw_writel(v,a) ( *(volatile unsigned int *)(a) = (v))
|
||||
|
||||
#define __raw_readb(a) ( *(volatile unsigned char *)(a))
|
||||
#define __raw_readw(a) ( *(volatile unsigned short *)(a))
|
||||
#define __raw_readl(a) ( *(volatile unsigned int *)(a))
|
||||
#define __raw_readb(a) ( *(volatile unsigned char *)(a))
|
||||
#define __raw_readw(a) ( *(volatile unsigned short *)(a))
|
||||
#define __raw_readl(a) ( *(volatile unsigned int *)(a))
|
||||
|
||||
|
||||
#define wrap_readl(wrap, name) \
|
||||
__raw_readl(&(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
__raw_readl(&(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
|
||||
#define wrap_writel(wrap, name, val) \
|
||||
__raw_writel((val), &(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
__raw_writel((val), &(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
|
||||
#define wrap_readw(wrap, name) \
|
||||
__raw_readw(&(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
__raw_readw(&(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
|
||||
#define wrap_writew(wrap, name, val) \
|
||||
__raw_writew((val), &(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
__raw_writew((val), &(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
|
||||
#define wrap_readb(wrap, name) \
|
||||
__raw_readb(&(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
__raw_readb(&(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
|
||||
#define wrap_writeb(wrap, name, val) \
|
||||
__raw_writeb((val), &(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
__raw_writeb((val), &(((struct wrap_sadc_reg *)wrap->regs)->name))
|
||||
|
||||
|
||||
|
||||
#define IOCTL_GET_SADC_DATA 1
|
||||
#define IOCTL_SADC_POWER_DOWN 0xff
|
||||
#define SADC_WRAP_BASE (0xf1200000)
|
||||
#define SADC_IRQn (23)
|
||||
#define SADC_MAX_CONTROLLER (1)
|
||||
#define SADC_STATUS_COLESD (0)
|
||||
#define SADC_STATUS_OPEN (1)
|
||||
#define IOCTL_GET_SADC_DATA 1
|
||||
#define IOCTL_SADC_POWER_DOWN 0xff
|
||||
#define SADC_WRAP_BASE (0xf1200000)
|
||||
#define SADC_IRQn (23)
|
||||
#define SADC_MAX_CONTROLLER (1)
|
||||
#define SADC_STATUS_COLESD (0)
|
||||
#define SADC_STATUS_OPEN (1)
|
||||
|
||||
|
||||
|
||||
rt_err_t fh_sadc_isr_read_data(struct wrap_sadc_obj *sadc, rt_uint32_t channel,
|
||||
rt_uint16_t *buf) {
|
||||
rt_uint32_t xainsel = 1 << channel;
|
||||
rt_uint32_t xversel = 0;
|
||||
rt_uint32_t xpwdb = 1;
|
||||
//cnt
|
||||
rt_uint32_t sel2sam_pre_cnt = 2;
|
||||
rt_uint32_t sam_cnt = 2;
|
||||
rt_uint32_t sam2sel_pos_cnt = 2;
|
||||
//time out
|
||||
rt_uint32_t eoc_tos = 0xff;
|
||||
rt_uint32_t eoc_toe = 0xff;
|
||||
rt_uint32_t time_out = 0xffff;
|
||||
//set isr en..
|
||||
rt_uint32_t sadc_isr = 0x01;
|
||||
//start
|
||||
rt_uint32_t sadc_cmd = 0x01;
|
||||
//get data
|
||||
rt_uint32_t temp_data = 0;
|
||||
rt_err_t ret;
|
||||
rt_uint16_t *buf) {
|
||||
rt_uint32_t xainsel = 1 << channel;
|
||||
rt_uint32_t xversel = 0;
|
||||
rt_uint32_t xpwdb = 1;
|
||||
//cnt
|
||||
rt_uint32_t sel2sam_pre_cnt = 2;
|
||||
rt_uint32_t sam_cnt = 2;
|
||||
rt_uint32_t sam2sel_pos_cnt = 2;
|
||||
//time out
|
||||
rt_uint32_t eoc_tos = 0xff;
|
||||
rt_uint32_t eoc_toe = 0xff;
|
||||
rt_uint32_t time_out = 0xffff;
|
||||
//set isr en..
|
||||
rt_uint32_t sadc_isr = 0x01;
|
||||
//start
|
||||
rt_uint32_t sadc_cmd = 0x01;
|
||||
//get data
|
||||
rt_uint32_t temp_data = 0;
|
||||
rt_err_t ret;
|
||||
|
||||
|
||||
//control...
|
||||
wrap_writel(sadc, sadc_control, xainsel | (xversel << 8) | (xpwdb << 12));
|
||||
//control...
|
||||
wrap_writel(sadc, sadc_control, xainsel | (xversel << 8) | (xpwdb << 12));
|
||||
|
||||
|
||||
wrap_writel(sadc, sadc_cnt,
|
||||
sel2sam_pre_cnt | (sam_cnt << 8) | (sam2sel_pos_cnt << 16));
|
||||
wrap_writel(sadc, sadc_cnt,
|
||||
sel2sam_pre_cnt | (sam_cnt << 8) | (sam2sel_pos_cnt << 16));
|
||||
|
||||
wrap_writel(sadc, sadc_timeout,
|
||||
eoc_tos | (eoc_toe << 8) | (time_out << 16));
|
||||
wrap_writel(sadc, sadc_timeout,
|
||||
eoc_tos | (eoc_toe << 8) | (time_out << 16));
|
||||
|
||||
wrap_writel(sadc, sadc_ier, sadc_isr);
|
||||
wrap_writel(sadc, sadc_ier, sadc_isr);
|
||||
|
||||
wrap_writel(sadc, sadc_cmd, sadc_cmd);
|
||||
wrap_writel(sadc, sadc_cmd, sadc_cmd);
|
||||
|
||||
|
||||
// ret = rt_completion_wait(&sadc->completion, RT_TICK_PER_SECOND / 2);
|
||||
|
||||
ret = rt_sem_take(&sadc->completion, 5000);
|
||||
if(ret != RT_EOK)
|
||||
return ret;
|
||||
ret = rt_sem_take(&sadc->completion, 5000);
|
||||
if(ret != RT_EOK)
|
||||
return ret;
|
||||
|
||||
switch (channel) {
|
||||
case 0:
|
||||
case 1:
|
||||
//read channel 0 1
|
||||
temp_data = wrap_readl(sadc, sadc_dout0);
|
||||
break;
|
||||
switch (channel) {
|
||||
case 0:
|
||||
case 1:
|
||||
//read channel 0 1
|
||||
temp_data = wrap_readl(sadc, sadc_dout0);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 3:
|
||||
//read channel 2 3
|
||||
temp_data = wrap_readl(sadc, sadc_dout1);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
//read channel 2 3
|
||||
temp_data = wrap_readl(sadc, sadc_dout1);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
//read channel 4 5
|
||||
temp_data = wrap_readl(sadc, sadc_dout2);
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
//read channel 4 5
|
||||
temp_data = wrap_readl(sadc, sadc_dout2);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
case 7:
|
||||
//read channel 6 7
|
||||
temp_data = wrap_readl(sadc, sadc_dout3);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (channel % 2) {
|
||||
//read low 16bit
|
||||
*buf = (rt_uint16_t) (temp_data & 0xffff);
|
||||
} else {
|
||||
//read high 16bit
|
||||
*buf = (rt_uint16_t) (temp_data >> 16);
|
||||
}
|
||||
return RT_EOK;
|
||||
case 6:
|
||||
case 7:
|
||||
//read channel 6 7
|
||||
temp_data = wrap_readl(sadc, sadc_dout3);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (channel % 2) {
|
||||
//read low 16bit
|
||||
*buf = (rt_uint16_t) (temp_data & 0xffff);
|
||||
} else {
|
||||
//read high 16bit
|
||||
*buf = (rt_uint16_t) (temp_data >> 16);
|
||||
}
|
||||
return RT_EOK;
|
||||
|
||||
}
|
||||
|
||||
@@ -204,41 +204,41 @@ static rt_err_t fh_sadc_close(rt_device_t dev)
|
||||
static rt_err_t fh_sadc_ioctl(rt_device_t dev, int cmd, void *arg)
|
||||
{
|
||||
|
||||
rt_uint32_t control_reg;
|
||||
struct wrap_sadc_obj *sadc_pri =(struct wrap_sadc_obj *)dev->user_data;
|
||||
rt_uint32_t ad_data;
|
||||
rt_uint16_t ad_raw_data;
|
||||
rt_uint32_t control_reg;
|
||||
struct wrap_sadc_obj *sadc_pri =(struct wrap_sadc_obj *)dev->user_data;
|
||||
rt_uint32_t ad_data;
|
||||
rt_uint16_t ad_raw_data;
|
||||
|
||||
SADC_INFO *sadc_info = (SADC_INFO *)arg;
|
||||
rt_err_t ret;
|
||||
switch(cmd){
|
||||
case SADC_CMD_READ_RAW_DATA:
|
||||
ret = fh_sadc_isr_read_data(sadc_pri, sadc_info->channel, &ad_raw_data);
|
||||
if(ret != RT_EOK)
|
||||
return ret;
|
||||
sadc_info->sadc_data = ad_raw_data;
|
||||
SADC_INFO *sadc_info = (SADC_INFO *)arg;
|
||||
rt_err_t ret;
|
||||
switch(cmd){
|
||||
case SADC_CMD_READ_RAW_DATA:
|
||||
ret = fh_sadc_isr_read_data(sadc_pri, sadc_info->channel, &ad_raw_data);
|
||||
if(ret != RT_EOK)
|
||||
return ret;
|
||||
sadc_info->sadc_data = ad_raw_data;
|
||||
|
||||
break;
|
||||
case SADC_CMD_READ_VOLT:
|
||||
ret = fh_sadc_isr_read_data(sadc_pri, sadc_info->channel, &ad_raw_data);
|
||||
if(ret != RT_EOK)
|
||||
return ret;
|
||||
break;
|
||||
case SADC_CMD_READ_VOLT:
|
||||
ret = fh_sadc_isr_read_data(sadc_pri, sadc_info->channel, &ad_raw_data);
|
||||
if(ret != RT_EOK)
|
||||
return ret;
|
||||
|
||||
ad_data = ad_raw_data * SADC_REF;
|
||||
ad_data /= SADC_MAX_AD_VALUE;
|
||||
sadc_info->sadc_data = ad_data;
|
||||
ad_data = ad_raw_data * SADC_REF;
|
||||
ad_data /= SADC_MAX_AD_VALUE;
|
||||
sadc_info->sadc_data = ad_data;
|
||||
|
||||
break;
|
||||
case SADC_CMD_DISABLE:
|
||||
control_reg = wrap_readl(sadc_pri, sadc_control);
|
||||
control_reg &= ~(1 << 12);
|
||||
wrap_writel(sadc_pri, sadc_control, control_reg);
|
||||
break;
|
||||
case SADC_CMD_DISABLE:
|
||||
control_reg = wrap_readl(sadc_pri, sadc_control);
|
||||
control_reg &= ~(1 << 12);
|
||||
wrap_writel(sadc_pri, sadc_control, control_reg);
|
||||
|
||||
break;
|
||||
default :
|
||||
rt_kprintf("wrong para...\n");
|
||||
return RT_EIO;
|
||||
}
|
||||
break;
|
||||
default :
|
||||
rt_kprintf("wrong para...\n");
|
||||
return RT_EIO;
|
||||
}
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
@@ -249,25 +249,25 @@ static void fh_sadc_interrupt(int irq, void *param)
|
||||
{
|
||||
|
||||
rt_uint32_t isr_status;
|
||||
struct wrap_sadc_obj *sadc = (struct wrap_sadc_obj *) param;
|
||||
struct wrap_sadc_obj *sadc = (struct wrap_sadc_obj *) param;
|
||||
|
||||
isr_status = wrap_readl(sadc, sadc_int_status);
|
||||
isr_status = wrap_readl(sadc, sadc_int_status);
|
||||
|
||||
if (isr_status & 0x01) {
|
||||
//close isr
|
||||
rt_uint32_t sadc_isr = 0x00;
|
||||
if (isr_status & 0x01) {
|
||||
//close isr
|
||||
rt_uint32_t sadc_isr = 0x00;
|
||||
|
||||
wrap_writel(sadc, sadc_ier, sadc_isr);
|
||||
//clear status..
|
||||
wrap_writel(sadc, sadc_ier, sadc_isr);
|
||||
//clear status..
|
||||
|
||||
wrap_writel(sadc, sadc_int_status, isr_status);
|
||||
wrap_writel(sadc, sadc_int_status, isr_status);
|
||||
|
||||
rt_sem_release(&sadc->completion);
|
||||
// rt_completion_done(&sadc->completion);
|
||||
} else {
|
||||
//add error handle process
|
||||
rt_kprintf("sadc maybe error!\n");
|
||||
}
|
||||
rt_sem_release(&sadc->completion);
|
||||
// rt_completion_done(&sadc->completion);
|
||||
} else {
|
||||
//add error handle process
|
||||
rt_kprintf("sadc maybe error!\n");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -282,13 +282,13 @@ int fh_sadc_probe(void *priv_data)
|
||||
//caution this is a read only data...if the driver want to use.malloc and copy it..
|
||||
struct wrap_sadc_obj *sadc_obj = (struct wrap_sadc_obj *)priv_data;
|
||||
if(sadc_obj->init_flag == SADC_INIT_ALREADY)
|
||||
return RT_EFULL;
|
||||
return RT_EFULL;
|
||||
|
||||
|
||||
//malloc a rt device..
|
||||
sadc_dev = RT_KERNEL_MALLOC(sizeof(struct rt_device));
|
||||
if(!sadc_dev){
|
||||
return RT_ENOMEM;
|
||||
return RT_ENOMEM;
|
||||
}
|
||||
rt_memset(sadc_dev, 0, sizeof(struct rt_device));
|
||||
PRINT_SADC_DBG("id:%d,\treg:%x,\tirq:%d\n",sadc_obj->id,(rt_uint32_t)sadc_obj->regs,sadc_obj->irq_no);
|
||||
@@ -304,8 +304,8 @@ int fh_sadc_probe(void *priv_data)
|
||||
struct wrap_sadc_obj *sadc_pri = RT_KERNEL_MALLOC(sizeof(struct wrap_sadc_obj));
|
||||
if(!sadc_pri){
|
||||
|
||||
RT_KERNEL_FREE(sadc_dev);
|
||||
return RT_ENOMEM;
|
||||
RT_KERNEL_FREE(sadc_dev);
|
||||
return RT_ENOMEM;
|
||||
}
|
||||
|
||||
//copy platform data to pri data..
|
||||
@@ -349,23 +349,23 @@ int fh_sadc_probe(void *priv_data)
|
||||
int fh_sadc_exit(void *priv_data)
|
||||
{
|
||||
|
||||
PRINT_SADC_DBG("%s\n",__func__);
|
||||
struct wrap_sadc_obj *sadc_obj = (struct wrap_sadc_obj *)priv_data;
|
||||
PRINT_SADC_DBG("%s\n",__func__);
|
||||
struct wrap_sadc_obj *sadc_obj = (struct wrap_sadc_obj *)priv_data;
|
||||
|
||||
struct wrap_sadc_obj *sadc_pri = sadc_obj->rt_dev->user_data;
|
||||
//release sem;
|
||||
rt_sem_detach(&sadc_pri->completion);
|
||||
//sadc_pri->completion = RT_NULL;
|
||||
struct wrap_sadc_obj *sadc_pri = sadc_obj->rt_dev->user_data;
|
||||
//release sem;
|
||||
rt_sem_detach(&sadc_pri->completion);
|
||||
//sadc_pri->completion = RT_NULL;
|
||||
|
||||
//release lock;
|
||||
rt_mutex_detach(&sadc_pri->lock);
|
||||
//release lock;
|
||||
rt_mutex_detach(&sadc_pri->lock);
|
||||
|
||||
RT_KERNEL_FREE(sadc_obj->rt_dev->user_data);
|
||||
RT_KERNEL_FREE(sadc_obj->rt_dev->user_data);
|
||||
|
||||
|
||||
sadc_obj->rt_dev->user_data = RT_NULL;
|
||||
RT_KERNEL_FREE(sadc_obj->rt_dev);
|
||||
sadc_obj->rt_dev = RT_NULL;
|
||||
sadc_obj->rt_dev->user_data = RT_NULL;
|
||||
RT_KERNEL_FREE(sadc_obj->rt_dev);
|
||||
sadc_obj->rt_dev = RT_NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -386,23 +386,23 @@ void rt_hw_sadc_init(void)
|
||||
#ifdef FH_TEST_SADC
|
||||
int fh_sadc_test(void){
|
||||
|
||||
rt_device_t sadc_dev;
|
||||
SADC_INFO info;
|
||||
info.channel = 0;
|
||||
info.sadc_data = 0;
|
||||
sadc_dev = rt_device_find("sadc");
|
||||
if(!sadc_dev){
|
||||
rt_kprintf("cann't find the sadc dev\n");
|
||||
}
|
||||
sadc_dev->init(sadc_dev);
|
||||
sadc_dev->open(sadc_dev,0);
|
||||
while(1)
|
||||
{
|
||||
sadc_dev->control(sadc_dev,SADC_CMD_READ_VOLT,&info);
|
||||
rt_kprintf("channel:%d,volt:%dmv\n",info.channel,info.sadc_data);
|
||||
}
|
||||
rt_device_t sadc_dev;
|
||||
SADC_INFO info;
|
||||
info.channel = 0;
|
||||
info.sadc_data = 0;
|
||||
sadc_dev = rt_device_find("sadc");
|
||||
if(!sadc_dev){
|
||||
rt_kprintf("cann't find the sadc dev\n");
|
||||
}
|
||||
sadc_dev->init(sadc_dev);
|
||||
sadc_dev->open(sadc_dev,0);
|
||||
while(1)
|
||||
{
|
||||
sadc_dev->control(sadc_dev,SADC_CMD_READ_VOLT,&info);
|
||||
rt_kprintf("channel:%d,volt:%dmv\n",info.channel,info.sadc_data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SADC_H_
|
||||
#define SADC_H_
|
||||
|
||||
@@ -33,57 +33,57 @@
|
||||
|
||||
/****************************************************************************
|
||||
* #define section
|
||||
* add constant #define here if any
|
||||
* add constant #define here if any
|
||||
***************************************************************************/
|
||||
//#define FH_SADC_PROC_FILE "driver/sadc"
|
||||
#define MAX_CHANNEL_NO (8)
|
||||
#define SADC_REF (3300)
|
||||
#define SADC_MAX_AD_VALUE (0x3ff)
|
||||
#define LOOP_MODE (0x55)
|
||||
#define ISR_MODE (0xAA)
|
||||
#define MAX_CHANNEL_NO (8)
|
||||
#define SADC_REF (3300)
|
||||
#define SADC_MAX_AD_VALUE (0x3ff)
|
||||
#define LOOP_MODE (0x55)
|
||||
#define ISR_MODE (0xAA)
|
||||
|
||||
|
||||
#define SADC_INIT_ALREADY (0x33)
|
||||
#define SADC_INIT_NOT_YET (0)
|
||||
#define SADC_INIT_ALREADY (0x33)
|
||||
#define SADC_INIT_NOT_YET (0)
|
||||
|
||||
|
||||
#define SADC_CMD_READ_RAW_DATA (0x22)
|
||||
#define SADC_CMD_READ_VOLT (0x33)
|
||||
#define SADC_CMD_DISABLE (0x44)
|
||||
#define SADC_CMD_READ_RAW_DATA (0x22)
|
||||
#define SADC_CMD_READ_VOLT (0x33)
|
||||
#define SADC_CMD_DISABLE (0x44)
|
||||
|
||||
/****************************************************************************
|
||||
* ADT section
|
||||
* add Abstract Data Type definition here
|
||||
* add Abstract Data Type definition here
|
||||
***************************************************************************/
|
||||
|
||||
struct wrap_sadc_reg {
|
||||
rt_uint32_t sadc_cmd;
|
||||
rt_uint32_t sadc_control;
|
||||
rt_uint32_t sadc_ier;
|
||||
rt_uint32_t sadc_int_status;
|
||||
rt_uint32_t sadc_dout0;
|
||||
rt_uint32_t sadc_dout1;
|
||||
rt_uint32_t sadc_dout2;
|
||||
rt_uint32_t sadc_dout3;
|
||||
rt_uint32_t sadc_debuge0;
|
||||
rt_uint32_t sadc_status;
|
||||
rt_uint32_t sadc_cnt;
|
||||
rt_uint32_t sadc_timeout;
|
||||
rt_uint32_t sadc_cmd;
|
||||
rt_uint32_t sadc_control;
|
||||
rt_uint32_t sadc_ier;
|
||||
rt_uint32_t sadc_int_status;
|
||||
rt_uint32_t sadc_dout0;
|
||||
rt_uint32_t sadc_dout1;
|
||||
rt_uint32_t sadc_dout2;
|
||||
rt_uint32_t sadc_dout3;
|
||||
rt_uint32_t sadc_debuge0;
|
||||
rt_uint32_t sadc_status;
|
||||
rt_uint32_t sadc_cnt;
|
||||
rt_uint32_t sadc_timeout;
|
||||
};
|
||||
|
||||
struct wrap_sadc_obj {
|
||||
rt_uint32_t id;
|
||||
void *regs;
|
||||
rt_uint32_t irq_no;
|
||||
rt_uint32_t init_flag;
|
||||
rt_uint32_t active_channel_no;
|
||||
rt_uint32_t active_channel_status;
|
||||
rt_uint16_t channel_data[MAX_CHANNEL_NO];
|
||||
rt_uint32_t error_rec;
|
||||
rt_uint32_t en_isr;
|
||||
rt_uint32_t sample_mode;
|
||||
struct rt_mutex lock;
|
||||
struct rt_semaphore completion;
|
||||
rt_uint32_t id;
|
||||
void *regs;
|
||||
rt_uint32_t irq_no;
|
||||
rt_uint32_t init_flag;
|
||||
rt_uint32_t active_channel_no;
|
||||
rt_uint32_t active_channel_status;
|
||||
rt_uint16_t channel_data[MAX_CHANNEL_NO];
|
||||
rt_uint32_t error_rec;
|
||||
rt_uint32_t en_isr;
|
||||
rt_uint32_t sample_mode;
|
||||
struct rt_mutex lock;
|
||||
struct rt_semaphore completion;
|
||||
|
||||
//bind to the rtdev..
|
||||
rt_device_t rt_dev;
|
||||
@@ -91,8 +91,8 @@ struct wrap_sadc_obj {
|
||||
};
|
||||
|
||||
typedef struct{
|
||||
rt_uint32_t channel;
|
||||
rt_uint32_t sadc_data;
|
||||
rt_uint32_t channel;
|
||||
rt_uint32_t sadc_data;
|
||||
}SADC_INFO;
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ typedef struct{
|
||||
|
||||
/****************************************************************************
|
||||
* section
|
||||
* add function prototype here if any
|
||||
* add function prototype here if any
|
||||
***************************************************************************/
|
||||
void rt_hw_sadc_init(void);
|
||||
#endif
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* spi_fh_adapt.c
|
||||
*
|
||||
@@ -60,9 +60,9 @@
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
|
||||
#define WX_MANU_ID 0xEF
|
||||
#define WX_MANU_ID 0xEF
|
||||
#define AT_MANU_ID 0x1F /* atmel */
|
||||
#define SST_MANU_ID 0xBF
|
||||
#define SST_MANU_ID 0xBF
|
||||
#define GD_MANU_ID 0xC8
|
||||
|
||||
|
||||
@@ -70,50 +70,50 @@
|
||||
#define SPI_ADAPT_DEBUG
|
||||
#ifdef SPI_ADAPT_DEBUG
|
||||
|
||||
#define CMD_JEDEC_ID 0x9f
|
||||
#define CMD_JEDEC_ID 0x9f
|
||||
|
||||
|
||||
#define FH_SPI_ADAPT_DEBUG(fmt, args...) \
|
||||
rt_kprintf(fmt,##args);
|
||||
#define FH_SPI_ADAPT_DEBUG(fmt, args...) \
|
||||
rt_kprintf(fmt,##args);
|
||||
#else
|
||||
#define FH_SPI_ADAPT_DEBUG(fmt, args...)
|
||||
#endif
|
||||
struct fh_flash_id{
|
||||
unsigned char id;
|
||||
rt_err_t (*fh_flash_init)(struct flash_platform_data *plat_flash);
|
||||
char *name;
|
||||
unsigned char id;
|
||||
rt_err_t (*fh_flash_init)(struct flash_platform_data *plat_flash);
|
||||
char *name;
|
||||
};
|
||||
const struct fh_flash_id id_map[] = {
|
||||
|
||||
#ifdef RT_USING_W25QXX
|
||||
WX_MANU_ID,w25qxx_init,"winbond",
|
||||
WX_MANU_ID,w25qxx_init,"winbond",
|
||||
#endif
|
||||
|
||||
#ifdef RT_USING_AT45DBXX
|
||||
AT_MANU_ID,at45dbxx_init,"atmel",
|
||||
AT_MANU_ID,at45dbxx_init,"atmel",
|
||||
#endif
|
||||
|
||||
#ifdef RT_USING_SST25VFXX
|
||||
SST_MANU_ID,sst25vfxx_init,"SST",
|
||||
SST_MANU_ID,sst25vfxx_init,"SST",
|
||||
#endif
|
||||
|
||||
#ifdef RT_USING_GD
|
||||
GD_MANU_ID,gd_init,"GD",
|
||||
GD_MANU_ID,gd_init,"GD",
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct fh_flash_id * fh_flash_check_id_map(unsigned char id){
|
||||
struct fh_flash_id *p_map = RT_NULL;
|
||||
unsigned int i;
|
||||
for (i = 0; i < ARRAY_SIZE(id_map); i++) {
|
||||
p_map = (struct fh_flash_id *)&id_map[i];
|
||||
if (p_map->id == id){
|
||||
return p_map;
|
||||
}
|
||||
}
|
||||
return RT_NULL;
|
||||
struct fh_flash_id *p_map = RT_NULL;
|
||||
unsigned int i;
|
||||
for (i = 0; i < ARRAY_SIZE(id_map); i++) {
|
||||
p_map = (struct fh_flash_id *)&id_map[i];
|
||||
if (p_map->id == id){
|
||||
return p_map;
|
||||
}
|
||||
}
|
||||
return RT_NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -144,50 +144,50 @@ int fh_flash_adapt_probe(void *priv_data)
|
||||
|
||||
/* init flash */
|
||||
|
||||
rt_uint8_t cmd;
|
||||
rt_uint8_t id_recv[3];
|
||||
uint16_t memory_type_capacity;
|
||||
rt_err_t ret;
|
||||
rt_uint8_t cmd;
|
||||
rt_uint8_t id_recv[3];
|
||||
uint16_t memory_type_capacity;
|
||||
rt_err_t ret;
|
||||
|
||||
cmd = 0xFF; /* reset SPI FLASH, cancel all cmd in processing. */
|
||||
rt_spi_send(rt_spi_device, &cmd, 1);
|
||||
/* read flash id */
|
||||
cmd = CMD_JEDEC_ID;
|
||||
rt_spi_send_then_recv(rt_spi_device, &cmd, 1, id_recv, 3);
|
||||
cmd = 0xFF; /* reset SPI FLASH, cancel all cmd in processing. */
|
||||
rt_spi_send(rt_spi_device, &cmd, 1);
|
||||
/* read flash id */
|
||||
cmd = CMD_JEDEC_ID;
|
||||
rt_spi_send_then_recv(rt_spi_device, &cmd, 1, id_recv, 3);
|
||||
|
||||
//if the flash is already connect.
|
||||
if(id_recv[0] != 0xff){
|
||||
flash_model =fh_flash_check_id_map(id_recv[0]);
|
||||
if(flash_model){
|
||||
ret = flash_model->fh_flash_init(plat_flash);
|
||||
if(ret != RT_EOK){
|
||||
rt_kprintf("flash:%s init error\n",flash_model->name);
|
||||
rt_kprintf("use default flash ops..\n");
|
||||
//flash_model->fh_flash_adapt_init =flash_default_init;
|
||||
ret = flash_default_init(plat_flash);
|
||||
}
|
||||
}
|
||||
else{
|
||||
rt_kprintf(
|
||||
"use default flash ops...\nunrecognized flash id is :%02X %02X %02X\n",
|
||||
id_recv[0], id_recv[1], id_recv[2]);
|
||||
ret = flash_default_init(plat_flash);
|
||||
//if the flash is already connect.
|
||||
if(id_recv[0] != 0xff){
|
||||
flash_model =fh_flash_check_id_map(id_recv[0]);
|
||||
if(flash_model){
|
||||
ret = flash_model->fh_flash_init(plat_flash);
|
||||
if(ret != RT_EOK){
|
||||
rt_kprintf("flash:%s init error\n",flash_model->name);
|
||||
rt_kprintf("use default flash ops..\n");
|
||||
//flash_model->fh_flash_adapt_init =flash_default_init;
|
||||
ret = flash_default_init(plat_flash);
|
||||
}
|
||||
}
|
||||
else{
|
||||
rt_kprintf(
|
||||
"use default flash ops...\nunrecognized flash id is :%02X %02X %02X\n",
|
||||
id_recv[0], id_recv[1], id_recv[2]);
|
||||
ret = flash_default_init(plat_flash);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
int i;
|
||||
for(i=0; i<plat_flash->nr_parts; i++)
|
||||
{
|
||||
fh_spi_partition_register(plat_flash->flash_name, &plat_flash->parts[i]);
|
||||
}
|
||||
int i;
|
||||
for(i=0; i<plat_flash->nr_parts; i++)
|
||||
{
|
||||
fh_spi_partition_register(plat_flash->flash_name, &plat_flash->parts[i]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return ret;
|
||||
|
||||
}
|
||||
else{
|
||||
rt_kprintf("please check if you connect the flash already...\n");
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
}
|
||||
else{
|
||||
rt_kprintf("please check if you connect the flash already...\n");
|
||||
return RT_ENOSYS;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* spi_fh_adapt.h
|
||||
*
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SSI_H_
|
||||
#define SSI_H_
|
||||
#include "libraries/inc/fh_driverlib.h"
|
||||
@@ -32,37 +32,37 @@
|
||||
#include "fh_dma.h"
|
||||
#define SPI_PRIV(drv) ( (struct fh_spi_obj)(drv->priv) )
|
||||
|
||||
#define FH_SPI_SLAVE_MAX_NO 2
|
||||
#define FH_SPI_SLAVE_MAX_NO 2
|
||||
|
||||
struct spi_controller;
|
||||
//platform use below
|
||||
struct spi_slave_platform_data{
|
||||
|
||||
rt_uint32_t cs_pin;
|
||||
#define ACTIVE_LOW 1
|
||||
#define ACTIVE_HIGH 2
|
||||
rt_uint32_t actice_level;
|
||||
rt_uint32_t cs_pin;
|
||||
#define ACTIVE_LOW 1
|
||||
#define ACTIVE_HIGH 2
|
||||
rt_uint32_t actice_level;
|
||||
};
|
||||
|
||||
|
||||
struct spi_control_platform_data{
|
||||
rt_uint32_t id;
|
||||
rt_uint32_t irq;
|
||||
rt_uint32_t base;
|
||||
rt_uint32_t max_hz;
|
||||
rt_uint32_t slave_no;
|
||||
rt_uint32_t clk_in;
|
||||
//handshake no...
|
||||
rt_uint32_t rx_hs_no;
|
||||
rt_uint32_t tx_hs_no;
|
||||
rt_uint32_t id;
|
||||
rt_uint32_t irq;
|
||||
rt_uint32_t base;
|
||||
rt_uint32_t max_hz;
|
||||
rt_uint32_t slave_no;
|
||||
rt_uint32_t clk_in;
|
||||
//handshake no...
|
||||
rt_uint32_t rx_hs_no;
|
||||
rt_uint32_t tx_hs_no;
|
||||
|
||||
char *dma_name;
|
||||
//isr will be the default...
|
||||
#define USE_ISR_TRANSFER 0
|
||||
#define USE_DMA_TRANSFER 1
|
||||
rt_uint32_t transfer_mode;
|
||||
struct spi_controller *control;
|
||||
struct spi_slave_platform_data plat_slave[FH_SPI_SLAVE_MAX_NO];
|
||||
char *dma_name;
|
||||
//isr will be the default...
|
||||
#define USE_ISR_TRANSFER 0
|
||||
#define USE_DMA_TRANSFER 1
|
||||
rt_uint32_t transfer_mode;
|
||||
struct spi_controller *control;
|
||||
struct spi_slave_platform_data plat_slave[FH_SPI_SLAVE_MAX_NO];
|
||||
|
||||
};
|
||||
|
||||
@@ -81,15 +81,15 @@ struct spi_slave_info
|
||||
|
||||
struct spi_dma
|
||||
{
|
||||
char *dma_name;
|
||||
#define DMA_BIND_OK 0
|
||||
#define DMA_BIND_ERROR 1
|
||||
rt_uint32_t dma_flag;
|
||||
char *dma_name;
|
||||
#define DMA_BIND_OK 0
|
||||
#define DMA_BIND_ERROR 1
|
||||
rt_uint32_t dma_flag;
|
||||
//bind to the dma dev..
|
||||
rt_uint32_t rx_hs;
|
||||
rt_uint32_t tx_hs;
|
||||
rt_uint8_t *rx_dummy_buff;
|
||||
rt_uint8_t *tx_dummy_buff;
|
||||
rt_uint32_t rx_hs;
|
||||
rt_uint32_t tx_hs;
|
||||
rt_uint8_t *rx_dummy_buff;
|
||||
rt_uint8_t *tx_dummy_buff;
|
||||
struct rt_dma_device *dma_dev;
|
||||
struct dma_transfer tx_trans;
|
||||
struct dma_transfer rx_trans;
|
||||
@@ -98,28 +98,28 @@ struct spi_dma
|
||||
|
||||
struct spi_controller
|
||||
{
|
||||
rt_uint32_t id;
|
||||
rt_uint32_t irq;
|
||||
rt_uint32_t base;
|
||||
rt_uint32_t max_hz;
|
||||
rt_uint32_t slave_no;
|
||||
rt_uint32_t clk_in;
|
||||
//bind to the platform data....
|
||||
struct spi_control_platform_data *plat_data;
|
||||
rt_uint32_t id;
|
||||
rt_uint32_t irq;
|
||||
rt_uint32_t base;
|
||||
rt_uint32_t max_hz;
|
||||
rt_uint32_t slave_no;
|
||||
rt_uint32_t clk_in;
|
||||
//bind to the platform data....
|
||||
struct spi_control_platform_data *plat_data;
|
||||
|
||||
//rt_uint32_t dma_xfer_flag;
|
||||
//rt_uint32_t dma_xfer_flag;
|
||||
|
||||
#define XFER_USE_ISR 0
|
||||
#define XFER_USE_DMA 1
|
||||
rt_uint32_t xfer_mode;
|
||||
#define XFER_USE_ISR 0
|
||||
#define XFER_USE_DMA 1
|
||||
rt_uint32_t xfer_mode;
|
||||
|
||||
struct spi_dma dma;
|
||||
rt_uint32_t dma_complete_times;
|
||||
struct spi_dma dma;
|
||||
rt_uint32_t dma_complete_times;
|
||||
struct rt_spi_bus spi_bus;
|
||||
struct spi_slave_info *spi_slave;
|
||||
struct rt_spi_message* current_message;
|
||||
struct rt_completion transfer_completion;
|
||||
struct rt_semaphore xfer_lock;
|
||||
struct rt_semaphore xfer_lock;
|
||||
struct fh_spi_obj obj;
|
||||
rt_uint32_t received_len;
|
||||
rt_uint32_t transfered_len;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#include <rthw.h>
|
||||
#include <armv6.h>
|
||||
#include "fh_arch.h"
|
||||
@@ -47,13 +47,13 @@ extern long list_thread(void);
|
||||
|
||||
void rt_hw_show_register (struct rt_hw_register *regs)
|
||||
{
|
||||
rt_kprintf("Execption:\n");
|
||||
rt_kprintf("r00:0x%08x r01:0x%08x r02:0x%08x r03:0x%08x\n", regs->r0, regs->r1, regs->r2, regs->r3);
|
||||
rt_kprintf("r04:0x%08x r05:0x%08x r06:0x%08x r07:0x%08x\n", regs->r4, regs->r5, regs->r6, regs->r7);
|
||||
rt_kprintf("r08:0x%08x r09:0x%08x r10:0x%08x\n", regs->r8, regs->r9, regs->r10);
|
||||
rt_kprintf("fp :0x%08x ip :0x%08x\n", regs->fp, regs->ip);
|
||||
rt_kprintf("sp :0x%08x lr :0x%08x pc :0x%08x\n", regs->sp, regs->lr, regs->pc);
|
||||
rt_kprintf("cpsr:0x%08x\n", regs->cpsr);
|
||||
rt_kprintf("Execption:\n");
|
||||
rt_kprintf("r00:0x%08x r01:0x%08x r02:0x%08x r03:0x%08x\n", regs->r0, regs->r1, regs->r2, regs->r3);
|
||||
rt_kprintf("r04:0x%08x r05:0x%08x r06:0x%08x r07:0x%08x\n", regs->r4, regs->r5, regs->r6, regs->r7);
|
||||
rt_kprintf("r08:0x%08x r09:0x%08x r10:0x%08x\n", regs->r8, regs->r9, regs->r10);
|
||||
rt_kprintf("fp :0x%08x ip :0x%08x\n", regs->fp, regs->ip);
|
||||
rt_kprintf("sp :0x%08x lr :0x%08x pc :0x%08x\n", regs->sp, regs->lr, regs->pc);
|
||||
rt_kprintf("cpsr:0x%08x\n", regs->cpsr);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,15 +66,15 @@ void rt_hw_show_register (struct rt_hw_register *regs)
|
||||
*/
|
||||
void rt_hw_trap_udef(struct rt_hw_register *regs)
|
||||
{
|
||||
rt_hw_show_register(regs);
|
||||
rt_hw_show_register(regs);
|
||||
|
||||
rt_kprintf("undefined instruction\n");
|
||||
rt_kprintf("thread - %s stack:\n", rt_current_thread->name);
|
||||
rt_kprintf("undefined instruction\n");
|
||||
rt_kprintf("thread - %s stack:\n", rt_current_thread->name);
|
||||
|
||||
#ifdef RT_USING_FINSH
|
||||
list_thread();
|
||||
list_thread();
|
||||
#endif
|
||||
rt_hw_cpu_shutdown();
|
||||
rt_hw_cpu_shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -88,10 +88,10 @@ void rt_hw_trap_udef(struct rt_hw_register *regs)
|
||||
*/
|
||||
void rt_hw_trap_swi(struct rt_hw_register *regs)
|
||||
{
|
||||
rt_hw_show_register(regs);
|
||||
rt_hw_show_register(regs);
|
||||
|
||||
rt_kprintf("software interrupt\n");
|
||||
rt_hw_cpu_shutdown();
|
||||
rt_kprintf("software interrupt\n");
|
||||
rt_hw_cpu_shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -104,15 +104,15 @@ void rt_hw_trap_swi(struct rt_hw_register *regs)
|
||||
*/
|
||||
void rt_hw_trap_pabt(struct rt_hw_register *regs)
|
||||
{
|
||||
rt_hw_show_register(regs);
|
||||
rt_hw_show_register(regs);
|
||||
|
||||
rt_kprintf("prefetch abort\n");
|
||||
rt_kprintf("thread - %s stack:\n", rt_current_thread->name);
|
||||
rt_kprintf("prefetch abort\n");
|
||||
rt_kprintf("thread - %s stack:\n", rt_current_thread->name);
|
||||
|
||||
#ifdef RT_USING_FINSH
|
||||
list_thread();
|
||||
list_thread();
|
||||
#endif
|
||||
rt_hw_cpu_shutdown();
|
||||
rt_hw_cpu_shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,15 +125,15 @@ void rt_hw_trap_pabt(struct rt_hw_register *regs)
|
||||
*/
|
||||
void rt_hw_trap_dabt(struct rt_hw_register *regs)
|
||||
{
|
||||
rt_hw_show_register(regs);
|
||||
rt_hw_show_register(regs);
|
||||
|
||||
rt_kprintf("data abort\n");
|
||||
rt_kprintf("thread - %s stack:\n", rt_current_thread->name);
|
||||
rt_kprintf("data abort\n");
|
||||
rt_kprintf("thread - %s stack:\n", rt_current_thread->name);
|
||||
|
||||
#ifdef RT_USING_FINSH
|
||||
list_thread();
|
||||
list_thread();
|
||||
#endif
|
||||
rt_hw_cpu_shutdown();
|
||||
rt_hw_cpu_shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -145,45 +145,45 @@ void rt_hw_trap_dabt(struct rt_hw_register *regs)
|
||||
*/
|
||||
void rt_hw_trap_resv(struct rt_hw_register *regs)
|
||||
{
|
||||
rt_kprintf("not used\n");
|
||||
rt_hw_show_register(regs);
|
||||
rt_hw_cpu_shutdown();
|
||||
rt_kprintf("not used\n");
|
||||
rt_hw_show_register(regs);
|
||||
rt_hw_cpu_shutdown();
|
||||
}
|
||||
|
||||
extern struct rt_irq_desc irq_desc[];
|
||||
|
||||
void rt_hw_trap_irq()
|
||||
{
|
||||
rt_isr_handler_t isr_func;
|
||||
rt_uint32_t irqstat_l, irqstat_h, irq;
|
||||
void *param;
|
||||
rt_isr_handler_t isr_func;
|
||||
rt_uint32_t irqstat_l, irqstat_h, irq;
|
||||
void *param;
|
||||
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
fh_intc *p = (fh_intc *)INTC_REG_BASE;
|
||||
|
||||
irqstat_l = p->IRQ_FINALSTATUS_L;
|
||||
irqstat_h = p->IRQ_FINALSTATUS_H;
|
||||
if (irqstat_l)
|
||||
{
|
||||
irq = __rt_ffs(irqstat_l) - 1;
|
||||
}
|
||||
else if(irqstat_h)
|
||||
{
|
||||
irq = __rt_ffs(irqstat_h) - 1 + 32;
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("No interrupt occur\n");
|
||||
return;
|
||||
}
|
||||
irqstat_l = p->IRQ_FINALSTATUS_L;
|
||||
irqstat_h = p->IRQ_FINALSTATUS_H;
|
||||
if (irqstat_l)
|
||||
{
|
||||
irq = __rt_ffs(irqstat_l) - 1;
|
||||
}
|
||||
else if(irqstat_h)
|
||||
{
|
||||
irq = __rt_ffs(irqstat_h) - 1 + 32;
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("No interrupt occur\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* get interrupt service routine */
|
||||
isr_func = irq_desc[irq].handler;
|
||||
param = irq_desc[irq].param;
|
||||
/* get interrupt service routine */
|
||||
isr_func = irq_desc[irq].handler;
|
||||
param = irq_desc[irq].param;
|
||||
|
||||
/* turn to interrupt service routine */
|
||||
if(isr_func){
|
||||
isr_func(irq, param);
|
||||
}
|
||||
/* turn to interrupt service routine */
|
||||
if(isr_func){
|
||||
isr_func(irq, param);
|
||||
}
|
||||
#ifdef RT_USING_INTERRUPT_INFO
|
||||
irq_desc[irq].counter ++;
|
||||
#endif
|
||||
@@ -191,7 +191,7 @@ void rt_hw_trap_irq()
|
||||
|
||||
void rt_hw_trap_fiq()
|
||||
{
|
||||
rt_kprintf("fast interrupt request\n");
|
||||
rt_kprintf("fast interrupt request\n");
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#include <board.h>
|
||||
#include <rtdevice.h>
|
||||
#include "fh_arch.h"
|
||||
@@ -32,35 +32,35 @@
|
||||
|
||||
void rt_fh_uart_handler(int vector, void *param)
|
||||
{
|
||||
int status;
|
||||
unsigned int ret;
|
||||
struct fh_uart *uart;
|
||||
unsigned int reg_status;
|
||||
rt_device_t dev = (rt_device_t)param;
|
||||
uart = (struct fh_uart *)dev->user_data;
|
||||
status = uart_get_iir_status(uart->uart_port);
|
||||
if (status & UART_IIR_NOINT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if(status & UART_IIR_THREMPTY){
|
||||
//first close tx isr
|
||||
uart_disable_irq(uart->uart_port,UART_IER_ETBEI);
|
||||
int status;
|
||||
unsigned int ret;
|
||||
struct fh_uart *uart;
|
||||
unsigned int reg_status;
|
||||
rt_device_t dev = (rt_device_t)param;
|
||||
uart = (struct fh_uart *)dev->user_data;
|
||||
status = uart_get_iir_status(uart->uart_port);
|
||||
if (status & UART_IIR_NOINT)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if(status & UART_IIR_THREMPTY){
|
||||
//first close tx isr
|
||||
uart_disable_irq(uart->uart_port,UART_IER_ETBEI);
|
||||
|
||||
rt_hw_serial_isr((struct rt_serial_device *)dev, RT_SERIAL_EVENT_TX_DONE);
|
||||
}
|
||||
else if((status & UART_IIR_CHRTOUT)==UART_IIR_CHRTOUT){
|
||||
//bug....
|
||||
//if no data in rx fifo
|
||||
reg_status = uart_get_status(uart->uart_port);
|
||||
if((reg_status & 1<<3) == 0)
|
||||
ret = uart_getc(uart->uart_port);
|
||||
}
|
||||
else{
|
||||
rt_interrupt_enter();
|
||||
rt_hw_serial_isr((struct rt_serial_device *)dev, RT_SERIAL_EVENT_RX_IND);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
rt_hw_serial_isr((struct rt_serial_device *)dev, RT_SERIAL_EVENT_TX_DONE);
|
||||
}
|
||||
else if((status & UART_IIR_CHRTOUT)==UART_IIR_CHRTOUT){
|
||||
//bug....
|
||||
//if no data in rx fifo
|
||||
reg_status = uart_get_status(uart->uart_port);
|
||||
if((reg_status & 1<<3) == 0)
|
||||
ret = uart_getc(uart->uart_port);
|
||||
}
|
||||
else{
|
||||
rt_interrupt_enter();
|
||||
rt_hw_serial_isr((struct rt_serial_device *)dev, RT_SERIAL_EVENT_RX_IND);
|
||||
rt_interrupt_leave();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,67 +69,67 @@ void rt_fh_uart_handler(int vector, void *param)
|
||||
static rt_err_t fh_uart_configure(struct rt_serial_device *serial,
|
||||
struct serial_configure *cfg)
|
||||
{
|
||||
int div;
|
||||
enum data_bits data_mode;
|
||||
enum stop_bits stop_mode;
|
||||
enum parity parity_mode;
|
||||
struct fh_uart *uart;
|
||||
int div;
|
||||
enum data_bits data_mode;
|
||||
enum stop_bits stop_mode;
|
||||
enum parity parity_mode;
|
||||
struct fh_uart *uart;
|
||||
|
||||
RT_ASSERT(serial != RT_NULL);
|
||||
RT_ASSERT(serial != RT_NULL);
|
||||
RT_ASSERT(cfg != RT_NULL);
|
||||
uart = (struct fh_uart *)serial->parent.user_data;
|
||||
uart = (struct fh_uart *)serial->parent.user_data;
|
||||
|
||||
switch (cfg->data_bits)
|
||||
{
|
||||
case DATA_BITS_8:
|
||||
data_mode = UART_DATA_BIT8;
|
||||
break;
|
||||
case DATA_BITS_7:
|
||||
data_mode = UART_DATA_BIT7;
|
||||
break;
|
||||
case DATA_BITS_6:
|
||||
data_mode = UART_DATA_BIT6;
|
||||
break;
|
||||
case DATA_BITS_5:
|
||||
data_mode = UART_DATA_BIT5;
|
||||
break;
|
||||
default:
|
||||
data_mode = UART_DATA_BIT8;
|
||||
break;
|
||||
}
|
||||
switch (cfg->data_bits)
|
||||
{
|
||||
case DATA_BITS_8:
|
||||
data_mode = UART_DATA_BIT8;
|
||||
break;
|
||||
case DATA_BITS_7:
|
||||
data_mode = UART_DATA_BIT7;
|
||||
break;
|
||||
case DATA_BITS_6:
|
||||
data_mode = UART_DATA_BIT6;
|
||||
break;
|
||||
case DATA_BITS_5:
|
||||
data_mode = UART_DATA_BIT5;
|
||||
break;
|
||||
default:
|
||||
data_mode = UART_DATA_BIT8;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (cfg->stop_bits)
|
||||
{
|
||||
case STOP_BITS_2:
|
||||
stop_mode = UART_STOP_BIT2;
|
||||
break;
|
||||
case STOP_BITS_1:
|
||||
default:
|
||||
stop_mode = UART_STOP_BIT1;
|
||||
break;
|
||||
}
|
||||
switch (cfg->stop_bits)
|
||||
{
|
||||
case STOP_BITS_2:
|
||||
stop_mode = UART_STOP_BIT2;
|
||||
break;
|
||||
case STOP_BITS_1:
|
||||
default:
|
||||
stop_mode = UART_STOP_BIT1;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (cfg->parity)
|
||||
{
|
||||
case PARITY_ODD:
|
||||
parity_mode = UART_PARITY_ODD;
|
||||
break;
|
||||
case PARITY_EVEN:
|
||||
parity_mode = UART_PARITY_EVEN;
|
||||
break;
|
||||
case PARITY_NONE:
|
||||
default:
|
||||
parity_mode = UART_PARITY_NONE;
|
||||
break;
|
||||
}
|
||||
switch (cfg->parity)
|
||||
{
|
||||
case PARITY_ODD:
|
||||
parity_mode = UART_PARITY_ODD;
|
||||
break;
|
||||
case PARITY_EVEN:
|
||||
parity_mode = UART_PARITY_EVEN;
|
||||
break;
|
||||
case PARITY_NONE:
|
||||
default:
|
||||
parity_mode = UART_PARITY_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
uart_disable_irq(uart->uart_port, UART_IER_ERBFI);
|
||||
|
||||
uart_configure(uart->uart_port, data_mode,
|
||||
stop_mode, parity_mode,
|
||||
cfg->baud_rate, UART_CLOCK_FREQ);
|
||||
uart_configure(uart->uart_port, data_mode,
|
||||
stop_mode, parity_mode,
|
||||
cfg->baud_rate, UART_CLOCK_FREQ);
|
||||
|
||||
uart_enable_irq(uart->uart_port, UART_IER_ERBFI);
|
||||
uart_enable_irq(uart->uart_port, UART_IER_ERBFI);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
@@ -146,13 +146,13 @@ static rt_err_t fh_uart_control(struct rt_serial_device *serial,
|
||||
{
|
||||
case RT_DEVICE_CTRL_CLR_INT:
|
||||
/* disable rx irq */
|
||||
rt_hw_interrupt_mask(uart->irq);
|
||||
uart_disable_irq(uart->uart_port,UART_IER_ERBFI);
|
||||
rt_hw_interrupt_mask(uart->irq);
|
||||
uart_disable_irq(uart->uart_port,UART_IER_ERBFI);
|
||||
break;
|
||||
case RT_DEVICE_CTRL_SET_INT:
|
||||
/* enable rx irq */
|
||||
rt_hw_interrupt_umask(uart->irq);
|
||||
uart_enable_irq(uart->uart_port,UART_IER_ERBFI);
|
||||
rt_hw_interrupt_umask(uart->irq);
|
||||
uart_enable_irq(uart->uart_port,UART_IER_ERBFI);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -161,33 +161,33 @@ static rt_err_t fh_uart_control(struct rt_serial_device *serial,
|
||||
|
||||
static int fh_uart_putc(struct rt_serial_device *serial, char c)
|
||||
{
|
||||
struct fh_uart *uart = serial->parent.user_data;
|
||||
unsigned int ret;
|
||||
ret = uart_get_status(uart->uart_port);
|
||||
if(serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX){
|
||||
//RT_DEVICE_FLAG_INT_TX
|
||||
struct fh_uart *uart = serial->parent.user_data;
|
||||
unsigned int ret;
|
||||
ret = uart_get_status(uart->uart_port);
|
||||
if(serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX){
|
||||
//RT_DEVICE_FLAG_INT_TX
|
||||
|
||||
if(c == '\n'){
|
||||
fh_uart_putc(serial,'\r');
|
||||
}
|
||||
if(ret & UART_USR_TFNF){
|
||||
uart_putc(uart->uart_port, c);
|
||||
return 1;
|
||||
}
|
||||
//open tx isr here..
|
||||
uart_enable_irq(uart->uart_port,UART_IER_ETBEI);
|
||||
return -1;
|
||||
}
|
||||
//poll mode
|
||||
else{
|
||||
if(c == '\n'){
|
||||
fh_uart_putc(serial,'\r');
|
||||
}
|
||||
if(ret & UART_USR_TFNF){
|
||||
uart_putc(uart->uart_port, c);
|
||||
return 1;
|
||||
}
|
||||
//open tx isr here..
|
||||
uart_enable_irq(uart->uart_port,UART_IER_ETBEI);
|
||||
return -1;
|
||||
}
|
||||
//poll mode
|
||||
else{
|
||||
|
||||
while(!(uart_get_status(uart->uart_port) & UART_USR_TFNF))
|
||||
;
|
||||
uart_putc(uart->uart_port, c);
|
||||
return 1;
|
||||
while(!(uart_get_status(uart->uart_port) & UART_USR_TFNF))
|
||||
;
|
||||
uart_putc(uart->uart_port, c);
|
||||
return 1;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -196,16 +196,16 @@ static int fh_uart_putc(struct rt_serial_device *serial, char c)
|
||||
static int fh_uart_getc(struct rt_serial_device *serial)
|
||||
{
|
||||
int result;
|
||||
struct fh_uart *uart = serial->parent.user_data;
|
||||
struct fh_uart *uart = serial->parent.user_data;
|
||||
|
||||
if (uart_is_rx_ready(uart->uart_port))
|
||||
{
|
||||
result = uart_getc(uart->uart_port);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = -1;
|
||||
}
|
||||
if (uart_is_rx_ready(uart->uart_port))
|
||||
{
|
||||
result = uart_getc(uart->uart_port);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = -1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -222,8 +222,8 @@ static const struct rt_uart_ops fh_uart_ops =
|
||||
#if defined(RT_USING_UART0)
|
||||
static struct rt_serial_device serial0;
|
||||
struct fh_uart uart0 = {
|
||||
(uart *)UART0_REG_BASE,
|
||||
UART0_IRQn
|
||||
(uart *)UART0_REG_BASE,
|
||||
UART0_IRQn
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -231,8 +231,8 @@ struct fh_uart uart0 = {
|
||||
#if defined(RT_USING_UART1)
|
||||
static struct rt_serial_device serial1;
|
||||
struct fh_uart uart1 = {
|
||||
(uart *)UART1_REG_BASE,
|
||||
UART1_IRQn
|
||||
(uart *)UART1_REG_BASE,
|
||||
UART1_IRQn
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -245,45 +245,45 @@ struct fh_uart uart1 = {
|
||||
*/
|
||||
void rt_hw_uart_init(void)
|
||||
{
|
||||
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
|
||||
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
|
||||
|
||||
#if defined(RT_USING_UART0)
|
||||
#if(0)
|
||||
serial0.ops = &fh_uart_ops;
|
||||
serial0.config = config;
|
||||
serial0.ops = &fh_uart_ops;
|
||||
serial0.config = config;
|
||||
|
||||
/* register vcom device */
|
||||
rt_hw_serial_register(&serial0, "uart0",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_STANDALONE,
|
||||
&uart0);
|
||||
rt_hw_interrupt_install(uart0.irq, rt_fh_uart_handler,
|
||||
(void *)&(serial0.parent), "UART0");
|
||||
rt_hw_interrupt_umask(uart0.irq);
|
||||
/* register vcom device */
|
||||
rt_hw_serial_register(&serial0, "uart0",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_STANDALONE,
|
||||
&uart0);
|
||||
rt_hw_interrupt_install(uart0.irq, rt_fh_uart_handler,
|
||||
(void *)&(serial0.parent), "UART0");
|
||||
rt_hw_interrupt_umask(uart0.irq);
|
||||
#endif
|
||||
serial0.ops = &fh_uart_ops;
|
||||
serial0.config = config;
|
||||
serial0.ops = &fh_uart_ops;
|
||||
serial0.config = config;
|
||||
|
||||
/* register vcom device */
|
||||
rt_hw_serial_register(&serial0, "uart0",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM ,
|
||||
&uart0);
|
||||
rt_hw_interrupt_install(uart0.irq, rt_fh_uart_handler,
|
||||
(void *)&(serial0.parent), "UART0");
|
||||
rt_hw_interrupt_umask(uart0.irq);
|
||||
/* register vcom device */
|
||||
rt_hw_serial_register(&serial0, "uart0",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM ,
|
||||
&uart0);
|
||||
rt_hw_interrupt_install(uart0.irq, rt_fh_uart_handler,
|
||||
(void *)&(serial0.parent), "UART0");
|
||||
rt_hw_interrupt_umask(uart0.irq);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(RT_USING_UART1)
|
||||
serial1.ops = &fh_uart_ops;
|
||||
serial1.config = config;
|
||||
serial1.ops = &fh_uart_ops;
|
||||
serial1.config = config;
|
||||
|
||||
/* register vcom device */
|
||||
rt_hw_serial_register(&serial1, "uart1",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM ,
|
||||
&uart1);
|
||||
rt_hw_interrupt_install(uart1.irq, rt_fh_uart_handler,
|
||||
(void *)&(serial1.parent), "UART1");
|
||||
rt_hw_interrupt_umask(uart1.irq);
|
||||
/* register vcom device */
|
||||
rt_hw_serial_register(&serial1, "uart1",
|
||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM ,
|
||||
&uart1);
|
||||
rt_hw_interrupt_install(uart1.irq, rt_fh_uart_handler,
|
||||
(void *)&(serial1.parent), "UART1");
|
||||
rt_hw_interrupt_umask(uart1.irq);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef UART_H_
|
||||
#define UART_H_
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#include "fh_def.h"
|
||||
#include "wdt.h"
|
||||
#include "interrupt.h"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef WDT_H_
|
||||
#define WDT_H_
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,10 +18,10 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#include "inc/fh_driverlib.h"
|
||||
|
||||
int I2C_WaitMasterIdle(struct fh_i2c_obj *i2c_obj)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,25 +18,25 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#include "inc/fh_driverlib.h"
|
||||
|
||||
|
||||
|
||||
void ictl_close_all_isr(fh_intc *p){
|
||||
if(p){
|
||||
//enable all interrupts
|
||||
p->IRQ_EN_L = 0xffffffff;
|
||||
p->IRQ_EN_H = 0xffffffff;
|
||||
//mask all interrupts
|
||||
p->IRQ_MASK_L = 0xffffffff;
|
||||
p->IRQ_MASK_H = 0xffffffff;
|
||||
}
|
||||
if(p){
|
||||
//enable all interrupts
|
||||
p->IRQ_EN_L = 0xffffffff;
|
||||
p->IRQ_EN_H = 0xffffffff;
|
||||
//mask all interrupts
|
||||
p->IRQ_MASK_L = 0xffffffff;
|
||||
p->IRQ_MASK_H = 0xffffffff;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -44,13 +44,13 @@ void ictl_close_all_isr(fh_intc *p){
|
||||
|
||||
|
||||
void ictl_mask_isr(fh_intc *p,int irq){
|
||||
if(p){
|
||||
if(p){
|
||||
|
||||
if (irq < 32)
|
||||
p->IRQ_MASK_L |= (1 << irq);
|
||||
else
|
||||
p->IRQ_MASK_H |= (1 << (irq - 32));
|
||||
}
|
||||
if (irq < 32)
|
||||
p->IRQ_MASK_L |= (1 << irq);
|
||||
else
|
||||
p->IRQ_MASK_H |= (1 << (irq - 32));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -58,12 +58,12 @@ void ictl_mask_isr(fh_intc *p,int irq){
|
||||
|
||||
|
||||
void ictl_unmask_isr(fh_intc *p,int irq){
|
||||
if(p){
|
||||
if (irq < 32)
|
||||
p->IRQ_MASK_L &= ~(1 << irq);
|
||||
else
|
||||
p->IRQ_MASK_H &= ~(1 << (irq - 32));
|
||||
if(p){
|
||||
if (irq < 32)
|
||||
p->IRQ_MASK_L &= ~(1 << irq);
|
||||
else
|
||||
p->IRQ_MASK_H &= ~(1 << (irq - 32));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Include Section
|
||||
* add all #include here
|
||||
@@ -79,66 +79,66 @@
|
||||
*****************************************************************************/
|
||||
int timer_init(timer *tim)
|
||||
{
|
||||
tim->TIMER_CTRL_REG = 0;
|
||||
tim->TIMER_CTRL_REG = 0;
|
||||
}
|
||||
|
||||
int timer_set_mode(timer *tim, enum timer_mode mode)
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case TIMER_MODE_PERIODIC:
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_MODE;
|
||||
break;
|
||||
case TIMER_MODE_ONESHOT:
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_MODE;
|
||||
break;
|
||||
default:
|
||||
rt_kprintf("Not support TIMER mode\n");
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
switch (mode)
|
||||
{
|
||||
case TIMER_MODE_PERIODIC:
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_MODE;
|
||||
break;
|
||||
case TIMER_MODE_ONESHOT:
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_MODE;
|
||||
break;
|
||||
default:
|
||||
rt_kprintf("Not support TIMER mode\n");
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void timer_set_period(timer *tim, UINT32 period, UINT32 clock)
|
||||
{
|
||||
tim->TIMER_LOAD_COUNT = clock/period;
|
||||
tim->TIMER_LOAD_COUNT = clock/period;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void timer_enable(timer *tim)
|
||||
{
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_ENABLE;
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_ENABLE;
|
||||
}
|
||||
|
||||
void timer_disable(timer *tim)
|
||||
{
|
||||
tim->TIMER_CTRL_REG &= ~TIMER_CTRL_ENABLE;
|
||||
tim->TIMER_CTRL_REG &= ~TIMER_CTRL_ENABLE;
|
||||
}
|
||||
|
||||
void timer_enable_irq(timer *tim)
|
||||
{
|
||||
tim->TIMER_CTRL_REG &= ~TIMER_CTRL_INTMASK;
|
||||
tim->TIMER_CTRL_REG &= ~TIMER_CTRL_INTMASK;
|
||||
}
|
||||
|
||||
void timer_disable_irq(timer *tim)
|
||||
{
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_INTMASK;
|
||||
tim->TIMER_CTRL_REG |= TIMER_CTRL_INTMASK;
|
||||
}
|
||||
|
||||
UINT32 timer_get_status(timer *tim)
|
||||
{
|
||||
return tim->TIMER_INT_STATUS;
|
||||
return tim->TIMER_INT_STATUS;
|
||||
}
|
||||
|
||||
UINT32 timer_get_eoi(timer *tim)
|
||||
{
|
||||
return tim->TIMER_EOI;
|
||||
return tim->TIMER_EOI;
|
||||
}
|
||||
|
||||
UINT32 timer_get_value(timer *tim)
|
||||
{
|
||||
return tim->TIMER_LOAD_COUNT - tim->TIMER_CURRENT_VALUE;
|
||||
return tim->TIMER_LOAD_COUNT - tim->TIMER_CURRENT_VALUE;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* Include Section
|
||||
* add all #include here
|
||||
@@ -79,33 +79,33 @@
|
||||
|
||||
int uart_init(uart *port)
|
||||
{
|
||||
port->UART_IER = 0;
|
||||
port->UART_LCR = 0;
|
||||
//port->UART_DLL = 0;
|
||||
//port->UART_DLH = 0;
|
||||
port->UART_IER = 0;
|
||||
port->UART_LCR = 0;
|
||||
//port->UART_DLL = 0;
|
||||
//port->UART_DLH = 0;
|
||||
}
|
||||
|
||||
UINT32 uart_get_status(uart *port)
|
||||
{
|
||||
return port->UART_USR;
|
||||
return port->UART_USR;
|
||||
}
|
||||
|
||||
|
||||
void uart_configure(uart *port, enum data_bits data_bit,
|
||||
enum stop_bits stop_bit, enum parity parity,
|
||||
UINT32 buard_rate, UINT32 uart_clk)
|
||||
enum stop_bits stop_bit, enum parity parity,
|
||||
UINT32 buard_rate, UINT32 uart_clk)
|
||||
{
|
||||
UINT32 divisor;
|
||||
UINT32 freq;
|
||||
UINT32 baud_div;
|
||||
UINT32 lcr_reg = 0;
|
||||
UINT32 ret;
|
||||
UINT32 divisor;
|
||||
UINT32 freq;
|
||||
UINT32 baud_div;
|
||||
UINT32 lcr_reg = 0;
|
||||
UINT32 ret;
|
||||
|
||||
/*divisor = DIV(buard_rate);
|
||||
port->UART_LCR |= UART_LCR_DLAB;
|
||||
port->UART_DLL = divisor & 0xFF;
|
||||
port->UART_DLH = (divisor >> 8) & 0xFF;
|
||||
port->UART_LCR &= ~UART_LCR_DLAB;*/
|
||||
/*divisor = DIV(buard_rate);
|
||||
port->UART_LCR |= UART_LCR_DLAB;
|
||||
port->UART_DLL = divisor & 0xFF;
|
||||
port->UART_DLH = (divisor >> 8) & 0xFF;
|
||||
port->UART_LCR &= ~UART_LCR_DLAB;*/
|
||||
|
||||
do{
|
||||
//clear fifo...
|
||||
@@ -113,141 +113,141 @@ void uart_configure(uart *port, enum data_bits data_bit,
|
||||
//read status..
|
||||
ret = uart_get_status(port);
|
||||
}while(ret & UART_USR_BUSY);
|
||||
switch (data_bit) {
|
||||
case UART_DATA_BIT5:
|
||||
lcr_reg |= UART_LCR_DLS5;
|
||||
break;
|
||||
case UART_DATA_BIT6:
|
||||
lcr_reg |= UART_LCR_DLS6;
|
||||
break;
|
||||
case UART_DATA_BIT7:
|
||||
lcr_reg |= UART_LCR_DLS7;
|
||||
break;
|
||||
case UART_DATA_BIT8:
|
||||
lcr_reg |= UART_LCR_DLS8;
|
||||
break;
|
||||
default:
|
||||
lcr_reg |= UART_LCR_DLS8;
|
||||
break;
|
||||
}
|
||||
switch (data_bit) {
|
||||
case UART_DATA_BIT5:
|
||||
lcr_reg |= UART_LCR_DLS5;
|
||||
break;
|
||||
case UART_DATA_BIT6:
|
||||
lcr_reg |= UART_LCR_DLS6;
|
||||
break;
|
||||
case UART_DATA_BIT7:
|
||||
lcr_reg |= UART_LCR_DLS7;
|
||||
break;
|
||||
case UART_DATA_BIT8:
|
||||
lcr_reg |= UART_LCR_DLS8;
|
||||
break;
|
||||
default:
|
||||
lcr_reg |= UART_LCR_DLS8;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (stop_bit) {
|
||||
case UART_STOP_BIT1:
|
||||
lcr_reg |= UART_LCR_STOP1;
|
||||
break;
|
||||
case UART_STOP_BIT2:
|
||||
lcr_reg |= UART_LCR_STOP2;
|
||||
break;
|
||||
default:
|
||||
lcr_reg |= UART_LCR_STOP1;
|
||||
break;
|
||||
}
|
||||
switch (stop_bit) {
|
||||
case UART_STOP_BIT1:
|
||||
lcr_reg |= UART_LCR_STOP1;
|
||||
break;
|
||||
case UART_STOP_BIT2:
|
||||
lcr_reg |= UART_LCR_STOP2;
|
||||
break;
|
||||
default:
|
||||
lcr_reg |= UART_LCR_STOP1;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (parity) {
|
||||
case UART_PARITY_EVEN:
|
||||
lcr_reg |= UART_LCR_EVEN | UART_LCR_PEN;
|
||||
break;
|
||||
case UART_PARITY_ODD:
|
||||
lcr_reg |= UART_LCR_PEN;
|
||||
break;
|
||||
case UART_PARITY_ST:
|
||||
lcr_reg |= UART_LCR_SP;
|
||||
break;
|
||||
case UART_PARITY_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (parity) {
|
||||
case UART_PARITY_EVEN:
|
||||
lcr_reg |= UART_LCR_EVEN | UART_LCR_PEN;
|
||||
break;
|
||||
case UART_PARITY_ODD:
|
||||
lcr_reg |= UART_LCR_PEN;
|
||||
break;
|
||||
case UART_PARITY_ST:
|
||||
lcr_reg |= UART_LCR_SP;
|
||||
break;
|
||||
case UART_PARITY_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
switch (buard_rate) {
|
||||
case 115200:
|
||||
baud_div = BAUDRATE_115200;
|
||||
break;
|
||||
case 57600:
|
||||
baud_div = BAUDRATE_57600;
|
||||
break;
|
||||
case 38400:
|
||||
baud_div = BAUDRATE_38400;
|
||||
break;
|
||||
case 19200:
|
||||
baud_div = BAUDRATE_19200;
|
||||
break;
|
||||
case 9600:
|
||||
baud_div = BAUDRATE_9600;
|
||||
break;
|
||||
default:
|
||||
baud_div = BAUDRATE_115200;
|
||||
break;
|
||||
}
|
||||
switch (buard_rate) {
|
||||
case 115200:
|
||||
baud_div = BAUDRATE_115200;
|
||||
break;
|
||||
case 57600:
|
||||
baud_div = BAUDRATE_57600;
|
||||
break;
|
||||
case 38400:
|
||||
baud_div = BAUDRATE_38400;
|
||||
break;
|
||||
case 19200:
|
||||
baud_div = BAUDRATE_19200;
|
||||
break;
|
||||
case 9600:
|
||||
baud_div = BAUDRATE_9600;
|
||||
break;
|
||||
default:
|
||||
baud_div = BAUDRATE_115200;
|
||||
break;
|
||||
}
|
||||
|
||||
//clear fifo
|
||||
port->UART_FCR = UART_FCR_RFIFOR | UART_FCR_XFIFOR;
|
||||
//clear fifo
|
||||
port->UART_FCR = UART_FCR_RFIFOR | UART_FCR_XFIFOR;
|
||||
|
||||
//div
|
||||
ret = port->UART_LCR;
|
||||
ret |= UART_LCR_DLAB;
|
||||
port->UART_LCR = ret;
|
||||
port->RBRTHRDLL = baud_div & 0x00ff;
|
||||
port->DLHIER = (baud_div & 0x00ff)>>8;
|
||||
/* clear DLAB */
|
||||
ret = ret & 0x7f;
|
||||
port->UART_LCR = ret;
|
||||
//div
|
||||
ret = port->UART_LCR;
|
||||
ret |= UART_LCR_DLAB;
|
||||
port->UART_LCR = ret;
|
||||
port->RBRTHRDLL = baud_div & 0x00ff;
|
||||
port->DLHIER = (baud_div & 0x00ff)>>8;
|
||||
/* clear DLAB */
|
||||
ret = ret & 0x7f;
|
||||
port->UART_LCR = ret;
|
||||
|
||||
//line control
|
||||
port->UART_LCR = lcr_reg;
|
||||
//fifo control
|
||||
port->UART_FCR = UART_FCR_FIFOE | UART_FCR_RFIFOR | UART_FCR_XFIFOR | UART_FCR_TET_1_4 | UART_FCR_RT_ONE;
|
||||
//line control
|
||||
port->UART_LCR = lcr_reg;
|
||||
//fifo control
|
||||
port->UART_FCR = UART_FCR_FIFOE | UART_FCR_RFIFOR | UART_FCR_XFIFOR | UART_FCR_TET_1_4 | UART_FCR_RT_ONE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int uart_enable_irq(uart *port, UINT32 mode)
|
||||
{
|
||||
unsigned int ret;
|
||||
ret = port->UART_IER;
|
||||
ret |= mode;
|
||||
port->UART_IER = ret;
|
||||
unsigned int ret;
|
||||
ret = port->UART_IER;
|
||||
ret |= mode;
|
||||
port->UART_IER = ret;
|
||||
}
|
||||
|
||||
int uart_disable_irq(uart *port, UINT32 mode)
|
||||
{
|
||||
unsigned int ret;
|
||||
ret = port->UART_IER;
|
||||
ret &= ~mode;
|
||||
unsigned int ret;
|
||||
ret = port->UART_IER;
|
||||
ret &= ~mode;
|
||||
|
||||
port->UART_IER = ret;
|
||||
port->UART_IER = ret;
|
||||
}
|
||||
|
||||
UINT32 uart_get_iir_status(uart *port)
|
||||
{
|
||||
return port->UART_IIR;
|
||||
return port->UART_IIR;
|
||||
}
|
||||
|
||||
UINT32 uart_get_line_status(uart *port)
|
||||
{
|
||||
return port->UART_LSR;
|
||||
return port->UART_LSR;
|
||||
}
|
||||
|
||||
UINT32 uart_is_rx_ready(uart *port)
|
||||
{
|
||||
return port->UART_LSR & UART_LSR_DR;
|
||||
return port->UART_LSR & UART_LSR_DR;
|
||||
}
|
||||
|
||||
UINT8 uart_getc(uart *port)
|
||||
{
|
||||
return port->UART_RBR & 0xFF;
|
||||
return port->UART_RBR & 0xFF;
|
||||
}
|
||||
|
||||
void uart_putc(uart *port, UINT8 c)
|
||||
{
|
||||
//while(!(port->UART_USR & UART_USR_TFNF));
|
||||
port->UART_THR = c;
|
||||
//while(!(port->UART_USR & UART_USR_TFNF));
|
||||
port->UART_THR = c;
|
||||
}
|
||||
|
||||
void uart_set_fifo_mode(uart *port, UINT32 fifo_mode)
|
||||
{
|
||||
port->UART_FCR = fifo_mode;
|
||||
port->UART_FCR = fifo_mode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <rthw.h>
|
||||
#include "fh_def.h"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FH_GPIO_H_
|
||||
#define FH_GPIO_H_
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FH_I2C_H_
|
||||
#define FH_I2C_H_
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -30,21 +30,21 @@
|
||||
#include "fh_def.h"
|
||||
|
||||
typedef struct {
|
||||
RwReg IRQ_EN_L;
|
||||
RwReg IRQ_EN_H;
|
||||
RwReg IRQ_MASK_L;
|
||||
RwReg IRQ_MASK_H;
|
||||
RwReg IRQ_FORCE_L;
|
||||
RwReg IRQ_FORCE_H;
|
||||
RwReg IRQ_RAWSTARUS_L;
|
||||
RwReg IRQ_RAWSTARUS_H;
|
||||
RwReg IRQ_STATUS_L;
|
||||
RwReg IRQ_STATUS_H;
|
||||
RwReg IRQ_MASKSTATUS_L;
|
||||
RwReg IRQ_MASKSTATUS_H;
|
||||
RwReg IRQ_FINALSTATUS_L;
|
||||
RwReg IRQ_FINALSTATUS_H;
|
||||
RwReg IRQ_VECTOR;
|
||||
RwReg IRQ_EN_L;
|
||||
RwReg IRQ_EN_H;
|
||||
RwReg IRQ_MASK_L;
|
||||
RwReg IRQ_MASK_H;
|
||||
RwReg IRQ_FORCE_L;
|
||||
RwReg IRQ_FORCE_H;
|
||||
RwReg IRQ_RAWSTARUS_L;
|
||||
RwReg IRQ_RAWSTARUS_H;
|
||||
RwReg IRQ_STATUS_L;
|
||||
RwReg IRQ_STATUS_H;
|
||||
RwReg IRQ_MASKSTATUS_L;
|
||||
RwReg IRQ_MASKSTATUS_H;
|
||||
RwReg IRQ_FINALSTATUS_L;
|
||||
RwReg IRQ_FINALSTATUS_H;
|
||||
RwReg IRQ_VECTOR;
|
||||
}fh_intc;
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -32,53 +32,53 @@
|
||||
//#define __ASIC_BRANCH__
|
||||
|
||||
enum {
|
||||
CTRL = 0x0, /** Control */
|
||||
PWREN = 0x4, /** Power-enable */
|
||||
CLKDIV = 0x8, /** Clock divider */
|
||||
CLKSRC = 0xC, /** Clock source */
|
||||
CLKENA = 0x10, /** Clock enable */
|
||||
TMOUT = 0x14, /** Timeout */
|
||||
CTYPE = 0x18, /** Card type */
|
||||
BLKSIZ = 0x1C, /** Block Size */
|
||||
BYTCNT = 0x20, /** Byte count */
|
||||
INTMSK = 0x24, /** Interrupt Mask */
|
||||
CMDARG = 0x28, /** Command Argument */
|
||||
CMD = 0x2C, /** Command */
|
||||
RESP0 = 0x30, /** Response 0 */
|
||||
RESP1 = 0x34, /** Response 1 */
|
||||
RESP2 = 0x38, /** Response 2 */
|
||||
RESP3 = 0x3C, /** Response 3 */
|
||||
MINTSTS = 0x40, /** Masked interrupt status */
|
||||
RINTSTS = 0x44, /** Raw interrupt status */
|
||||
STATUS = 0x48, /** Status */
|
||||
FIFOTH = 0x4C, /** FIFO threshold */
|
||||
CDETECT = 0x50, /** Card detect */
|
||||
WRTPRT = 0x54, /** Write protect */
|
||||
GPIO = 0x58, /** General Purpose IO */
|
||||
TCBCNT = 0x5C, /** Transferred CIU byte count */
|
||||
TBBCNT = 0x60, /** Transferred host/DMA to/from byte count */
|
||||
DEBNCE = 0x64, /** Card detect debounce */
|
||||
USRID = 0x68, /** User ID */
|
||||
VERID = 0x6C, /** Version ID */
|
||||
HCON = 0x70, /** Hardware Configuration */
|
||||
UHSREG = 0x74, /** Reserved */
|
||||
BMOD = 0x80, /** Bus mode Register */
|
||||
PLDMND = 0x84, /** Poll Demand */
|
||||
DBADDR = 0x88, /** Descriptor Base Address */
|
||||
IDSTS = 0x8C, /** Internal DMAC Status */
|
||||
IDINTEN = 0x90, /** Internal DMAC Interrupt Enable */
|
||||
DSCADDR = 0x94, /** Current Host Descriptor Address */
|
||||
BUFADDR = 0x98, /** Current Host Buffer Address */
|
||||
FIFODAT = 0x200, /** FIFO data read write */
|
||||
CTRL = 0x0, /** Control */
|
||||
PWREN = 0x4, /** Power-enable */
|
||||
CLKDIV = 0x8, /** Clock divider */
|
||||
CLKSRC = 0xC, /** Clock source */
|
||||
CLKENA = 0x10, /** Clock enable */
|
||||
TMOUT = 0x14, /** Timeout */
|
||||
CTYPE = 0x18, /** Card type */
|
||||
BLKSIZ = 0x1C, /** Block Size */
|
||||
BYTCNT = 0x20, /** Byte count */
|
||||
INTMSK = 0x24, /** Interrupt Mask */
|
||||
CMDARG = 0x28, /** Command Argument */
|
||||
CMD = 0x2C, /** Command */
|
||||
RESP0 = 0x30, /** Response 0 */
|
||||
RESP1 = 0x34, /** Response 1 */
|
||||
RESP2 = 0x38, /** Response 2 */
|
||||
RESP3 = 0x3C, /** Response 3 */
|
||||
MINTSTS = 0x40, /** Masked interrupt status */
|
||||
RINTSTS = 0x44, /** Raw interrupt status */
|
||||
STATUS = 0x48, /** Status */
|
||||
FIFOTH = 0x4C, /** FIFO threshold */
|
||||
CDETECT = 0x50, /** Card detect */
|
||||
WRTPRT = 0x54, /** Write protect */
|
||||
GPIO = 0x58, /** General Purpose IO */
|
||||
TCBCNT = 0x5C, /** Transferred CIU byte count */
|
||||
TBBCNT = 0x60, /** Transferred host/DMA to/from byte count */
|
||||
DEBNCE = 0x64, /** Card detect debounce */
|
||||
USRID = 0x68, /** User ID */
|
||||
VERID = 0x6C, /** Version ID */
|
||||
HCON = 0x70, /** Hardware Configuration */
|
||||
UHSREG = 0x74, /** Reserved */
|
||||
BMOD = 0x80, /** Bus mode Register */
|
||||
PLDMND = 0x84, /** Poll Demand */
|
||||
DBADDR = 0x88, /** Descriptor Base Address */
|
||||
IDSTS = 0x8C, /** Internal DMAC Status */
|
||||
IDINTEN = 0x90, /** Internal DMAC Interrupt Enable */
|
||||
DSCADDR = 0x94, /** Current Host Descriptor Address */
|
||||
BUFADDR = 0x98, /** Current Host Buffer Address */
|
||||
FIFODAT = 0x200, /** FIFO data read write */
|
||||
};
|
||||
|
||||
/* Control register definitions */
|
||||
#define CTRL_RESET 0x00000001
|
||||
#define CTRL_RESET 0x00000001
|
||||
#define FIFO_RESET 0x00000002
|
||||
#define DMA_RESET 0x00000004
|
||||
#define INT_ENABLE 0x00000010
|
||||
#define READ_WAIT 0x00000040
|
||||
#define CTRL_USE_IDMAC 0x02000000
|
||||
#define DMA_RESET 0x00000004
|
||||
#define INT_ENABLE 0x00000010
|
||||
#define READ_WAIT 0x00000040
|
||||
#define CTRL_USE_IDMAC 0x02000000
|
||||
|
||||
/* Interrupt mask defines */
|
||||
#define INTMSK_CDETECT 0x00000001
|
||||
@@ -102,11 +102,11 @@ enum {
|
||||
#define INTMASK_ERROR (INTMSK_RESP_ERR|INTMSK_RCRC|INTMSK_DCRC|INTMSK_RTO|INTMSK_DTO|INTMSK_HTO|INTMSK_FRUN|INTMSK_HLE|INTMSK_SBE|INTMSK_EBE)
|
||||
|
||||
/*BMOD register define */
|
||||
#define BMOD_SWR 0x00000001
|
||||
#define BMOD_DE 0x00000080
|
||||
#define BMOD_SWR 0x00000001
|
||||
#define BMOD_DE 0x00000080
|
||||
|
||||
/* for STATUS register */
|
||||
#define GET_FIFO_COUNT(x) (((x)&0x3ffe0000)>>17)
|
||||
#define GET_FIFO_COUNT(x) (((x)&0x3ffe0000)>>17)
|
||||
#define GET_FIFO_DEPTH(x) ((((x)&0x0FFF0000)>>16)+1)
|
||||
|
||||
/* for IDMA intr register */
|
||||
@@ -122,62 +122,62 @@ enum {
|
||||
|
||||
/* Define Card status bits (R1 response) */
|
||||
#define R1CS_ADDRESS_OUT_OF_RANGE 0x80000000
|
||||
#define R1CS_ADDRESS_MISALIGN 0x40000000
|
||||
#define R1CS_BLOCK_LEN_ERR 0x20000000
|
||||
#define R1CS_ERASE_SEQ_ERR 0x10000000
|
||||
#define R1CS_ERASE_PARAM 0x08000000
|
||||
#define R1CS_WP_VIOLATION 0x04000000
|
||||
#define R1CS_CARD_IS_LOCKED 0x02000000
|
||||
#define R1CS_LCK_UNLCK_FAILED 0x01000000
|
||||
#define R1CS_COM_CRC_ERROR 0x00800000
|
||||
#define R1CS_ILLEGAL_COMMAND 0x00400000
|
||||
#define R1CS_CARD_ECC_FAILED 0x00200000
|
||||
#define R1CS_CC_ERROR 0x00100000
|
||||
#define R1CS_ERROR 0x00080000
|
||||
#define R1CS_UNDERRUN 0x00040000
|
||||
#define R1CS_OVERRUN 0x00020000
|
||||
#define R1CS_CSD_OVERWRITE 0x00010000
|
||||
#define R1CS_WP_ERASE_SKIP 0x00008000
|
||||
#define R1CS_RESERVED_0 0x00004000
|
||||
#define R1CS_ERASE_RESET 0x00002000
|
||||
#define R1CS_CURRENT_STATE_MASK 0x00001e00
|
||||
#define R1CS_READY_FOR_DATA 0x00000100
|
||||
#define R1CS_SWITCH_ERROR 0x00000080
|
||||
#define R1CS_RESERVED_1 0x00000040
|
||||
#define R1CS_APP_CMD 0x00000020
|
||||
#define R1CS_RESERVED_2 0x00000010
|
||||
#define R1CS_APP_SPECIFIC_MASK 0x0000000c
|
||||
#define R1CS_MANUFAC_TEST_MASK 0x00000003
|
||||
#define R1CS_ERROR_OCCURED_MAP 0xfdffa080
|
||||
#define R1CS_CURRENT_STATE(x) (((x)&R1CS_CURRENT_STATE_MASK)>>9)
|
||||
#define R1CS_ADDRESS_MISALIGN 0x40000000
|
||||
#define R1CS_BLOCK_LEN_ERR 0x20000000
|
||||
#define R1CS_ERASE_SEQ_ERR 0x10000000
|
||||
#define R1CS_ERASE_PARAM 0x08000000
|
||||
#define R1CS_WP_VIOLATION 0x04000000
|
||||
#define R1CS_CARD_IS_LOCKED 0x02000000
|
||||
#define R1CS_LCK_UNLCK_FAILED 0x01000000
|
||||
#define R1CS_COM_CRC_ERROR 0x00800000
|
||||
#define R1CS_ILLEGAL_COMMAND 0x00400000
|
||||
#define R1CS_CARD_ECC_FAILED 0x00200000
|
||||
#define R1CS_CC_ERROR 0x00100000
|
||||
#define R1CS_ERROR 0x00080000
|
||||
#define R1CS_UNDERRUN 0x00040000
|
||||
#define R1CS_OVERRUN 0x00020000
|
||||
#define R1CS_CSD_OVERWRITE 0x00010000
|
||||
#define R1CS_WP_ERASE_SKIP 0x00008000
|
||||
#define R1CS_RESERVED_0 0x00004000
|
||||
#define R1CS_ERASE_RESET 0x00002000
|
||||
#define R1CS_CURRENT_STATE_MASK 0x00001e00
|
||||
#define R1CS_READY_FOR_DATA 0x00000100
|
||||
#define R1CS_SWITCH_ERROR 0x00000080
|
||||
#define R1CS_RESERVED_1 0x00000040
|
||||
#define R1CS_APP_CMD 0x00000020
|
||||
#define R1CS_RESERVED_2 0x00000010
|
||||
#define R1CS_APP_SPECIFIC_MASK 0x0000000c
|
||||
#define R1CS_MANUFAC_TEST_MASK 0x00000003
|
||||
#define R1CS_ERROR_OCCURED_MAP 0xfdffa080
|
||||
#define R1CS_CURRENT_STATE(x) (((x)&R1CS_CURRENT_STATE_MASK)>>9)
|
||||
|
||||
/* R5 response */
|
||||
#define R5_IO_CRC_ERR 0x00008000
|
||||
#define R5_IO_BAD_CMD 0x00004000
|
||||
#define R5_IO_GEN_ERR 0x00000800
|
||||
#define R5_IO_FUNC_ERR 0x00000200
|
||||
#define R5_IO_CRC_ERR 0x00008000
|
||||
#define R5_IO_BAD_CMD 0x00004000
|
||||
#define R5_IO_GEN_ERR 0x00000800
|
||||
#define R5_IO_FUNC_ERR 0x00000200
|
||||
#define R5_IO_OUT_RANGE 0x00000100
|
||||
#define R5_IO_ERR_BITS 0x0000cb00
|
||||
#define R5_IO_ERR_BITS 0x0000cb00
|
||||
|
||||
enum {
|
||||
NONE_TYPE = 0,
|
||||
SD_TYPE,
|
||||
SD_2_0_TYPE,
|
||||
SDIO_TYPE,
|
||||
NONE_TYPE = 0,
|
||||
SD_TYPE,
|
||||
SD_2_0_TYPE,
|
||||
SDIO_TYPE,
|
||||
};
|
||||
|
||||
enum {
|
||||
CARD_STATE_EMPTY = -1,
|
||||
CARD_STATE_IDLE = 0,
|
||||
CARD_STATE_READY = 1,
|
||||
CARD_STATE_IDENT = 2,
|
||||
CARD_STATE_STBY = 3,
|
||||
CARD_STATE_TRAN = 4,
|
||||
CARD_STATE_DATA = 5,
|
||||
CARD_STATE_RCV = 6,
|
||||
CARD_STATE_PRG = 7,
|
||||
CARD_STATE_DIS = 8,
|
||||
CARD_STATE_INA = 9
|
||||
CARD_STATE_EMPTY = -1,
|
||||
CARD_STATE_IDLE = 0,
|
||||
CARD_STATE_READY = 1,
|
||||
CARD_STATE_IDENT = 2,
|
||||
CARD_STATE_STBY = 3,
|
||||
CARD_STATE_TRAN = 4,
|
||||
CARD_STATE_DATA = 5,
|
||||
CARD_STATE_RCV = 6,
|
||||
CARD_STATE_PRG = 7,
|
||||
CARD_STATE_DIS = 8,
|
||||
CARD_STATE_INA = 9
|
||||
};
|
||||
|
||||
enum DmaDescriptorDES1 // Buffer's size field of Descriptor
|
||||
@@ -204,28 +204,28 @@ enum DmaDescriptorDES0 // Control and status word of DMA descriptor DES0
|
||||
};
|
||||
|
||||
typedef struct DmaDescStruct {
|
||||
unsigned int desc0; /* control and status information of descriptor */
|
||||
unsigned int desc1; /* buffer sizes */
|
||||
unsigned int desc2; /* physical address of the buffer 1 */
|
||||
unsigned int desc3; /* physical address of the buffer 2 */
|
||||
unsigned int desc0; /* control and status information of descriptor */
|
||||
unsigned int desc1; /* buffer sizes */
|
||||
unsigned int desc2; /* physical address of the buffer 1 */
|
||||
unsigned int desc3; /* physical address of the buffer 2 */
|
||||
}DmaDesc;
|
||||
|
||||
typedef struct {
|
||||
unsigned int wkmod;
|
||||
volatile DmaDesc *pDmaDesc;
|
||||
unsigned int idma_support;
|
||||
unsigned int rca;
|
||||
unsigned int ip_base;
|
||||
unsigned int card_type;
|
||||
unsigned int fifo_depth;
|
||||
unsigned int fifo_threth;
|
||||
unsigned int sectors;
|
||||
unsigned int scr[2];
|
||||
unsigned int csd[4];
|
||||
unsigned int idsts;
|
||||
rt_sem_t sem;
|
||||
rt_sem_t mutex;
|
||||
void (*cb)(void);
|
||||
unsigned int wkmod;
|
||||
volatile DmaDesc *pDmaDesc;
|
||||
unsigned int idma_support;
|
||||
unsigned int rca;
|
||||
unsigned int ip_base;
|
||||
unsigned int card_type;
|
||||
unsigned int fifo_depth;
|
||||
unsigned int fifo_threth;
|
||||
unsigned int sectors;
|
||||
unsigned int scr[2];
|
||||
unsigned int csd[4];
|
||||
unsigned int idsts;
|
||||
rt_sem_t sem;
|
||||
rt_sem_t mutex;
|
||||
void (*cb)(void);
|
||||
} sdc_t;
|
||||
|
||||
#define ONE_BIT_MODE (0)
|
||||
@@ -244,55 +244,55 @@ typedef struct {
|
||||
|
||||
|
||||
enum {
|
||||
ERRNOERROR = 0,
|
||||
|
||||
// for raw interrupt status error
|
||||
ERRRESPRECEP, // 1
|
||||
ERRRESPCRC,
|
||||
ERRDCRC,
|
||||
ERRRESPTIMEOUT,
|
||||
ERRDRTIMEOUT,
|
||||
ERRUNDERWRITE,
|
||||
ERROVERREAD,
|
||||
ERRHLE,
|
||||
ERRSTARTBIT,
|
||||
ERRENDBITERR, // 10
|
||||
ERRNOERROR = 0,
|
||||
|
||||
// for R1 response
|
||||
ERRADDRESSRANGE, // 11
|
||||
ERRADDRESSMISALIGN,
|
||||
ERRBLOCKLEN,
|
||||
ERRERASESEQERR,
|
||||
ERRERASEPARAM,
|
||||
ERRPROT,
|
||||
ERRCARDLOCKED,
|
||||
ERRCRC,
|
||||
ERRILLEGALCOMMAND,
|
||||
ERRECCFAILED,
|
||||
ERRCCERR,
|
||||
ERRUNKNOWN,
|
||||
ERRUNDERRUN,
|
||||
ERROVERRUN,
|
||||
ERRCSDOVERWRITE,
|
||||
ERRERASERESET,
|
||||
ERRFSMSTATE, // 27
|
||||
// for raw interrupt status error
|
||||
ERRRESPRECEP, // 1
|
||||
ERRRESPCRC,
|
||||
ERRDCRC,
|
||||
ERRRESPTIMEOUT,
|
||||
ERRDRTIMEOUT,
|
||||
ERRUNDERWRITE,
|
||||
ERROVERREAD,
|
||||
ERRHLE,
|
||||
ERRSTARTBIT,
|
||||
ERRENDBITERR, // 10
|
||||
|
||||
// for R5 response
|
||||
ERRBADFUNC, // 28
|
||||
// for R1 response
|
||||
ERRADDRESSRANGE, // 11
|
||||
ERRADDRESSMISALIGN,
|
||||
ERRBLOCKLEN,
|
||||
ERRERASESEQERR,
|
||||
ERRERASEPARAM,
|
||||
ERRPROT,
|
||||
ERRCARDLOCKED,
|
||||
ERRCRC,
|
||||
ERRILLEGALCOMMAND,
|
||||
ERRECCFAILED,
|
||||
ERRCCERR,
|
||||
ERRUNKNOWN,
|
||||
ERRUNDERRUN,
|
||||
ERROVERRUN,
|
||||
ERRCSDOVERWRITE,
|
||||
ERRERASERESET,
|
||||
ERRFSMSTATE, // 27
|
||||
|
||||
// others
|
||||
ERRCARDNOTCONN, // 29
|
||||
ERRCARDWPROTECT,
|
||||
ERRCMDRETRIESOVER,
|
||||
ERRNOTSUPPORTED,
|
||||
ERRHARDWARE,
|
||||
ERRDATANOTREADY,
|
||||
ERRCARDINTERNAL,
|
||||
ERRACMD41TIMEOUT,
|
||||
ERRIDMA,
|
||||
ERRNORES,
|
||||
// for R5 response
|
||||
ERRBADFUNC, // 28
|
||||
|
||||
ERRNOTEQUAL,
|
||||
// others
|
||||
ERRCARDNOTCONN, // 29
|
||||
ERRCARDWPROTECT,
|
||||
ERRCMDRETRIESOVER,
|
||||
ERRNOTSUPPORTED,
|
||||
ERRHARDWARE,
|
||||
ERRDATANOTREADY,
|
||||
ERRCARDINTERNAL,
|
||||
ERRACMD41TIMEOUT,
|
||||
ERRIDMA,
|
||||
ERRNORES,
|
||||
|
||||
ERRNOTEQUAL,
|
||||
};
|
||||
|
||||
#ifdef __ASIC_BRANCH__
|
||||
@@ -352,5 +352,5 @@ extern int sdio_drv_creg_write(HSDC handle, int addr, int fn, unsigned char data
|
||||
|
||||
extern void inv_dcache_range(unsigned long start, unsigned long len);
|
||||
extern void flush_dcache_range(unsigned long start, unsigned long len);
|
||||
|
||||
|
||||
#endif //__sdcard_h__
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,12 +18,12 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FH_SPI_H_
|
||||
#define FH_SPI_H_
|
||||
|
||||
@@ -97,8 +97,8 @@
|
||||
#define SPI_STATUS_BUSY (1)
|
||||
|
||||
|
||||
#define SPI_TX_DMA (1<<1)
|
||||
#define SPI_RX_DMA (1<<0)
|
||||
#define SPI_TX_DMA (1<<1)
|
||||
#define SPI_RX_DMA (1<<0)
|
||||
|
||||
|
||||
struct spi_config
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* This file is part of FH8620 BSP for RT-Thread distribution.
|
||||
*
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
* Copyright (c) 2016 Shanghai Fullhan Microelectronics Co., Ltd.
|
||||
* All rights reserved
|
||||
*
|
||||
* 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
|
||||
@@ -18,7 +18,7 @@
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
* Visit http://www.fullhan.com to get contact with Fullhan.
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/****************************************************************************
|
||||
* #include section
|
||||
* add #include here if any
|
||||
* add #include here if any
|
||||
***************************************************************************/
|
||||
#include "fh_def.h"
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/****************************************************************************
|
||||
* #define section
|
||||
* add constant #define here if any
|
||||
* add constant #define here if any
|
||||
***************************************************************************/
|
||||
#define TIMER_CTRL_ENABLE (1u << 0)
|
||||
#define TIMER_CTRL_MODE (1u << 1)
|
||||
@@ -49,19 +49,19 @@
|
||||
|
||||
/****************************************************************************
|
||||
* ADT section
|
||||
* add Abstract Data Type definition here
|
||||
* add Abstract Data Type definition here
|
||||
***************************************************************************/
|
||||
typedef struct {
|
||||
RwReg TIMER_LOAD_COUNT;
|
||||
RwReg TIMER_CURRENT_VALUE;
|
||||
RwReg TIMER_CTRL_REG;
|
||||
RwReg TIMER_EOI;
|
||||
RwReg TIMER_INT_STATUS;
|
||||
RwReg TIMER_LOAD_COUNT;
|
||||
RwReg TIMER_CURRENT_VALUE;
|
||||
RwReg TIMER_CTRL_REG;
|
||||
RwReg TIMER_EOI;
|
||||
RwReg TIMER_INT_STATUS;
|
||||
}timer;
|
||||
|
||||
enum timer_mode {
|
||||
TIMER_MODE_PERIODIC = 0,
|
||||
TIMER_MODE_ONESHOT = 1,
|
||||
TIMER_MODE_PERIODIC = 0,
|
||||
TIMER_MODE_ONESHOT = 1,
|
||||
};
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ typedef struct {
|
||||
|
||||
/****************************************************************************
|
||||
* section
|
||||
* add function prototype here if any
|
||||
* add function prototype here if any
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user