[Armadillo:00417] Re: Armadillo9 の GPIO について
Masaki Suzuki
email@hidden
2005年 7月 26日 (火) 18:02:59 JST
日興電気通信の鈴木です。
自己解決しました。
アクセスしてはいけないビットにアクセスしていたのが原因でした。
drivers/char/ep93xx_gpio.c を見てみると、CON4 に接続されてい
ないビットにはアクセスしないように、read modify write がなさ
れています。
したがって、以下のようにソースを修正しました。
#define MODULE
#define __KERNEL__
#define MODULE_NAME "test_gpio module"
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/uaccess.h> // error number
#include <linux/init.h> // module_init(), module_exit()
#include <asm/io.h> // inb(), outb()
#include <linux/ioport.h> // chech_region()
#include <asm/arch/hardware.h> // GPIO Register define
static int init_test_gpio(void)
{
unsigned char mask = 0xf0;
unsigned char tmp;
if (check_region(GPIO_PADR, 0x48) < 0 )
return -ENODEV;
else
request_region(GPIO_PADR, 0x48, "test_GPIO");
printk("<1>PADDR[0x%08x] = 0x%02x\n", GPIO_PADDR, inb(GPIO_PADDR));
/* これはOK */
tmp = inb(GPIO_PADDR) & (~mask);
outb( tmp | ( 0xf0 & mask), GPIO_PADDR);
printk("<1>PADDR[0x%08x] = 0x%02x\n", GPIO_PADDR, inb(GPIO_PADDR));
printk("<1>PADR[0x%08x] = 0x%02x\n", GPIO_PADR, inb(GPIO_PADR));
/* これを実行してもカーネルは暴走しない */
tmp = inb(GPIO_PADR) & (~mask);
outb( tmp | 0x00, GPIO_PADR);
printk("<1>PADR[0x%08x] = 0x%02x\n", GPIO_PADR, inb(GPIO_PADR));
printk("<1>%s initialized\n", MODULE_NAME);
return 0;
}
static void cleanup_test_gpio(void)
{
release_region(GPIO_PADR, 0x48);
printk("<1>%s removed\n", MODULE_NAME);
}
module_init(init_test_gpio);
module_exit(cleanup_test_gpio);
MODULE_LICENSE("GPL");
この修正で insmod でロードした際に、カーネルが暴走せずに正し
く GPIO に出力ができることが確認できました。
大変お騒がせしました。
----- Original Message -----
From: "Masaki Suzuki" <email@hidden>
To: <email@hidden>
Sent: Tuesday, July 26, 2005 3:30 PM
Subject: [Armadillo:00414] Armadillo9 の GPIO について
> 日興電気通信の鈴木と申します。
>
> 現在、Armadillo9 上で動作するテキストインターフェースを持っ
> たオリジナルの GPIO ドライバを作成しようとしていますが、不明
> 点がありましたので、投稿させて頂きました。
>
> GPIO から出力するために、CPU 内部の PADR レジスタにアクセスし
> ます。
>
> この際に、 PCMCIA-CS 対応版のカーネルでは問題なく動作するので
> すが、通常版のカーネルでは暴走してしまうのです。
>
> 以下がテスト用ドライバのソースになります。
>
>
> #define MODULE
> #define __KERNEL__
>
> #define PADR 0xff840000
> #define PADDR 0xff840010
> #define MODULE_NAME "test_gpio module"
>
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/init.h>
> #include <asm/io.h>
>
> static int init_test_gpio(void)
> {
> printk("<1>PADDR = 0x%08x\n", inb(PADDR));
>
> /* これはOK */
> outb(0xf0, PADDR);
> printk("<1>PADDR = 0x%08x\n", inb(PADDR));
>
> /* これを実行すると通常版カーネルは暴走する */
> outb(0xf0, PADR);
>
> /* 出力されない */
> printk("<1>%s initialized\n", MODULE_NAME);
>
> return 0;
> }
>
> static void cleanup_test_gpio(void)
> {
> printk("<1>%s removed\n", MODULE_NAME);
> }
>
> module_init(init_test_gpio);
> module_exit(cleanup_test_gpio);
>
> MODULE_LICENSE("GPL");
>
>
> カーネルコンフィグ時に "EP93XX GPIO Support"を外したりもして
> みましたが、結果は同じです。
>
> ご教示の程、よろしくお願いします。
>
>
>
>
>
>
>
>
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/mailman/listinfo/armadillo
>
armadillo メーリングリストの案内