diff options
author | Xin LI <delphij@FreeBSD.org> | 2006-06-03 15:11:31 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2006-06-03 15:11:31 +0000 |
commit | e76e00aba4e8c2e6ea7b0399c1928e0071d73418 (patch) | |
tree | e66b6ebad113126391205fad833fd8376eb18c40 /zh_CN.GB2312/books | |
parent | f85dc878cd7da5bfe06a79577f67fad98f23db80 (diff) |
Notes
Diffstat (limited to 'zh_CN.GB2312/books')
-rw-r--r-- | zh_CN.GB2312/books/arch-handbook/pci/chapter.sgml | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/zh_CN.GB2312/books/arch-handbook/pci/chapter.sgml b/zh_CN.GB2312/books/arch-handbook/pci/chapter.sgml index 39cec8ed16..d4924aa666 100644 --- a/zh_CN.GB2312/books/arch-handbook/pci/chapter.sgml +++ b/zh_CN.GB2312/books/arch-handbook/pci/chapter.sgml @@ -2,7 +2,7 @@ The FreeBSD Documentation Project The FreeBSD Simplified Chinese Project - Original Revision: 1.23 + Original Revision: 1.24 $FreeBSD$ --> @@ -123,7 +123,7 @@ mypci_write(struct cdev *dev, struct uio *uio, int ioflag) /* Look up our softc. */ sc = dev->si_drv1; device_printf(sc->my_dev, "Asked to write %d bytes.\n", uio->uio_resid); - return (err); + return (0); } /* PCI支持函数 */ @@ -154,7 +154,7 @@ mypci_attach(device_t dev) { struct mypci_softc *sc; - printf("MyPCI Attach for : deviceID : 0x%x\n",pci_get_vendor(dev)); + printf("MyPCI Attach for : deviceID : 0x%x\n", pci_get_devid(dev)); /* Look up our softc and initialize its fields. */ sc = device_get_softc(dev); @@ -168,8 +168,9 @@ mypci_attach(device_t dev) */ sc->my_cdev = make_dev(<literal>&</literal>mypci_cdevsw, device_get_unit(dev), UID_ROOT, GID_WHEEL, 0600, "mypci%u", device_get_unit(dev)); + sc->my_cdev->si_drv1 = sc; printf("Mypci device loaded.\n"); - return (ENXIO); + return (0); } /* 分离设备。 */ @@ -291,7 +292,7 @@ SRCS+= device_if.h bus_if.h pci_if.h 函数中有些类似下面的东西:</para> <programlisting> sc->bar0id = PCIR_BAR(0); - sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &(sc->bar0id), + sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar0id, 0, ~0, 1, RF_ACTIVE); if (sc->bar0res == NULL) { printf("Memory allocation of PCI base register 0 failed!\n"); @@ -300,7 +301,7 @@ SRCS+= device_if.h bus_if.h pci_if.h } sc->bar1id = PCIR_BAR(1); - sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &(sc->bar1id), + sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar1id, 0, ~0, 1, RF_ACTIVE); if (sc->bar1res == NULL) { printf("Memory allocation of PCI base register 1 failed!\n"); @@ -320,7 +321,8 @@ SRCS+= device_if.h bus_if.h pci_if.h 特定的寄存器:</para> <programlisting>uint16_t -board_read(struct ni_softc *sc, uint16_t address) { +board_read(struct ni_softc *sc, uint16_t address) +{ return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address); } </programlisting> @@ -328,7 +330,8 @@ board_read(struct ni_softc *sc, uint16_t address) { <para>类似的,可以用下面的函数写寄存器:</para> <programlisting>void -board_write(struct ni_softc *sc, uint16_t address, uint16_t value) { +board_write(struct ni_softc *sc, uint16_t address, uint16_t value) +{ bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value); } </programlisting> @@ -336,6 +339,23 @@ board_write(struct ni_softc *sc, uint16_t address, uint16_t value) { <para>这些函数以8位,16位和32位的版本存在,你应当相应地使用 <function>bus_space_{read|write}_{1|2|4}</function>。</para> + <note> + <para>在 FreeBSD 7.0 和更高版本中, 可以用 + <function>bus_*</function> 函数来代替 + <function>bus_space_*</function>。 + <function>bus_*</function> 函数使用的参数是 <type>struct + resource *</type> 指针, 而不是 bus tag 和句柄。 + 这样, 您就可以将 <structname>softc</structname> + 中的 bus tag 和 bus 句柄这两个成员变量去掉, 并将 + <function>board_read()</function> 函数改写为:</para> + +<programlisting>uint16_t +board_read(struct ni_softc *sc, uint16_t address) +{ + return (bus_read(sc->bar1res, address)); +} +</programlisting> + </note> </sect2> <sect2> <title>中断</title> @@ -367,9 +387,6 @@ board_write(struct ni_softc *sc, uint16_t address, uint16_t value) { printf("Couldn't set up irq\n"); goto fail4; } - - sc->irq_bt = rman_get_bustag(sc->irqres); - sc->irq_bh = rman_get_bushandle(sc->irqres); </programlisting> <para>在设备的分离例程中必须注意一些问题。你必须停顿设备的中断流, |