NTシステムデザインの技術メモ

Armadillo

最終更新:

ntaka206

- view
管理者のみ編集可

Armadillo220+kernel2.6.26でGPIO割り込みを受ける

Armadillo220
Kernel linux-2.6.26-at4-ep93xx-port-pre1
Atmarkdist 20090318

GPIOポートの変化で割り込みを発生させるモジュール。
Kernel2.6.12で動いていたコードがそのままでは動かなくなった。
その時の修正ポイントメモ。

定数など

struct gpio_port_reg {
	unsigned long ddr;
	unsigned long dr;
	unsigned long inten;
	unsigned long inttype1;
	unsigned long inttype2;
	unsigned long eoi;
	unsigned long db;
	unsigned long rawintsts;
	unsigned long intsts;
};
// 2.6.26
static struct gpio_port_reg porta = {
	.ddr       = EP93XX_GPIO_A_DIRECTION,
	.dr        = EP93XX_GPIO_A_DATA,
	.inten     = EP93XX_GPIO_A_INT_ENABLE,
	.inttype1  = EP93XX_GPIO_A_INT_TYPE1,
	.inttype2  = EP93XX_GPIO_A_INT_TYPE2,
	.eoi       = EP93XX_GPIO_A_INT_ACK,
	.db        = EP93XX_GPIO_A_DEBOUNCE,
	.rawintsts = EP93XX_GPIO_A_RAW_INT_STATUS,
	.intsts    = EP93XX_GPIO_A_INT_STATUS,
};

// 2.6.12
/*
static struct gpio_port_reg porta = {
	.ddr       = GPIO_PADDR,
	.dr        = GPIO_PADR,
	.inten     = GPIO_AINTEN,
	.inttype1  = GPIO_AINTTYPE1,
	.inttype2  = GPIO_AINTTYPE2,
	.eoi       = GPIO_AEOI,
	.db        = GPIO_ADB,
	.rawintsts = GPIO_RAWINTSTATUSA,
	.intsts    = GPIO_INTSTATUSA,
};
*/

struct gpio_info {
	unsigned long no;
	struct gpio_port_reg *port;
	unsigned long bit;
}; 

static struct gpio_info gpio[] = {
	{GPIO0, &porta, BIT(4)},
	{GPIO1, &porta, BIT(5)},
	{GPIO2, &porta, BIT(6)},
	{GPIO3, &porta, BIT(7)},
};

#define change_reg_bit(REG,BIT,VALUE)       \
({                                          \
	unsigned tmp;                       \
	tmp = (inl(REG) & ~BIT);            \
	outl(tmp | (VALUE ? BIT : 0), REG); \
})

#define get_reg_bit(REG,BIT)                \
	inl(REG) & BIT

割り込みハンドラ登録

//#define	IRQ_NO	IRQ_GPIO;	// 2.6.12
#define	IRQ_NO	(64 + 4) // base(64) + gpio_no(PortA4)	// 2.6.26

// 割り込みハンドラ登録
// ret = request_irq(irq, intsel_interrupt, SA_INTERRUPT, devname, NULL); // 2.6.12
ret = request_irq(IRQ_NO, intsel_interrupt, IRQF_DISABLED | IRQF_VALID | IRQF_PROBE, devname, NULL);	// 2.6.26
if (ret < 0) {
	printk(KERN_ERR "request_irq failed: unregister driver ret=%d\n", ret);
	unregister_chrdev(devmajor, devname);
	return -EBUSY;
}
/*
	GPIO割り込み設定
	立ち下がりINT
*/
// DDR <= INPUT
change_reg_bit(gpio[GPIO_INT].port->ddr, gpio[GPIO_INT].bit, 0);

// Low levelでINT
change_reg_bit(gpio[GPIO_INT].port->inttype1, gpio[GPIO_INT].bit, 0);
change_reg_bit(gpio[GPIO_INT].port->inttype2, gpio[GPIO_INT].bit, 0);

// DB <= debounce無効
change_reg_bit(gpio[GPIO_INT].port->db, gpio[GPIO_INT].bit, 0);

//EOI <= clear
change_reg_bit(gpio[GPIO_INT].port->eoi, gpio[GPIO_INT].bit, 1);

