(toppers-users 4151) Re: TOPPERS/SSPのUARTポート変更方法

井上真人 masatoinoue00 @ gmail.com
2013年 10月 1日 (火) 22:47:41 JST


菊池様

(株)タカコムの井上と申します。本MLには初投稿させていただきます。

以下の対象パッケージにおいて、
シリアルドライバを1から4へ修正・変更した経験を元に、メールをお送りさせていただきます。
(R8Cの例でなく、申し訳ないです。)

■ 対象パッケージ:ssp_cq_frk_fm3_gcc-20130425.tar.gz
非依存部バージョン:1.2.0


■ 前提となる変更内容
TOPPERSのシリアルドライバの番号(SIO_PORTID)を”1”から”4"に変更する修正を行うものとします。
(これは、物理UARTチャンネル(以下、物理CH)を"UART-0"から"UART-3"に変更することと同意です。)
(私が修正した箇所を、「修正例:」としてます。)


(1) ssp\target\cq_frk_fm3_gcc\target_config.c
物理CH-3のハードウェア設定を追加します。

修正例:
#if  (SIO_PORTID ==1)
...
中略
...
#elif (SIO_PORTID == 4)
    /* MFS(RX,TX) CH3 */
    sil_orw((void *)EPFR7 , (0x03 << 22));    /* SIN3_2を使用 */
    sil_orw((void *)EPFR7 , (0x03 << 24));    /* SOT3_2を使用 */

    /* P48(SIN), P49(SOT) */
    sil_orw((void *)PFR4 , (1 << 8) | (1 << 9));

#endif


(2) ssp\target\cq_frk_fm3_gcc\target_serial.c
static const uint32_t sioreg_table[TNUM_PORT] に、
TNUM_PORT==3 が指定された場合に、物理CH-3のUARTレジスタにアクセスできるように修正します。

修正例:
static const uint32_t sioreg_table[TNUM_PORT] = {
    MFS_BASEADDR(0), /* ch-0 */
#if (TNUM_PORT >= 2)
    MFS_BASEADDR(1), /* ch-1 */
    MFS_BASEADDR(2), /* ch-2 */
    MFS_BASEADDR(3)  /* ch-3 */
#endif
};



(3) ssp\target\cq_frk_fm3_gcc\target_serial.h
SIO_PORTID == 4 に対応する、割り込みハンドラを定義します。

修正例:

#if (SIO_PORTID == 1)
...
中略
...
#elif (SIO_PORTID == 4)
#define INHNO_SIO_TX        INT_MFS3_TX
#define INTNO_SIO_TX        INT_MFS3_TX
#define INHNO_SIO_RX        INT_MFS3_RX
#define INTNO_SIO_RX        INT_MFS3_RX

#endif


(4) ssp\target\cq_frk_fm3_gcc\target_syssvc.h
#define TNUM_PORT
#define TNUM_SIOP
#define SIO_PORTID
をそれぞれ、再定義します。

特に、TNUM_PORT は(2)で定義する配列数になるので整合性がとれるよう修正します。

修正例:

#define TNUM_PORT        (4)        /* サポートするシリアルポートの数 */
#define TNUM_SIOP        (4)

/*
 *  使用するシリアルポートID
 */
#define SIO_PORTID        (4)



(5) ssp\target\cq_frk_fm3_gcc\target_test.h
#define LOGTASK_PORTID
#define TASK_PORTID
をそれぞれ修正します。

修正例
#define LOGTASK_PORTID        (4)
#define TASK_PORTID            (4)


(6) ssp\syssvc\serial.c
TNUM_PORTで定義された値に対応した、シリアル送受信バッファを再定義します。

修正例
#if TNUM_PORT >= 4                        /* ポート4に関する定義 */

#ifndef SERIAL_RCV_BUFSZ4
#define    SERIAL_RCV_BUFSZ4    64            /* ポート4の受信バッファサイズ */
#endif /* SERIAL_RCV_BUFSZ4 */

#ifndef SERIAL_SND_BUFSZ4
#define    SERIAL_SND_BUFSZ4    64            /* ポート4の送信バッファサイズ */
#endif /* SERIAL_SND_BUFSZ4 */

