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

Tetsuya OHKAWA email@hidden
2007年 1月 31日 (水) 22:42:21 JST


大川です。

ちょっと脱線してしまうかもしれませんが、
私が良く使うのは、ioremap()を使ってレジスタにアクセスする方法です。

参考)
- linux-2.4.x/drivers/char/sil-led.c
(SUZAKU I/O LED/SWボード ソフトウェアマニュアル 参照)

PS.
Suzaku-ML でも何度か話題になっていたので参考になる投稿があると思われます。
http://suzaku.atmark-techno.com/dev/mailinglist

email@hidden wrote:
> お世話になっております。
> 伊藤と申します。
>
> 早速ですが、表題の件...
> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/mailman/listinfo/suzaku
>   




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