From 7635089ceae9d0ac0ea1fea986bf4e0ac7a15b4d Mon Sep 17 00:00:00 2001 From: takemasa Date: Sun, 29 Jul 2012 17:17:06 +0900 Subject: [PATCH] =?utf8?q?TWI=E8=AA=AD=E3=81=BF=E6=9B=B8=E3=81=8D=E3=81=AE?= =?utf8?q?=E6=BA=96=E5=82=99=E3=82=92=E3=81=99=E3=81=99=E3=82=81=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- i2c-test/.cproject | 6 +- .../.settings/org.eclipse.cdt.codan.core.prefs | 31 +++---- i2c-test/i2c_subsystem.c | 100 +++++++++++++++------ .../config/blackfin/_common_bf592/chip_config.c | 2 +- 4 files changed, 94 insertions(+), 45 deletions(-) diff --git a/i2c-test/.cproject b/i2c-test/.cproject index 4e37f33..8b96b49 100644 --- a/i2c-test/.cproject +++ b/i2c-test/.cproject @@ -20,11 +20,11 @@ - + - @@ -37,7 +37,7 @@ - diff --git a/i2c-test/.settings/org.eclipse.cdt.codan.core.prefs b/i2c-test/.settings/org.eclipse.cdt.codan.core.prefs index 0710d38..9c7ec59 100644 --- a/i2c-test/.settings/org.eclipse.cdt.codan.core.prefs +++ b/i2c-test/.settings/org.eclipse.cdt.codan.core.prefs @@ -5,9 +5,9 @@ org.eclipse.cdt.codan.checkers.errreturnvalue=Error org.eclipse.cdt.codan.checkers.errreturnvalue.params={} org.eclipse.cdt.codan.checkers.noreturn=Error org.eclipse.cdt.codan.checkers.noreturn.params={implicit\=>false} -org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=-Error org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=-Error org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={} @@ -17,31 +17,31 @@ org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={no_break_comment\=>"no break",last_case_param\=>true,empty_case_param\=>false} org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={unknown\=>false,exceptions\=>()} -org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=-Error org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=-Error org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=-Error org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=-Error org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=-Error org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=-Error org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=-Error org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=-Error org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={} -org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=-Error org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=-Error org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=-Error org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={} @@ -53,7 +53,7 @@ org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={paramNot\=>false} org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={else\=>false,afterelse\=>false} -org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=-Error org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={macro\=>true} @@ -61,5 +61,6 @@ org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={macro\=>true} org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={macro\=>true,exceptions\=>("@(\#)","$Id")} -org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=-Error org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +useParentScope=false diff --git a/i2c-test/i2c_subsystem.c b/i2c-test/i2c_subsystem.c index f1f6df8..3dba897 100644 --- a/i2c-test/i2c_subsystem.c +++ b/i2c-test/i2c_subsystem.c @@ -8,6 +8,7 @@ #include "kernel_id.h" #include "s_services.h" #include +#include /** * \brief チップ上のI2Cペリフェラルの数 @@ -37,6 +38,7 @@ enum I2C_STATE { struct I2C_MASTER_CONTROL_TYPE { ID signal; /**< データの送受信が全部終わったときに割り込みハンドラからタスクに知らせるためのセマフォ */ ID blocking; /**< I2Cペリフェラルへの排他アクセスのためのセマフォ */ + unsigned short int_state; /**< TWIペリフェラルの割り込みステータスのコピー **/ enum I2C_STATE state; /**< I2Cペリフェラルハンドラの内部状態 */ volatile uint16_t * clkdiv ; volatile uint16_t * control ; @@ -74,19 +76,31 @@ int i2c_master_read( int peripheral, int slave, unsigned char read_data[], int r int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[], int write_count, unsigned char read_data[], int read_count) { + struct I2C_MASTER_CONTROL_TYPE *twi; + BOOL no_read, no_write; + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[peripheral]; + + // 読み書きの有無の確認 + no_read = ( write_data == NULL ) || ( write_count == 0 ); + no_read = ( read_data == NULL ) || ( read_count == 0 ); + + // TODO ここに読み書き判別を書き込む。 + + if ( write) // peripheral 引数で指定されたi2cペリフェラルを排他的に使うためのPV処理。 // これでスレッドセーフにできる - wai_sem(i2c_control[peripheral].blocking); + wai_sem(twi->blocking); do { // 割り込みハンドラが送受処理を完了するまで待つ - wai_sem(i2c_control[peripheral].signal); + wai_sem(twi->signal); // 排他区間の終了 - } while ( i2c_control[peripheral].state != I2C_EXIT ); + } while ( twi->state != I2C_EXIT ); - sig_sem(i2c_control[peripheral].blocking); + sig_sem(twi->blocking); return 0; } @@ -98,8 +112,23 @@ int i2c_master_write_read( int peripheral, int slave, unsigned char write_data[] */ void i2c0_master_handler(void) { + struct I2C_MASTER_CONTROL_TYPE *twi; + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[0]; + + // TWIペリフェラルの割り込みステータスを取得し、コピーを保存する。 + // コピーを保存するのは、このあと割り込みクリアで消えるからである。 + twi->int_state = *twi->int_stat; + + // 割り込みクリア。すべての割り込み要素をクリアしてしまう。ステータスはコピーしているのでタスクで処理する。 + *twi->int_stat = 0xFF; + + // 割り込みクリアが確定するまで待つ。 + ssync(); + /* 通知はセマフォを使う。タスクは i2c_master_write_read()の中で待っている。 */ - isig_sem(i2c_control[0].signal); + isig_sem(twi->signal); } @@ -110,28 +139,47 @@ void i2c0_master_handler(void) */ void i2c0_master_initialize(VP_INT exinf) { - i2c_control[0].blocking = SEM_I2C0_BLOCK; // ペリフェラルブロック用セマフォ - i2c_control[0].signal = SEM_I2C0_SIGNAL; // 割り込み・タスク通信用セマフォ + struct I2C_MASTER_CONTROL_TYPE *twi; + + // 可読性向上のため、TWI管理構造体のポインタを設定する。 + twi = &i2c_control[0]; + + twi->blocking = SEM_I2C0_BLOCK; // ペリフェラルブロック用セマフォ + twi->signal = SEM_I2C0_SIGNAL; // 割り込み・タスク通信用セマフォ // レジスタアドレスを設定 - i2c_control[0].clkdiv = pTWI_CLKDIV ; - i2c_control[0].control = pTWI_CONTROL ; - i2c_control[0].master_ctl = pTWI_MASTER_CTL ; - i2c_control[0].master_stat = pTWI_MASTER_STAT ; - i2c_control[0].master_addr = pTWI_MASTER_ADDR ; - i2c_control[0].int_stat = pTWI_INT_STAT ; - i2c_control[0].int_mask = pTWI_INT_MASK ; - i2c_control[0].fifo_ctl = pTWI_FIFO_CTL ; - i2c_control[0].fifo_stat = pTWI_FIFO_STAT ; - i2c_control[0].xmt_data8 = pTWI_XMT_DATA8 ; - i2c_control[0].rcv_data8 = pTWI_RCV_DATA8 ; - i2c_control[0].slave_ctl = pTWI_SLAVE_CTL ; - - - i2c_control[0].control = 0; // TWI をディセーブル - i2c_control[0].master_ctl = 0; // マスター機能をディセーブル - i2c_control[0].slave_ctl = 0; // スレーブ機能をディセーブル - - i2c_control[0].control = TWI_ENA | (SYSCLOCK/10000000); // HWRによると、プリスケール値はSYSCLKを10MHzで割ったものでなければならない。 + twi->clkdiv = pTWI_CLKDIV ; + twi->control = pTWI_CONTROL ; + twi->master_ctl = pTWI_MASTER_CTL ; + twi->master_stat = pTWI_MASTER_STAT ; + twi->master_addr = pTWI_MASTER_ADDR ; + twi->int_stat = pTWI_INT_STAT ; + twi->int_mask = pTWI_INT_MASK ; + twi->fifo_ctl = pTWI_FIFO_CTL ; + twi->fifo_stat = pTWI_FIFO_STAT ; + twi->xmt_data8 = pTWI_XMT_DATA8 ; + twi->rcv_data8 = pTWI_RCV_DATA8 ; + twi->slave_ctl = pTWI_SLAVE_CTL ; + + + *twi->control = 0; // TWI をディセーブル + *twi->master_ctl = 0; // マスター機能をディセーブル + *twi->slave_ctl = 0; // スレーブ機能をディセーブル + + *twi->control = TWI_ENA | (SYSCLOCK/10000000); // HWRによると、プリスケール値はSYSCLKを10MHzで割ったものでなければならない。 + + // FIFO フラッシュ + *twi->fifo_ctl = XMTFLUSH | RCVFLUSH; + ssync(); + + // FIFO 設定 + *twi->fifo_ctl = 0; // 割り込みスレシホールドは送受とも1バイト、FLUSHはクリアする + + // 割り込みイネーブル設定。送受割り込み、完了割り込み及びエラー割り込み。 + *twi->int_mask = MCOMP | MERR | XMTSERV | RCVSERV; + + // システム割り込みをイネーブルにする。 + ena_int(INTNO_TWI); + } diff --git a/i2c-test/kernel/config/blackfin/_common_bf592/chip_config.c b/i2c-test/kernel/config/blackfin/_common_bf592/chip_config.c index c805ad6..3d156b4 100644 --- a/i2c-test/kernel/config/blackfin/_common_bf592/chip_config.c +++ b/i2c-test/kernel/config/blackfin/_common_bf592/chip_config.c @@ -276,7 +276,7 @@ ER chg_ims( IMS ims ) extern ER get_ims( IMS * p_ims ) { *p_ims = *pSIC_IMASK; - return( 0 );; + return( 0 ); } -- 2.11.0