//INTEN <= enable
change_reg_bit(gpio[GPIO_INT].port->inten, gpio[GPIO_INT].bit, 1);

return 0;

IRQF_DISABLED: 以前のSA_INTERRUPTと同じ
IRQF_VALID: 多分IRQ有効にするという意味だろう。これがないと動かない。
IRQF_PROBE: 不明(^^;
2.6.12では、GPIO全体の割り込み(IRQ_GPIO 59番)を使っていたが、2.6.26ではGPIOのbit毎の割り込みを使った。

●2.6.12
GPIO全体の割り込み(IRQ_GPIO 59番)が使えた

●2.6.26
GPIO全体の割り込み(IRQ_EP93XX_GPIO_AB 59番)が使えない。
 request_irqがエラーになる。
 カーネル側でGPIO全体の割り込みを受けてからビットを見て割り振っている?

GPIOビット毎の割り込みが使える。
 今回の例では、GPIO0(Porta BIT4)では、IRQ_NO=(64 + 4)
 64番+GPIOビット番号(0~24=PortA0~PortC7)

Armadillo220のGPIO番号と、ここで言うGPIOビット番号は違う値なので注意!
Armadillo220のGPIO番号は、ユーザーが使用可能な信号だけ連番にしている。
GPIOビット番号は、CPUが内蔵しているGPIO信号すべての連番である。

割り込みハンドラ

//static irqreturn_t intsel_interrupt(int irq, void *dev_id, struct pt_regs *regs)	// 2.6.12
static irqreturn_t intsel_interrupt(int irq, void *dev_id)	// 2.6.26
{
	unsigned char	*p;

	// 割り込みとして指定した信号がLowでなければ間違いなので戻る
	if (get_reg_bit(gpio[GPIO_RDY].port->dr, gpio[GPIO_RDY].bit)) {
		return IRQ_HANDLED;
	}

// 割り込み処理を行う

	// ここでEOIしないこと、すると次の割り込みがかからない
	// カーネルでEOI済みだから?
	return IRQ_HANDLED;
}

2.6.26では、最初の一回目の割り込みが入ると次の割り込みが入らなくなる症状が出た。
これを割り込みポートのレベルをチェックすることで回避した。
Lowレベル割り込みを指定しているのに、ポートをチェックするとHighになっている!?

Armadillo-220でiproute2を使う

カーネルオプション

ArmadilloカーネルVer 2.6.12-3


これは、カーネルオプションに存在しない。ネタもとが2.4だからだと思われる。
The following kernel configuration options have to be enabled in the section Networking options:
   * Kernel/User netlink socket (CONFIG_NETLINK)なし
下記ONする。
   * Network packet filtering (CONFIG_NETFILTER)
 x Symbol: NETFILTER [=y]                                                  x
 x Prompt: Network packet filtering (replaces ipchains)                    x
 x   Defined at net/Kconfig:134                                            x
 x   Depends on: NET                                                       x
 x   Location:                                                             x
 x     -> Device Drivers                                                   x
 x       -> Networking support                                             x
 x         -> Networking support (NET [=y])                                x
 x           -> Networking options
下記ONする。
  * QoS and/or fair queueing (CONFIG_NET_SCHED) 
 x Symbol: NET_SCHED [=n]                                                  x
 x Prompt: QoS and/or fair queueing                                        x
 x   Defined at net/Kconfig:573                                            x
 x   Depends on: NET                                                       x
 x   Location:                                                             x
 x     -> Device Drivers                                                   x
 x       -> Networking support                                             x
 x         -> Networking support (NET [=y])                                x
 x           -> Networking options                                         x
 x             -> QoS and/or fair queueing                                 x
下記全てON
The following kernel configuration options should be enabled in the section Networking options, QoS and/or fair queueing:
   * CBQ packet scheduler (CONFIG_NET_SCH_CBQ)
   * The simplest PRIO pseudoscheduler (CONFIG_NET_SCH_PRIO)
   * RED queue (CONFIG_NET_SCH_RED)
   * GRED queue (CONFIG_NET_SCH_GRED)
   * Diffserv field marker (CONFIG_NET_SCH_DSMARK)
   * Ingress Qdisc (CONFIG_NET_SCH_INGRESS)
   * QoS support (CONFIG_NET_QOS)
   * Packet classifier API (CONFIG_NET_CLS)
   * TC index classifier (CONFIG_NET_CLS_TCINDEX)
   * Firewall based classifier (CONFIG_NET_CLS_FW)
   * U32 classifier (CONFIG_NET_CLS_U32)
   * Traffic policing (CONFIG_NET_CLS_POLICE) 
さらにカーネルでnetemをONにする
 x Symbol: NET_SCH_NETEM [=n]                                              x
 x Prompt: Network emulator                                                x
 x   Defined at net/sched/Kconfig:207                                      x
 x   Depends on: NET && NET_SCHED                                          x
 x   Location:                                                             x
 x     -> Device Drivers                                                   x
 x       -> Networking support                                             x
 x         -> Networking support (NET [=y])                                x
 x           -> Networking options                                         x
 x             -> QoS and/or fair queueing                                 x
 x               -> QoS and/or fair queueing (NET_SCHED [=y])              x
さらに TBF queue ON
 x Symbol: NET_SCH_TBF [=n]                                                x
 x Prompt: TBF queue                                                       x
 x   Defined at net/sched/Kconfig:171                                      x
 x   Depends on: NET && NET_SCHED                                          x
 x   Location:                                                             x
 x     -> Device Drivers                                                   x
 x       -> Networking support                                             x
 x         -> Networking support (NET [=y])                                x
 x           -> Networking options                                         x
 x             -> QoS and/or fair queueing                                 x
 x               -> QoS and/or fair queueing (NET_SCHED [=y])              x

iproute2のコンパイル

atmark-distに入っているiproute2だとエラーが出てコンパイルできず。
ここから
http://devresources.linux-foundation.org/dev/iproute2/download/
iproute2-2.6.11-050330.tar.gzwを落とす。

Makefileにrmofs追加
iproute2/Makefile
romfs:
	$(ROMFSINST) etc /etc
	for i in $(SUBDIRS); \
	do $(MAKE) -C $$i romfs; done
iproute2/lib/Makefile
romfs:
iproute2/tc/Makefile
romfs:
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_TC_TC /bin/tc
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_TC_TC /usr/lib/tc/q_netem.so
iproute2/ip/Makefile
romfs:
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_IP_IFCFG  /bin/ifcfg
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_IP_IP     /bin/ip
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_IP_ROUTEF /bin/routef
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_IP_ROUTEL /bin/routel
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_IP_RTACCT /bin/rtacct
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_IP_RTMON  /bin/rtmon
	$(ROMFSINST) -e CONFIG_USER_IPROUTE2_IP_RTPR   /bin/rtpr
romfsにディレクトリ追加
mkdir romfs/usr/lib/tc

tc/Makefileは、atmark-distのオリジナルを参考に色々変更したので、全部を掲載する。
# Path to parent kernel include files directory
KERNEL_INCLUDE=$(ROOTDIR)/$(LINUXDIR)/include
LIBC_INCLUDE=$(ROOTDIR)/include

DESTDIR=
SBINDIR=/usr/sbin
CONFDIR=/etc/iproute2
DOCDIR=/usr/share/doc/iproute2
MANDIR=/usr/share/man

# Path to db_185.h include
DBM_INCLUDE:=/usr/include

DEFINES= -DRESOLVE_HOSTNAMES

#options if you have a bind>=4.9.4 libresolv (or, maybe, glibc)
#LDLIBS=-lresolv
ADDLIB=

LDLIBS := -lresolv $(LDLIBS)
#options for decnet
ADDLIB+=dnet_ntop.o dnet_pton.o

#options for ipx
ADDLIB+=ipx_ntop.o ipx_pton.o

CC = arm-linux-gcc
#CC = gcc
HOSTCC = gcc
#CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall
#CFLAGS = $(CCOPTS) -I../include $(DEFINES)

CFLAGS := $(CCOPTS) $(GLIBCFIX) -I$(KERNEL_INCLUDE) -I../include $(DEFINES) $(CFLAGS)

LDLIBS += -L../lib -lnetlink -lutil
#LDLIBS += -L/usr/arm-linux/lib -L../lib -lnetlink -lutil

#SUBDIRS=lib ip tc misc netem
SUBDIRS=lib ip tc

LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a

#all: Config
#all: check-kernel
all:
	@for i in $(SUBDIRS); \
	do $(MAKE) $(MFLAGS) -C $$i; done

Config:
	./configure $(KERNEL_INCLUDE)

check-kernel:
ifeq ($(KERNEL_INCLUDE),)
	@echo "Please, set correct KERNEL_INCLUDE"; false
else
	@set -e; \
	if [ ! -r $(KERNEL_INCLUDE)/linux/autoconf.h ]; then \
		echo "Please, Compile the kernel first"; false; fi
endif

install: all
	install -m 0755 -d $(DESTDIR)$(SBINDIR)
	install -m 0755 -d $(DESTDIR)$(CONFDIR)
	install -m 0755 -d $(DESTDIR)$(DOCDIR)/examples
	install -m 0755 -d $(DESTDIR)$(DOCDIR)/examples/diffserv
	install -m 0644 README.iproute2+tc $(shell find examples -maxdepth 1 -type f) \
		$(DESTDIR)$(DOCDIR)/examples
	install -m 0644 $(shell find examples/diffserv -maxdepth 1 -type f) \
		$(DESTDIR)$(DOCDIR)/examples/diffserv
	@for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done
	install -m 0644 $(shell find etc/iproute2 -maxdepth 1 -type f) $(DESTDIR)$(CONFDIR)
	install -m 0755 -d $(DESTDIR)$(MANDIR)/man8
	install -m 0644 $(shell find man/man8 -maxdepth 1 -type f) $(DESTDIR)$(MANDIR)/man8
	ln -sf $(MANDIR)/man8/tc-pbfifo.8  $(DESTDIR)$(MANDIR)/man8/tc-bfifo.8
	ln -sf $(MANDIR)/man8/tc-pbfifo.8  $(DESTDIR)$(MANDIR)/man8/tc-pfifo.8
	install -m 0755 -d $(DESTDIR)$(MANDIR)/man3
	install -m 0644 $(shell find man/man3 -maxdepth 1 -type f) $(DESTDIR)$(MANDIR)/man3

clean:
	@for i in $(SUBDIRS) doc; \
	do $(MAKE) $(MFLAGS) -C $$i clean; done

clobber: clean
	rm -f Config

distclean: clean clobber
romfs:
	$(ROMFSINST) etc /etc
	for i in $(SUBDIRS); \
	do $(MAKE) -C $$i romfs; done

.EXPORT_ALL_VARIABLES:

atmark-dist カーネルconfig

$ make config いらないかも
$ make menuconfig メニュー出るのでここでconfig変える
$ make dep all

ダウンロードサイトURL


atmark-distのビルド方法@Armadillo2x0



トラブル

libssp0-arm-cross: 依存: gcc-4.1-base (= 4.1.1-21)

Armadillo開発環境(2009/07/21)インストール後に、apt-getで他のパッケージをインストールしようとすると下記のエラーが出る。
# apt-get install nfs-kernel-server
以下の問題を解決するために 'apt-get -f install' を実行する必要があるかもしれません:
以下のパッケージには満たせない依存関係があります:
  libssp0-arm-cross: 依存: gcc-4.1-base (= 4.1.1-21) しかし、4.1.2-25 はインストールされようとしています
原因は、開発環境がlenny未対応(etch対応)のため。
http://lists.atmark-techno.com/pipermail/armadillo/2009-March/004086.html

下記2つのページを元にして解決した。感謝!
備忘録 / memorandum book
http://jikiba.blog120.fc2.com/
メモページ/Armadillo - MemoWiki on sasrai.ddo.jp
http://sasrai.ddo.jp/~keiso/cgi-bin/memowiki/index.php?%A5%E1%A5%E2%A5%DA%A1%BC%A5%B8%2FArmadillo
上記ページでは、atde-essential-arm_5_all -> atde-essential-arm_9_allに読み替える必要あり。

apt-get updateでエラー「公開鍵を利用できない」

W: GPG error: http://cdn.debian.or.jp etch Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 9AA38DCD55BE302B
W: GPG error: http://ftp.debian.or.jp etch/updates Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 9AA38DCD55BE302B
W: GPG error: http://security.debian.org etch/updates Release: 公開鍵を利用でき ないため、以下の署名は検証できませんでした: NO_PUBKEY 9AA38DCD55BE302B
W: これらの問題を解決するためには apt-get update を実行する必要があるかもしれま せん

# gpg --keyserver pgp.mit.edu --recv-keys 9AA38DCD55BE302B
# gpg --armor --export 9AA38DCD55BE302B | apt-key add -

ネタもと
気長に日記: aptでつかう公開鍵の更新(玄箱:etch)
http://w033.seesaa.net/article/28051911.html

atmark-dist makeエラー arm-linux-gcc: Command not found


$ make
make ARCH=arm CROSS_COMPILE=arm-linux- -C linux-2.6.x  || exit 1
make[1]: arm-linux-gcc: Command not found

$ su
# cd /usr/bin
# ln -s arm-linux-gnu-cpp-4.1 arm-linux-cpp
# ln -s arm-linux-gnu-g++-4.1 arm-linux-g++
# ln -s arm-linux-gnu-gcc-4.1 arm-linux-gcc
# ln -s arm-linux-gnu-ld arm-linux-ld
# ln -s arm-linux-gnu-ar arm-linux-ar
# ln -s arm-linux-gnu-addr2line arm-linux-addr2line
# ln -s arm-linux-gnu-as arm-linux-as
# ln -s arm-linux-gnu-c++filt arm-linux-c++filt
# ln -s arm-linux-gnu-gdb arm-linux-gdb
# ln -s arm-linux-gnu-gdbtui arm-linux-gdbtui
# ln -s arm-linux-gnu-nm arm-linux-nm
# ln -s arm-linux-gnu-objcopy arm-linux-objcopy
# ln -s arm-linux-gnu-objdump arm-linux-objdump
# ln -s arm-linux-gnu-ranlib arm-linux-ranlib
# ln -s arm-linux-gnu-readelf arm-linux-readelf
# ln -s arm-linux-gnu-run arm-linux-run
# ln -s arm-linux-gnu-size arm-linux-size
# ln -s arm-linux-gnu-strings arm-linux-strings
# ln -s arm-linux-gnu-strip arm-linux-strip

ATDE環境ならば上記作業は、
atde-essential-armというパッケージの postinstで生成されるそうです。
see: /var/lib/dpkg/info/atde-essential-arm.postinst

atmark-dist makeエラー stdio.h: No such file or directory

net.c:12:19: error: stdio.h: No such file or directory
net.c:13:20: error: unistd.h: No such file or directory
net.c:14:20: error: stdlib.h: No such file or directory

$ su
# cd /usr
# ln -s arm-linux-gnu arm-linux

atmark-dist makeエラー tools/genfs_ext2.shでコンパイルに失敗

tools/genfs_ext2.shでコンパイルに失敗します | Armadillo 開発者サイト
http://armadillo.atmark-techno.com/faq/genext2fs-update

上記ページでは、genextfsを最新(1.3-7.1-cvs20050225)にしろと書いてあるが、現在2009/9では 1.4-rc1-2.1が最新である。
しかし、1.4-rc1-2.1では同じ問題が起こるので、結局はダウングレードすることになる。

インストールされていたバージョン 1.4-rc1-2.1

ここからdebファイルget
genext2fs_1.3-7.1-cvs20050225_i386.deb
http://armadillo.atmark-techno.com/filebrowser/armadillo-9/tools/


# dpkg --install genext2fs_1.3-7.1-cvs20050225_i386.deb
dpkg - 警告: genext2fs のバージョンを 1.4-rc1-2.1 から 1.3-7.1-cvs20050225 にダ ウングレードしています。

genext2fsバージョン固定しておく
# echo "genext2fs hold" | dpkg --set-selections

固定されたかどうかチェックする。Statusが以下のようになっていればOK。
# dpkg --status genext2fs
Status: hold ok installed

指定を解除する場合
# echo "genext2fs install" | dpkg --set-selections

名前:
コメント:

タグ:

Armadillo Linux
人気記事ランキング
目安箱バナー