mones2/21.NICドライバ移植/08.ed_nic_outb


Top / mones2 / 21.NICドライバ移植 / 08.ed_nic_outb

これは何か

if_ed.c再度コンパイルしよう
まずはed_nic_outb

成果

目次

流れ

ざっとソースを読んでみる、ed_nic_outbは outb のラッパであることが予想される。
少なくともこれが正しい動作をしないとお話にならないので、きちんとソースを読みます。
ちなみにこれが正しい動作をしないといけないのは,outb, inbは実際のI/O処理だから。

以下のようにdefineされていて

#define	ed_nic_outb(sc, port, value) \
	bus_space_write_1(sc->port_bst, sc->port_bsh, \
	    (sc)->nic_offset + (port), (value))
 
中略
#define	ed_nic_inb(sc, port) \
	bus_space_read_1(sc->port_bst, sc->port_bsh, (sc)->nic_offset + (port))

中身の実装は FreeBSD/src/sys/i386/include/bus.h

static __inline u_int8_t
bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
		 bus_size_t offset)
{
 
	if (tag == I386_BUS_SPACE_IO)
		return (inb(handle + offset));
	return (*(volatile u_int8_t *)(handle + offset));
}
 
static __inline void
bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh,
		       bus_size_t offset, u_int8_t value)
{
 
	if (tag == I386_BUS_SPACE_IO)
		outb(bsh + offset, value);
	else
		*(volatile u_int8_t *)(bsh + offset) = value;
}
 

んでMona的にはtag == I386_BUS_SPACE_IO が成立していると思ってよいはずなのでこんな感じにしてよいと思う。

static u_int8_t
bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle, bus_size_t offset)
{
    return (inb(handle + offset));
}
 
static void
bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t value)
{
    outb(bsh + offset, value);
}

これはI/Oの肝なのでmona_bus.cのようなファイルに分離して他のドライバから使えるようにしたほうがよさそう。(でも今は小規模でもあり見通しのために if_ed.cにいれておきます)

結果的に今はif_ed.cは原形をとどめずこんな感じです。下準備コード。

/* basic types */
typedef unsigned int uint32_t;
typedef unsigned int u_int;
typedef unsigned char u_int8_t;
 
/* bus types.h */
typedef uint32_t bus_size_t;
typedef int bus_space_tag_t;
typedef u_int bus_space_handle_t;
 
/* mona i/o */
u_int8_t inp8(unsigned int);
void outp8(unsigned port, u_int8_t value);
 
 
/* simple ed_softc */
struct ed_softc {
	bus_space_tag_t port_bst;
	bus_space_handle_t port_bsh;
	int	nic_offset;	/* NIC (DS8390) I/O bus address offset */
};
 
 
/* inp/outp */
#define ed_nic_inb(sc, port) \
    bus_space_read_1(sc->port_bst, sc->port_bsh, (sc)->nic_offset + (port))
 
#define ed_nic_outb(sc, port, value) \
    bus_space_write_1(sc->port_bst, sc->port_bsh, \
        (sc)->nic_offset + (port), (value))
 
static u_int8_t
bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle, bus_size_t offset)
{
    return (inp8(handle + offset));
}
 
static void
bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, u_int8_t value)
{
    outp8(bsh + offset, value);
}
 
 
void test()
{
    struct ed_softc* sc;
    ed_nic_outb(sc, 0x80, 0xff);
}
 

コメント

コメントはありません。 コメント/mones2/21.NICドライバ移植/08.ed_nic_outb?

お名前:

MENU

now: 2

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2571, today: 1, yesterday: 1

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:00 (3796d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.081 sec.