[Suzaku:00775] デバイスアドレスにアクセスする方法

email@hidden
2007年 1月 31日 (水) 15:33:14 JST


お世話になっております。
伊藤と申します。

早速ですが、表題の件...
Free領域に割り当てたデバイスアドレスにアクセスすると実行エラーとなってしまいます。
お手数ですが対処方法を教えてください。

前提:
 SUZAKU-V.SZ310のメモリのFree領域 F0F00000h〜をI2C制御用として割り当て、自作のI2C回路と
 OPBとの接続を行いました。
 但し、I2Cは正規の動作ではなく、単純な入出力回路4つのソフトウェアアクセスレジスタ8Bitを設定し、
 内2つはSCL,SDA出力、内2つはSCL,SDA入力用として使うことを想定しています。
  ・slv_reg0   : SCL出力
  ・slv_reg1   : SDA出力
  ・slv_reg_r2 : SCL入力
  ・slv_reg_r3 : SDA入力

症状:
 ベースアドレスF0F00000hのslv_reg0にアクセスするべく、以下のデバイスドライバを試したところ、
 inb()の箇所で「アクセス領域が無効」の旨の実行エラーとなってしまいました。
 (request_region()でPort領域が割り当てられたことは確認済みです。)

色々調べたところ、request_region()でPort領域を宣言すれば以降inb()又はoutb()でそのデバイス
アドレスにアクセスできると思うのですが、この考え方は間違っているのでしょうか。

以上、毎度毎度大変お手数ですが、ご教示の程よろしくお願いします。

/***** デバイスドライバ(必要箇所だけ抜粋してあります) ↓************************************ */
#define	I2C_BASE_ADR	0xf0f00000
int i2c_init( void )
{
    unsigned char a=0;
    if( NULL == request_region( I2C_BASE_ADR, 16, "i2c" ) )	{  /* Port割り当て */
	printk( KERN_ERR "\n request_region() failed \n" );
	return -EIO;
    }
    a = inb( I2C_BASE_ADR );	/* <-Error箇所発生	*/
    printk( KERN_INFO "\n a = %x", a );
    return 0;
}
module_init( i2c_init );		//insmodにてCall

/***** デバイスドライバ ↑**************************************************************** */

/***** エラーメッセージ ↓**************************************************************** */
#insmod i2c.o
Oops: kernel access of bad area, sig: 11
NIP: C380197C XER: 00000000 LR: C3801974 SP: C1F1DE60 REGS: c1f1ddb0 TRAP: 0800    Not tainted
MSR: 00008030 EE: 1 PR: 0 FP: 0 ME: 0 IR/DR: 11
DEAR: 90F00000, ESR: 00000000
TASK = c1f1c000[54] 'exe' Last syscall: 128
last math 00000000 last altivec 00000000
GPR00: C3801974 C1F1DE60 C1F1C000 00000017 00000030 00000001 0000096B C0112B63
GPR08: 00000000 90F00000 00000034 C1F1DD70 C0120000 00000000 00000000 00000000
GPR16: 00000000 00000000 00000000 00000000 00008030 10049454 C1EE7000 C1F1DEA0
GPR24: C02B8A40 C3800000 C3800000 FFFFFFEA 00000060 00000003 00000000 C3800000
Call backtrace:
C3801974 C00139CC C00026FC 1000FAF8 10010D10 10002A04 10002648
30025D44 30025D90 00000000
SIGSEGV
/***** エラーメッセージ ↑**************************************************************** */

/***** ポート領域の割り当て ↓**************************************************************** */
# cat proc/ioports
f0000000-f07fffff : flash
f0e00300-f0e0030f : eth0
f0f00000-f0f0000f : i2c
#
/***** ポート領域の割り当て ↑**************************************************************** */



suzaku メーリングリストの案内