複数シリアルポートの同時使用対応
現状のシリアルポート実装は
という暗黙前提がある。
このため「システムに別のUART機器を接続したい」時にかなり不便である。
(例)GPSモジュールをつなぎたい。他の機器と通信したい。パソコンと接続したいが、ログ出力は別にみたい。など。
例えば、現状の実装の場合、複数のシリアルポートを使用する必要がある場合、
と3つの手順を踏まなければならない。 本来これらはカーネル依存部で吸収できる内容である。
そこで、以下のように実装を改め、カーネルユーザがtarget_syssvc.hを変更するだけで複数のシリアルポートを使えるように変更する。
#define SIO1_PORTID (1) #define SIO2_PORTID (2) #define SIO3_PORTID (3) #define SIO4_PORTID (4)
/** * \brief シリアルポート1のボーレート * \details * この定義を有効にした場合、PORT1が使用可能になる。 * 実装の詳細はtarget_config.cにある。 */ #define SIO_BAUD_RATE_PORT1 (57600)
switch (siopid) { case 1: #if defined(SIO_BAUD_RATE_PORT1) uart_write( reg, UART_DLL, DLL((SIO_UART_CLOCK/SIO_BAUD_RATE_PORT1/16)) ); uart_write( reg, UART_DLM, DLM((SIO_UART_CLOCK/SIO_BAUD_RATE_PORT1/16)) ); #endif
#if defined (SIO_BAUD_RATE_PORT2) #define INHNO_SIO2 INHNO_UART1 #define INTNO_SIO2 INHNO_UART1 #endif
#define INTPRI_SIO1 3 /* 割込み優先度 */ #define INTPRI_SIO2 3 /* 割込み優先度 */ #define INTPRI_SIO3 3 /* 割込み優先度 */ #define INTPRI_SIO4 3 /* 割込み優先度 */ #define INTATR_SIO1 0 /* 割込み属性 */ #define INTATR_SIO2 0 /* 割込み属性 */ #define INTATR_SIO3 0 /* 割込み属性 */ #define INTATR_SIO4 0 /* 割込み属性 */
#if defined(SIO_BAUD_RATE_PORT1) ATT_ISR({ TA_NULL, SIO1_PORTID, INTNO_SIO1, sio_isr, 1 }); CFG_INT(INTNO_SIO1, { TA_ENAINT | INTATR_SIO1, INTPRI_SIO1 }); #endif
上記カーネル依存部の対応により
と2箇所のケアだけで済む。
r522に対してのレビューをお願いします。
r523で対応ミスを修正。SIO_BAUD_RATE_DEFAULTが使用されていた実装を修正した。
ポートの活性化方法がトリッキーであるのできちんとターゲット依存部のテキストにドキュメント化することが必要である。
現状のシリアルポート実装は
という暗黙前提がある。
このため「システムに別のUART機器を接続したい」時にかなり不便である。
(例)GPSモジュールをつなぎたい。他の機器と通信したい。パソコンと接続したいが、ログ出力は別にみたい。など。
例えば、現状の実装の場合、複数のシリアルポートを使用する必要がある場合、
と3つの手順を踏まなければならない。
本来これらはカーネル依存部で吸収できる内容である。
そこで、以下のように実装を改め、カーネルユーザがtarget_syssvc.hを変更するだけで複数のシリアルポートを使えるように変更する。
上記カーネル依存部の対応により
と2箇所のケアだけで済む。