uboot i 2 cサポートプラットフォームmini 6410の追加


CPUモデルS 3 C 6410のmini 6410開発ボードのubootを変更し、I 2 Cデバイスの読み書きをサポートします.
uboot最上位ディレクトリreadmeファイルとI 2 C関連部分を読むことで、システムがI 2 Cをサポートするために必要な修正が明らかになります.
readmeでi 2 cに関連する部分は
(1)  #define enables commands:   -------------------------
CFG_CMD_I2C * I2C serial bus support
このセクションはi 2 cテストコマンドのサポートです.だからmini 6410をhファイルにおけるコマンド定義の変更
/***********************************************************
 * Command definition
 ***********************************************************/
#define CONFIG_COMMANDS \
                        (CFG_CMD_I2C | \
                        CONFIG_CMD_DFL | \
                        CFG_CMD_CACHE   | \
                        CFG_CMD_USB     | \
                        CFG_CMD_REGINFO | \
                        CFG_CMD_LOADS   | \
                        CFG_CMD_LOADB   | \
                        CFG_CMD_ENV     | \
                        CFG_CMD_NAND    | \
			CFG_CMD_PING    | \
                        CFG_CMD_MOVINAND) \
                        & ~(CFG_CMD_AUTOSCRIPT  | \
                                CFG_CMD_BOOTD   | \
                                CFG_CMD_IMI     | \
                                CFG_CMD_RUN     | \
                                CFG_CMD_CCONFIG_COMMANDS ONSOLE | \
                                CFG_CMD_DOCG3P3 | \
                                CFG_CMD_EEPROM | \
                                0)

すなわちCFG_CMD_I 2 Cは下から上に移動してCONFIG_COMMANDSはi 2 cテストコマンドをサポートする.(2)ハードウェアI 2 Cに関する説明
- I2C Support:	CONFIG_HARD_I2C | CONFIG_SOFT_I2C

		These enable I2C serial bus commands. Defining either of
		(but not both of) CONFIG_HARD_I2C or CONFIG_SOFT_I2C will
		include the appropriate I2C driver for the selected cpu.
		//        I2C   I2C
		This will allow you to use i2c commands at the u-boot
		command line (as long as you set CFG_CMD_I2C in
		CONFIG_COMMANDS) and communicate with i2c based realtime
		clock chips. See common/cmd_i2c.c for a description of the
		command line interface.
                
		CONFIG_I2C_CMD_TREE is a recommended option that places
		all I2C commands under a single 'i2c' root command.  The
		older 'imm', 'imd', 'iprobe' etc. commands are considered
		deprecated and may disappear in the future.
                 
		CONFIG_HARD_I2C selects a hardware I2C controller.

		CONFIG_SOFT_I2C configures u-boot to use a software (aka
		bit-banging) driver instead of CPM or similar hardware
		support for I2C.

		There are several other quantities that must also be
		defined when you define CONFIG_HARD_I2C or CONFIG_SOFT_I2C.
                  
		In both cases you will need to define CFG_I2C_SPEED
		to be the frequency (in Hz) at which you wish your i2c bus
		to run and CFG_I2C_SLAVE to be the address of this node (ie
		the cpu's i2c node address).
                //          I2C    I2C SCK
		//    I2C               
                Now, the u-boot i2c code for the mpc8xx (cpu/mpc8xx/i2c.c)
		sets the cpu up as a master node and so its address should
		therefore be cleared to 0 (See, eg, MPC823e User's Manual
		p.16-473). So, set CFG_I2C_SLAVE to 0.

		That's all that's required for CONFIG_HARD_I2C.

必要なマクロ定義はmini 6410にいくつかあります.hに追加するmini 6410.hファイルに次のコードが表示されます.
#undef CONFIG_S3C64XX_I2C		/* this board has H/W I2C */
#ifdef CONFIG_S3C64XX_I2C
#define CONFIG_HARD_I2C		1
#define CFG_I2C_SPEED		50000
#define CFG_I2C_SLAVE		0xFE

#undef CONFIG_をS3C64XX_I 2 Cを#define CONFIGに変更S3C64XX_I 2 C(3)起動初期化起動時にi 2 cレジスタを配置する
		CFG_I2C_INIT_BOARD

		When a board is reset during an i2c bus transfer
		chips might think that the current transfer is still
		in progress. On some boards it is possible to access
		the i2c SCLK line directly, either by using the
		processor pin as a GPIO or by having a second pin
		connected to the bus. If this option is defined a
		custom i2c_init_board() routine in boards/xxx/board.c
		is run early in the boot sequence.

サービスでcのdevices_init関数でi 2 c_が見つかりましたinit (CFG_I2C_SPEED, CFG_I2C_SLAVE); したがって、この関数は、起動するたびにi 2 cを構成します.
これらを追加してubootをコンパイルしてダウンロードし、ubootコマンドラインに入り、helpコマンドを実行すると以下のI 2 C関連コマンドが表示されます.
 
imd     - i2c memory display
imls    - list all images found in flash
imm     - i2c memory modify (auto-incrementing)
imw     - memory write (fill)
inm     - memory modify (constant address)
iprobe  - probe to discover valid I2C chip addresses

iprobeコマンドを実行するとボード上のI 2 Cデバイスアドレスが見つからず、オシロスコープ測定でSDA SCL上に波形がないことが分かった.
第1の反応はプログラムの実行経路が私が想像していたのとは異なるが、デバッグ情報を印刷することでプログラムの実行経路が正しいことが分かった.
6410 datasheet I 2 Cの関連部分を読むことで、新しい問題が見つかりました.SDA/SCLで使用されるピンは構成されていないので、GPIOとして機能しています.
mini 6410.cのboard_InitにGPIO構成を追加
//i2c pin config
	reg = readl(GPBCON);
	reg &= ~(0xf << 20);
	reg |= (0x2 << 20);
	writel(reg, GPBCON);
	reg = readl(GPBCON);
	reg &= ~(0xf << 24);
	reg |= (0x2 << 24);
	writel(reg, GPBCON);

	reg = readl(GPBPUD);
	reg &= ~(0x3 << 10);
	writel(reg, GPBPUD);
	reg = readl(GPBPUD);
	reg &= ~(0x3 << 12);
	writel(reg, GPBPUD);

ダウンロード後のコンパイルと再生
 
検出
iprobeコマンドはまだ反応せず、波形もありません.
I 2 Cレジスタの構成に問題があるのではないかと疑い、テストでレジスタが読み取った内容と自分で構成したデータが一致していないことが判明.
   i2c.cファイルにおいてレジスタの読み書きに用いる方法は以下の通りである.
	S3C64XX_I2C *const i2c = S3C64XX_GetBase_I2C ();//0x7F004000 chan 0 base address
        i2c->IICSTAT = 0  // 
        status = i2c->IICCON; // 

この方式の読み書きには問題がある.readlとwritel関数で操作するように変更しました.
ubootを再コンパイルしてダウンロードします.i 2 c各操作コマンドは正常に動作しています.
デバイス駆動デバッグ方法手順の概要
1、印刷情報でプログラムの運行経路が正しいかどうかを判断する
2、オシロスコープを使って波形の有無と波形が正しいかどうかを観察する
3、読み出しレジスタ観察構成が正しいか
添付ファイルをアップロードできませんのでpatchファイルが必要な場合はメールボックスを残してください