static char_t    rcv_buffer4[SERIAL_RCV_BUFSZ4];
static char_t    snd_buffer4[SERIAL_SND_BUFSZ4];

#endif /* TNUM_PORT >= 4 */




ざっと、R8Cのソースコードも見てみました。
cq_fm3とR8Cでは、書き方が異なる箇所があるのでそのままという訳にはいきませんが、大体同じポイントの修正でいけるかと思います。
target_serial.c だけは、131行目あたりも変更必要と思います。

素人ながら修正方針としては、以下の2点が考えられます。

■修正方針
方針(1): 現状、UART-1で動作しているので、それらを UART-0 用に書き換える。

方針(2): UART-1とUART-0 を SIO_PORTID をはじめとしたマクロ定義で置き換えることで両対応とする。
この場合、SIO_PORTIDは「0」だとエラーになるので、「2」にすることを前提とし、
上に挙げたソースコードで、UART-0 が動作するよう、つじつまを合わせるように修正する。

(2)の方針で修正されれば、動いているUART-1と比較しながら修正できますし、対応ポートが増えるので後々恩恵があると思われます。



稚拙な文で失礼いたしました。参考になれば幸いです。
以上、宜しくお願いします。

-- 
-------------------------------------------------
INOUE Masato
email:masatoinoue00 @ gmail.com



2013年10月1日 18:11 kikuchi <kikuchi @ watt.co.jp>:

> 高田先生
>
> 菊池です。
> LOGTASK_PORTIDとTASK_PORTIDを共に2にするとUART0,UART1からの出力はあり
> ません。
> LOGTASK_PORTIDを1にPORTIDを2にするとOPENエラーはなくなりますが、
> UART0からの入力は無視されるようです。
>
>
>
>
> Hiroaki TAKADAさんの<524A8EEE.4040905 @ ertl.jp>から
> >菊池様
> >
> >SSPカーネルのコードを見ていないので確信はないのですが、
> >
> >> シリアルポートの定義と思われる以下の(1)を(0)に変更してbuildしま
> >> したが、LOGTASK_PORTIDとTASK_PORTIDを共に(0)にすると全く表示されま
> >> せん。
> >
> >TOPPERSのシリアルドライバの番号は、1から始まります。0はエラーになり
> >ます。試しに、2にしたらどうなりますか?
> >
> >高田広章
> >名古屋大学
> >
> >(13/10/01 17:16), kikuchi wrote:
> >> Toppers 初心者の菊池です。
> >> 菊池です。
> >> どなたかご存じの方教えてください。
> >>
> >> R8C23用のSSP sample1をダウンロードして動作をチェックしています。
> >> 動作環境はHEWです。
> >> defaultのUART1では動作を確認しましたが、手元のハードウェアの関係で
> >> UART0に切り替えて動作しようとしていますが、全く動作しません。
> >> シリアルポートの定義と思われる以下の(1)を(0)に変更してbuildしま
> >> したが、LOGTASK_PORTIDとTASK_PORTIDを共に(0)にすると全く表示されま
> >> せん。
> >> C:\WorkSpace\Toppers\ssp\target\rsk_r8c23_hew\target_syssvc.h(103):
> #define LOGTASK_PORTID           (1)
> >> C:\WorkSpace\Toppers\ssp\target\rsk_r8c23_hew\target_test.h(62):
> #define TASK_PORTID         (1)
> >> C:\WorkSpace\Toppers\ssp\target\rsk_r8c23_hew\target_test.h(63):
> #define LOGTASK_PORTID              (1)
> >> TASK_PORTIDのみ(0)にすると
> >> Error at sample1.c :  caused by serial_opn_por(TASK_PORTID).
> >> Error at sample1.c  caused by serial_ctl_por(TASK_PORTID , IOCTL_CRLF).
> >> Sample program starts
> >>
> >> が表示されUARTのOPENエラーになります。
> >> 他にも変更が必要な個所があると思うのですが、検討が付きません。
> >> どなたか教えてください。
> >>
>
> --
> kikuchi mailto:kikuchi @ watt.co.jp
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.toppers.jp/pipermail/users/attachments/20131001/da16f7f8/attachment.html>