📄 dbgu_serial.c
字号:
/*
* TOPPERS/ASP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Advanced Standard Profile Kernel
*
* Copyright (C) 2007 by GJ Business Division RICOH COMPANY,LTD. JAPAN
* Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 惧淡螟侯涪荚は·笆布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェ
* ア∈塑ソフトウェアを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖
* 恃ˇ浩芹邵∈笆布·网脱と钙ぶ∷することを痰浸で钓满するˉ
* (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯
* 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖
* スコ〖ド面に崔まれていることˉ
* (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗
* 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱
* 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡
* の痰瘦沮惮年を非很することˉ
* (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗
* 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ
* とˉ
* (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟
* 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ
* (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに
* 鼠桂することˉ
* (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄
* 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ
* また·塑ソフトウェアのユ〖ザまたはエンドユ〖ザからのいかなる妄
* 统に答づく懒滇からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを
* 倘勒することˉ
*
* 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お
* よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·泼年の蝗脱誊弄
* に滦する努圭拉も崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェ
* アの网脱により木儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·そ
* の勒扦を砷わないˉ
*
* @(#) $Id: dbgu_serial.c 948 2008-04-14 08:34:27Z ertl-honda $
*/
/*
* シリアルI/Oデバイス∈SIO∷ドライバ∈AT91SAM7S脱∷
*/
#include <kernel.h>
#include <t_syslog.h>
#include "at91sam7s.h"
#include "target_serial.h"
/*
* シリアルI/Oポ〖ト介袋步ブロックの年盗
*/
typedef struct sio_port_initialization_block
{
void* uart_base;
void* linectrl_pdr;
uint32_t pdr_bit;
}
SIOPINIB;
/*
* シリアルI/Oポ〖ト瓷妄ブロックの年盗
*/
struct sio_port_control_block
{
const SIOPINIB *p_siopinib; /* シリアルI/Oポ〖ト介袋步ブロック */
intptr_t exinf; /* 橙磨攫鼠 */
bool_t openflag; /* オ〖プン貉みフラグ */
bool_t sendflag; /* 流慨充哈みイネ〖ブルフラグ */
bool_t getready; /* 矢机を减慨した觉轮 */
bool_t putready; /* 矢机を流慨できる觉轮 */
};
/*
* シリアルI/Oポ〖ト介袋步ブロック
*/
const SIOPINIB siopinib_table[TNUM_SIOP] = {
{(void*)(TADR_DBGU_BASE),
(void*)(TADR_PIO_BASE+TOFF_PIO_PDR),
(uint32_t)(TOFF_PIO_PDR_VAL)
}
};
/*
* シリアルI/Oポ〖ト瓷妄ブロックのエリア
*/
SIOPCB siopcb_table[TNUM_SIOP];
/*
* シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ
*/
#define INDEX_SIOP(siopid) ((uint_t)((siopid) - 1))
#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
/*
* 矢机を减慨したか?
*/
Inline bool_t
uart_getready(SIOPCB *p_siopcb)
{
return(((sil_rew_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_CSR)) & US_RXRDY)!=0));
}
/*
* 矢机を流慨できるか?
*/
Inline bool_t
uart_putready(SIOPCB *p_siopcb)
{
return((sil_rew_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_CSR)) & US_TXEMPTY)!=0);
}
/*
* 减慨した矢机の艰り叫し
*/
Inline uint8_t
uart_getchar(SIOPCB *p_siopcb)
{
return(sil_rew_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_RHR)));
}
/*
* 流慨する矢机の今き哈み
*/
Inline void
uart_putchar(SIOPCB *p_siopcb, uint8_t c)
{
sil_wrw_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_THR),c);
}
/*
* 流慨充哈み钓材
*/
Inline void
uart_enable_send(SIOPCB *p_siopcb)
{
sil_wrw_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_IER), US_TXEMPTY);
}
/*
* 流慨充哈み敦贿
*/
Inline void
uart_disable_send(SIOPCB *p_siopcb)
{
sil_wrw_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_IDR), US_TXEMPTY);
}
/*
* 减慨充哈み钓材
*/
Inline void
uart_enable_rcv(SIOPCB *p_siopcb)
{
sil_wrw_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_IER), US_RXRDY);
}
/*
* 减慨充哈み敦贿
*/
Inline void
uart_disable_rcv(SIOPCB *p_siopcb)
{
sil_wrw_mem((void*)(p_siopcb->p_siopinib->uart_base+TOFF_US_IDR), US_RXRDY);
}
/*
* SIOドライバの介袋步
*/
void
sio_initialize(intptr_t exinf)
{
SIOPCB *p_siopcb;
uint_t i;
/*
* シリアルI/Oポ〖ト瓷妄ブロックの介袋步
*/
for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
p_siopcb->p_siopinib = &(siopinib_table[i]);
p_siopcb->openflag = false;
p_siopcb->sendflag = false;
}
}
/*
* シリアルI/Oポ〖トのオ〖プン
*/
SIOPCB *
at91sam7s_uart_opn_por(SIOPCB *p_siopcb, intptr_t exinf)
{
uint32_t baud = ((MCK * 10) / (BAUDRATE * 16));
const SIOPINIB *p_siopinib;
p_siopinib = p_siopcb->p_siopinib;
/* Disable Interrupt */
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_IDR), 0xFFFFFFFF);
/* 流减慨敦贿 */
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_CR), (US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS));
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_PDC_RCR), 0);
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_PDC_TCR), 0);
/* PIOAのPA9,PA10をUARTで蝗脱 */
sil_wrw_mem((void*)p_siopinib->linectrl_pdr, p_siopinib->pdr_bit);
/* 8Data, 1Stop, No Parity */
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_MR), (US_CLKS_MCK|US_CHRL_8|US_PAR_NO|US_NBSTOP_1|US_CHMODE_NORMAL));
/* 115200bps */
if((baud % 10) >= 5){
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_BRGR), (baud/10)+1);
} else {
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_BRGR), (baud/10));
}
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_TTGR), 0);
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_CR), US_TXEN|US_RXEN);
sil_rew_mem((void*)(p_siopinib->uart_base+TOFF_US_RHR));
/*
* ボ〖レ〖ト肋年稿の略ち
*/
sil_dly_nse(200000);
p_siopcb->exinf = exinf;
p_siopcb->getready = p_siopcb->putready = false;
p_siopcb->openflag = true;
return(p_siopcb);
}
/*
* シリアルI/Oポ〖トのオ〖プン
*/
SIOPCB *
sio_opn_por(ID siopid, intptr_t exinf)
{
SIOPCB *p_siopcb = get_siopcb(siopid);
bool_t opnflg;
ER ercd;
/*
* オ〖プンしたポ〖トがあるかをopnflgに粕んでおくˉ
*/
opnflg = p_siopcb->openflag;
/*
* デバイス巴赂のオ〖プン借妄ˉ
*/
at91sam7s_uart_opn_por(p_siopcb, exinf);
/*
* シリアルI/O充哈みのマスクを豺近するˉ
*/
if (!opnflg) {
ercd = ena_int(INTNO_SIO);
assert(ercd == E_OK);
}
return(p_siopcb);
}
/*
* シリアルI/Oポ〖トのクロ〖ズ
*/
void
sio_cls_por(SIOPCB *p_siopcb)
{
/*
* デバイス巴赂のクロ〖ズ借妄ˉ
*/
const SIOPINIB *p_siopinib;
p_siopinib = p_siopcb->p_siopinib;
sil_wrw_mem((void*)(p_siopinib->uart_base+TOFF_US_CR), US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS);
p_siopcb->openflag = false;
/*
* シリアルI/O充哈みをマスクするˉ
*/
dis_int(INTNO_SIO);
}
/*
* SIOの充哈みハンドラ
*/
void
sio_isr(ID siopid)
{
SIOPCB *p_siopcb = &(siopcb_table[0]);
if (uart_getready(p_siopcb)) {
/*
* 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ
*/
sio_irdy_rcv(p_siopcb->exinf);
}
if (uart_putready(p_siopcb)) {
/*
* 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ
*/
sio_irdy_snd(p_siopcb->exinf);
}
}
/*
* シリアルI/Oポ〖トへの矢机流慨
*/
bool_t
sio_snd_chr(SIOPCB *siopcb, char_t c)
{
if (uart_putready(siopcb)) {
uart_putchar(siopcb, c);
return(true);
}
return(false);
}
/*
* シリアルI/Oポ〖トからの矢机减慨
*/
int_t
sio_rcv_chr(SIOPCB *siopcb)
{
if (uart_getready(siopcb)) {
return((int_t)(uint8_t) uart_getchar(siopcb));
}
return(false);
}
/*
* シリアルI/Oポ〖トからのコ〖ルバックの钓材
*/
void
sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
{
switch (cbrtn) {
case SIO_RDY_SND:
uart_enable_send(siopcb);
break;
case SIO_RDY_RCV:
uart_enable_rcv(siopcb);
break;
}
}
/*
* シリアルI/Oポ〖トからのコ〖ルバックの敦贿
*/
void
sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
{
switch (cbrtn) {
case SIO_RDY_SND:
uart_disable_send(siopcb);
break;
case SIO_RDY_RCV:
uart_disable_rcv(siopcb);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -