From acddf0256a9ac0fceb2bfa3aeb03e5ff5db6765e Mon Sep 17 00:00:00 2001 From: Shinichiro Nakamura Date: Mon, 30 Apr 2012 09:23:06 +0900 Subject: [PATCH] Document updated. --- doc/README.txt | 15 +++-- src/kz_h8write.c | 152 +++++++++++++++++++++++++++++++-------------------- src/kz_h8write.h | 6 +- src/serial_linux.c | 2 +- src/serial_windows.c | 2 +- 5 files changed, 108 insertions(+), 69 deletions(-) diff --git a/doc/README.txt b/doc/README.txt index b9fdab6..08e73a9 100644 --- a/doc/README.txt +++ b/doc/README.txt @@ -1,8 +1,8 @@ -======================================= +============================================= KOZOS H8/3069F Flash Writer. - Copyright(C) 2011 Shinichiro Nakamura -======================================= + Copyright(C) 2011-2012 Shinichiro Nakamura +============================================= KOZOS H8/3069F Flash WriterはKOZOS本を楽しむために H8/3069Fを手にしたけど、有名なh8writeでは書き込みに @@ -22,9 +22,10 @@ serial.h シリアルポートライブラリのインターフェー ======================================= 使い方 ======================================= - motファイル名、ボードクロック[MHz]、書き込みインターフェースを与えて実行します。 + motファイル名、ボードクロック[MHz]、シリアルポート名を与えて実行します。 - 例) kz_h8write kzload.mot 20 /dev/ttyUSB0 + 例) kz_h8write -3069 -f20 kzload.mot /dev/ttyUSB0 (Linux) + 例) kz_h8write -3069 -f20 kzload.mot COM5 (Windows) 書き込みに成功した場合、実行表示の最後にComplete.と表示されます。 @@ -47,6 +48,10 @@ serial.h シリアルポートライブラリのインターフェー シリアルボーレート合わせ込みシーケンスに再試行処理を追加。 付属プログラムmotdumpの表示処理のマイナーバグを修正。 +2012/04/30 Version 0.1.0 + 引数の指定方法を書籍で使っている範囲でh8writeと互換性をとるようにした。 + 書籍では、-3069、-f20、MOTファイル名、シリアルデバイスが指定されている。 + ======================================= 謝辞 ======================================= diff --git a/src/kz_h8write.c b/src/kz_h8write.c index 61be76f..13713a9 100644 --- a/src/kz_h8write.c +++ b/src/kz_h8write.c @@ -7,7 +7,7 @@ /* * =============================================================== * KOZOS h8write - * Version 0.0.3 + * Version 0.1.0 * =============================================================== * Copyright (c) 2010-2011 Shinichiro Nakamura * @@ -91,24 +91,27 @@ typedef struct { #define USER_OPTION_DEBUG(P) ((P)->debug) #define USER_OPTION_ERROR(P) ((P)->error) -static SERIAL *serial; static unsigned char memory_image[0x100000 + 0x100]; static unsigned int memory_lastaddr = 0; -int com_getc(void); -int com_putc(unsigned char c); +int com_getc(SERIAL *serial); +int com_putc(SERIAL *serial, unsigned char c); int write_request( + SERIAL *serial, const unsigned char cmd, const unsigned char *buf, const unsigned char siz); -int read_response(unsigned char *buf, size_t siz); -enum ErrorCode bitrate_sequence(void); -enum ErrorCode inquiry_device(uint32_t *devcode); -enum ErrorCode select_device(const uint32_t devcode); -enum ErrorCode inquiry_clockmode(void); -enum ErrorCode select_clockmode(void); -enum ErrorCode select_bitrate(const int baudrate, const int clock_mhz); -enum ErrorCode program(void); +int read_response( + SERIAL *serial, + unsigned char *buf, + size_t siz); +enum ErrorCode bitrate_sequence(SERIAL *serial); +enum ErrorCode inquiry_device(SERIAL *serial, uint32_t *devcode); +enum ErrorCode select_device(SERIAL *serial, const uint32_t devcode); +enum ErrorCode inquiry_clockmode(SERIAL *serial); +enum ErrorCode select_clockmode(SERIAL *serial); +enum ErrorCode select_bitrate(SERIAL *serial, const int baudrate, const int clock_mhz); +enum ErrorCode program(SERIAL *serial); /** * @brief motモジュールのコールバック関数。 @@ -133,9 +136,12 @@ void mot_callback( /** * @brief シリアルポートから1文字読み出す。 * @details このインターフェースは最大SERIAL_TIMEOUT_MS[ms]の着信を待つ。 + * + * @param serial シリアルハンドラ。 + * * @return 文字。 */ -int com_getc(void) +int com_getc(SERIAL *serial) { unsigned char c; if (serial_read_with_timeout(serial, &c, 1, SERIAL_TIMEOUT_MS) != 0) { @@ -146,10 +152,13 @@ int com_getc(void) /** * @brief シリアルポートへ1文字書き出す。 + * + * @param serial シリアルハンドラ。 * @param c 文字。 + * * @return 書き出した文字。 */ -int com_putc(unsigned char c) +int com_putc(SERIAL *serial, unsigned char c) { if (serial_write(serial, &c, 1) != 0) { return EOF; @@ -159,13 +168,17 @@ int com_putc(unsigned char c) /** * @brief リクエストを書き込む。 + * + * @param serial シリアルハンドラ。 * @param cmd コマンド。 * @param buf バッファへのポインタ。 * @param siz バッファに格納されたデータバイト数。 + * * @retval 0 成功。 * @retval 0以外 失敗。エラー番号。 */ int write_request( + SERIAL *serial, const unsigned char cmd, const unsigned char *buf, const unsigned char siz) @@ -209,12 +222,15 @@ int write_request( * 2. サイズ。(コマンド、サイズ、チェックサムを除く。) * 3. データ。 * 4. チェックサム。 + * + * @param serial シリアルハンドラ。 * @param buf バッファ。 * @param siz バッファサイズ。 + * * @retval 1以上 読み込んだ文字数。 * @retval 0以下 エラー。 */ -int read_response(unsigned char *buf, size_t siz) +int read_response(SERIAL *serial, unsigned char *buf, size_t siz) { /* * コマンド。 @@ -270,9 +286,11 @@ int read_response(unsigned char *buf, size_t siz) * 成功:0xE6 * 失敗:0xFF * + * @param serial シリアルハンドラ。 + * * @return エラーコード。 */ -enum ErrorCode bitrate_sequence(void) +enum ErrorCode bitrate_sequence(SERIAL *serial) { unsigned char sc, rc; int i; @@ -323,14 +341,17 @@ enum ErrorCode bitrate_sequence(void) /** * @brief サポートデバイス問い合わせ(0x20)を実行する。 + * + * @param serial シリアルハンドラ。 * @param devcode デバイスコード。 + * * @return エラーコード。 */ -enum ErrorCode inquiry_device(uint32_t *devcode) +enum ErrorCode inquiry_device(SERIAL *serial, uint32_t *devcode) { unsigned char buf[BUFSIZ]; - com_putc(0x20); - if (read_response(&buf[0], sizeof(buf)) != 0) { + com_putc(serial, 0x20); + if (read_response(serial, &buf[0], sizeof(buf)) != 0) { /* * レスポンスが異常だった場合、 * サポートしていないデバイスとして返す。 @@ -347,10 +368,13 @@ enum ErrorCode inquiry_device(uint32_t *devcode) /** * @brief デバイス選択(0x10)を実行する。 + * + * @param serial シリアルハンドラ。 * @param devcode デバイスコード。 + * * @return エラーコード。 */ -enum ErrorCode select_device(const uint32_t devcode) +enum ErrorCode select_device(SERIAL *serial, const uint32_t devcode) { unsigned char c; unsigned char buf[4]; @@ -358,14 +382,14 @@ enum ErrorCode select_device(const uint32_t devcode) buf[1] = devcode >> (8 * 2); buf[2] = devcode >> (8 * 1); buf[3] = devcode >> (8 * 0); - write_request(0x10, buf, sizeof(buf)); - c = com_getc(); + write_request(serial, 0x10, buf, sizeof(buf)); + c = com_getc(serial); if (c != 0x06) { /* * ACKでない場合、続けてエラーコードが返る。 * この時、上位にはデバイスコードの不一致として返す。 */ - c = com_getc(); + c = com_getc(serial); return UnmatchedDeviceCode; } return NoError; @@ -373,11 +397,12 @@ enum ErrorCode select_device(const uint32_t devcode) /** * @brief クロックモード問い合わせ(0x21)を実行する。 + * @param serial シリアルハンドラ。 */ -enum ErrorCode inquiry_clockmode(void) { +enum ErrorCode inquiry_clockmode(SERIAL *serial) { unsigned char buf[BUFSIZ]; - com_putc(0x21); - if (read_response(&buf[0], sizeof(buf)) != 0) { + com_putc(serial, 0x21); + if (read_response(serial, &buf[0], sizeof(buf)) != 0) { return UnsupportedClockMode; } return NoError; @@ -385,20 +410,23 @@ enum ErrorCode inquiry_clockmode(void) { /** * @brief クロックモード選択(0x11)を実行する。 + * + * @param serial シリアルハンドラ。 + * * @return エラーコード。 */ -enum ErrorCode select_clockmode(void) { +enum ErrorCode select_clockmode(SERIAL *serial) { unsigned char c; unsigned char buf[1]; buf[0] = 0; - write_request(0x11, buf, 1); - c = com_getc(); + write_request(serial, 0x11, buf, 1); + c = com_getc(serial); if (c != 0x06) { /* * ACKでない場合、続けてエラーコードが返る。 * この時、上位にはクロックモードの不一致として返す。 */ - c = com_getc(); + c = com_getc(serial); return UnmatchedClockMode; } return NoError; @@ -406,10 +434,13 @@ enum ErrorCode select_clockmode(void) { /** * @brief 新ビットレート選択(0x3F)を実行する。 + * + * @param serial シリアルハンドラ。 * @param baudrate ボーレート。 * @param clock_mhz クロック。単位はMHz。 */ enum ErrorCode select_bitrate( + SERIAL *serial, const int baudrate, const int clock_mhz) { @@ -424,21 +455,21 @@ enum ErrorCode select_bitrate( buf[4] = 1; buf[5] = 1; buf[6] = 1; - write_request(0x3f, buf, sizeof(buf)); - c = com_getc(); + write_request(serial, 0x3f, buf, sizeof(buf)); + c = com_getc(serial); if (c != 0x06) { /* * ACKでない場合、続けてエラーコードが返る。 * この時、上位には不正なビットレートとして返す。 */ - c = com_getc(); + c = com_getc(serial); return InvalidBitrate; } /* * 新ビットレートによる双方向ACK確認。 */ - com_putc(0x06); - c = com_getc(); + com_putc(serial, 0x06); + c = com_getc(serial); if (c != 0x06) { return InvalidBitrate; } @@ -447,9 +478,12 @@ enum ErrorCode select_bitrate( /** * @brief 書き込み消去ステータス遷移(0x40)を実行する。 + * + * @param serial シリアルハンドラ。 + * * @return エラーコード。 */ -enum ErrorCode program(void) +enum ErrorCode program(SERIAL *serial) { unsigned char c; @@ -472,10 +506,10 @@ enum ErrorCode program(void) * 消去に成功してしまうかもしれない。 */ fprintf(stderr, "Waiting for erase done:"); - com_putc(0x40); + com_putc(serial, 0x40); const int POLL_N_ERASE = (40000 / SERIAL_TIMEOUT_MS); for (int i = 0; i < POLL_N_ERASE; i++) { - c = com_getc(); + c = com_getc(serial); if (c == 0x06) { break; } @@ -487,20 +521,20 @@ enum ErrorCode program(void) * ACKでない場合、続けてエラーコードが返る。 * この時、上位には書き込み消去失敗として返す。 */ - c = com_getc(); + c = com_getc(serial); return WriteEraseFail; } /* * ユーザマット書き込み選択を実行。 */ - com_putc(0x43); - c = com_getc(); + com_putc(serial, 0x43); + c = com_getc(serial); if (c != 0x06) { /* * ACKでない場合、続けてエラーコードが返る。 */ - c = com_getc(); + c = com_getc(serial); return WriteEraseFail; } @@ -542,7 +576,7 @@ enum ErrorCode program(void) */ const int POLL_N_WRITE = (3000 / SERIAL_TIMEOUT_MS); for (int i = 0; i < POLL_N_WRITE; i++) { - c = com_getc(); + c = com_getc(serial); if (c == 0x06) { break; } @@ -552,7 +586,7 @@ enum ErrorCode program(void) /* * ACKでない場合、続けてエラーコードが返る。 */ - c = com_getc(); + c = com_getc(serial); return WriteEraseFail; } fprintf(stderr, "."); @@ -577,12 +611,12 @@ enum ErrorCode program(void) if (serial_write(serial, buf, 6) != 0) { return WriteEraseFail; } - c = com_getc(); + c = com_getc(serial); if (c != 0x06) { /* * ACKでない場合、続けてエラーコードが返る。 */ - c = com_getc(); + c = com_getc(serial); return WriteEraseFail; } } @@ -594,8 +628,6 @@ int optparse_callback(const char option, const char *argument, void *extobj) { user_option_t *user_option = (user_option_t *)extobj; - printf("option=%c, argument=%s\n", option, argument); - /* * USER_OPTION_MOT_FILE()とUSER_OPTION_SERIAL_PORT()は別に取得する。 */ @@ -623,6 +655,7 @@ int optparse_callback(const char option, const char *argument, void *extobj) USER_OPTION_DEBUG(user_option) = 1; break; } + return 0; } @@ -634,8 +667,9 @@ int optparse_callback(const char option, const char *argument, void *extobj) */ int main(int argc, char **argv) { - enum ErrorCode ec; - uint32_t devcode; + SERIAL *serial = NULL; + enum ErrorCode ec = NoError; + uint32_t devcode = 0; user_option_t user_option = USER_OPTION_INITIALIZER; /* @@ -673,8 +707,8 @@ int main(int argc, char **argv) || USER_OPTION_VERSION(&user_option) || USER_OPTION_HELP(&user_option)) { fprintf(stderr, "%s [options...] [mot file] [interface]\n", argv[0]); fprintf(stderr, "\n"); - fprintf(stderr, " Target CPU : -3069 (Default:3069)\n"); - fprintf(stderr, " Target Frequency : -f[20 | 25] (Default:20)\n"); + fprintf(stderr, " Target CPU : -3069 (Default:3069)\n"); + fprintf(stderr, " Target Frequency : -f[20 | 25] (Default:20)\n"); fprintf(stderr, " Version : -v\n"); fprintf(stderr, " Help : -h\n"); fprintf(stderr, " Debug : -d\n"); @@ -747,7 +781,7 @@ int main(int argc, char **argv) * これはユーザがかけている手間をプログラムが代行する事を意味する。 */ for (int i = 0; i < 2; i++) { - ec = bitrate_sequence(); + ec = bitrate_sequence(serial); if (ec == NoError) { break; } else { @@ -774,7 +808,7 @@ int main(int argc, char **argv) /* * サポートデバイス問い合わせを実行する。 */ - ec = inquiry_device(&devcode); + ec = inquiry_device(serial, &devcode); if (ec != NoError) { fprintf(stderr, "Inquiry device failed. (code=0x%02x)\n", (int)ec); PROGEXIT(1); @@ -784,7 +818,7 @@ int main(int argc, char **argv) /* * デバイス選択を実行する。 */ - ec = select_device(devcode); + ec = select_device(serial, devcode); if (ec != NoError) { fprintf(stderr, "Select device failed. (code=0x%02x)\n", (int)ec); PROGEXIT(1); @@ -794,7 +828,7 @@ int main(int argc, char **argv) /* * クロックモード問い合わせを実行する。 */ - ec = inquiry_clockmode(); + ec = inquiry_clockmode(serial); if (ec != NoError) { fprintf(stderr, "Inquiry clock mode failed. (code=0x%02x)\n", (int)ec); PROGEXIT(1); @@ -804,7 +838,7 @@ int main(int argc, char **argv) /* * クロックモード選択を実行する。 */ - ec = select_clockmode(); + ec = select_clockmode(serial); if (ec != NoError) { fprintf(stderr, "Select clock mode failed. (code=0x%02x)\n", (int)ec); PROGEXIT(1); @@ -814,7 +848,7 @@ int main(int argc, char **argv) /* * 新ビットレート選択を実行する。 */ - ec = select_bitrate(19200, USER_OPTION_CPU_FREQ(&user_option)); + ec = select_bitrate(serial, 19200, USER_OPTION_CPU_FREQ(&user_option)); if (ec != NoError) { fprintf(stderr, "Select bitrate failed. (code=0x%02x)\n", (int)ec); PROGEXIT(1); @@ -825,7 +859,7 @@ int main(int argc, char **argv) * 書き込み消去ステータス遷移を実行する。 * 同時に128バイト書き込みを実行する。 */ - ec = program(); + ec = program(serial); if (ec != NoError) { fprintf(stderr, "Program failed. (code=0x%02x)\n", (int)ec); PROGEXIT(1); diff --git a/src/kz_h8write.h b/src/kz_h8write.h index 4804804..d9f9a8c 100644 --- a/src/kz_h8write.h +++ b/src/kz_h8write.h @@ -7,7 +7,7 @@ /* * =============================================================== * KOZOS h8write - * Version 0.0.3 + * Version 0.1.0 * =============================================================== * Copyright (c) 2010-2011 Shinichiro Nakamura * @@ -38,8 +38,8 @@ #define KZ_H8WRITE_H #define VERSION_MAJOR 0 -#define VERSION_MINOR 0 -#define VERSION_RELEASE 3 +#define VERSION_MINOR 1 +#define VERSION_RELEASE 0 /** * @brief エラーコード。 diff --git a/src/serial_linux.c b/src/serial_linux.c index 53422a7..7b902c2 100644 --- a/src/serial_linux.c +++ b/src/serial_linux.c @@ -1,5 +1,5 @@ /** - * @file serial.c + * @file serial_linux.c * @author Shinichiro Nakamura * @brief シリアルポートドライバの実装。(Linuxプラットフォーム用) */ diff --git a/src/serial_windows.c b/src/serial_windows.c index ae78240..1203d38 100644 --- a/src/serial_windows.c +++ b/src/serial_windows.c @@ -1,5 +1,5 @@ /** - * @file serial.c + * @file serial_windows.c * @author Shinichiro Nakamura * @brief シリアルポートドライバの実装。(Windowsプラットフォーム用) */ -- 2.11.0