<folderInfo id="cdt.managedbuild.toolchain.gnu.cross.base.1533102550.665124767" name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.base.540799347" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.base">
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.base.349995097" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
- <builder id="cdt.managedbuild.target.gnu.builder.base.862889385" managedBuildOn="false" name="Gnu Make Builder.Default" superClass="cdt.managedbuild.target.gnu.builder.base"/>
+ <builder id="cdt.managedbuild.target.gnu.builder.base.862889385" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.base"/>
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1114658758" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.86969695" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base"/>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.1077485608" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base">
- <option id="gnu.c.compiler.option.include.paths.1552023193" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <option id="gnu.c.compiler.option.include.paths.1552023193" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="/opt/uClinux/bfin-elf/bfin-elf/include"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.12202008" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.2091389382" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base"/>
<tool id="cdt.managedbuild.tool.gnu.assembler.base.783298798" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base">
- <option id="gnu.both.asm.option.include.paths.1347443796" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+ <option id="gnu.both.asm.option.include.paths.1347443796" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="/opt/uClinux/bfin-elf/bfin-elf/include"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.541998806" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
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={}
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={}
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}
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
#include "kernel_id.h"
#include "s_services.h"
#include <cdefBF592-A.h>
+#include <ccblkfn.h>
/**
* \brief チップ上のI2Cペリフェラルの数
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 ;
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;
}
*/
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);
}
*/
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);
+
}
extern ER get_ims( IMS * p_ims )
{
*p_ims = *pSIC_IMASK;
- return( 0 );;
+ return( 0 );
}