docs/90830: Update for books/arch-handbook/pci
Marius Nuennerich
marius.nuennerich at gmx.net
Thu Dec 22 23:10:04 UTC 2005
>Number: 90830
>Category: docs
>Synopsis: Update for books/arch-handbook/pci
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-doc
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: doc-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Dec 22 23:10:02 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Marius Nuennerich
>Release: FreeBSD 5.4-RELEASE-p5 i386
>Organization:
>Environment:
>Description:
The attached patch is an update to the PCI chapter in the Architecture Handbook.
I tried to compile the old code but that isn't possible anymore
because of phk's dev_t -> struct cdev * change. Being new to PCI programming
I changed a few other things in the sample that confused me and that I learned
while reading other documentation about the topic.
Being also new to docbook my xml probably isn't the best.
>How-To-Repeat:
>Fix:
--- pci.diff begins here ---
--- chapter.sgml.bak Sun Dec 18 23:13:36 2005
+++ chapter.sgml Thu Dec 22 23:38:34 2005
@@ -18,138 +18,131 @@
<para>Information here about how the PCI bus code iterates through
the unattached devices and see if a newly loaded kld will attach
to any of them.</para>
+ <sect2>
+ <title>Sample code:</title>
-<programlisting>/*
+ <programlisting>/*
* Simple KLD to play with the PCI functions.
*
* Murray Stokely
*/
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-
#include <sys/param.h> /* defines used in kernel.h */
#include <sys/module.h>
#include <sys/systm.h>
-#include <sys/errno.h>
+#include <sys/errno.h> /* ENXIO */
#include <sys/kernel.h> /* types used in module initialization */
#include <sys/conf.h> /* cdevsw struct */
#include <sys/uio.h> /* uio struct */
#include <sys/malloc.h>
-#include <sys/bus.h> /* structs, prototypes for pci bus stuff */
+#include <sys/bus.h> /* structs, prototypes for pci bus stuff */
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>
-#include <dev/pci/pcivar.h> /* For get_pci macros! */
+#include <dev/pci/pcivar.h> /* For pci_get macros! */
#include <dev/pci/pcireg.h>
/* Function prototypes */
-d_open_t mypci_open;
-d_close_t mypci_close;
-d_read_t mypci_read;
-d_write_t mypci_write;
+static d_open_t mypci_open;
+static d_close_t mypci_close;
+static d_read_t mypci_read;
+static d_write_t mypci_write;
/* Character device entry points */
-
static struct cdevsw mypci_cdevsw = {
.d_open = mypci_open,
.d_close = mypci_close,
.d_read = mypci_read,
.d_write = mypci_write,
- .d_name = "mypci",
+ .d_name = "mypci"
};
/* vars */
-static dev_t sdev;
+static struct cdev *mypci_dev; /* for make_dev */
-/* We're more interested in probe/attach than with
- open/close/read/write at this point */
+/*
+ * We're more interested in probe/attach than with
+ * open/close/read/write at this point
+ */
-int
-mypci_open(dev_t dev, int oflags, int devtype, d_thread_t *td)
+static int
+mypci_open(struct cdev *dev, int oflags, int devtype, d_thread_t *td)
{
- int err = 0;
-
- printf("Opened device \"mypci\" successfully.\n");
- return (err);
+ printf("mypci: open!\n");
+ return (0);
}
-int
-mypci_close(dev_t dev, int fflag, int devtype, d_thread_t *td)
+static int
+mypci_close(struct cdev *dev, int fflag, int devtype, d_thread_t *td)
{
- int err = 0;
-
- printf("Closing device \"mypci.\"\n");
- return (err);
+ printf("mypci: close!\n");
+ return (0);
}
-int
-mypci_read(dev_t dev, struct uio *uio, int ioflag)
+static int
+mypci_read(struct cdev *dev, struct uio *uio, int ioflag)
{
- int err = 0;
-
- printf("mypci read!\n");
- return (err);
+ printf("mypci: read!\n");
+ return (0);
}
-int
-mypci_write(dev_t dev, struct uio *uio, int ioflag)
+static int
+mypci_write(struct cdev *dev, struct uio *uio, int ioflag)
{
- int err = 0;
-
- printf("mypci write!\n");
- return (err);
+ printf("mypci: write!\n");
+ return (0);
}
/* PCI Support Functions */
/*
- * Return identification string if this is device is ours.
+ * Print identification string if this device is ours.
*/
static int
mypci_probe(device_t dev)
{
- device_printf(dev, "MyPCI Probe\nVendor ID : 0x%x\nDevice ID : 0x%x\n",
+ device_printf(dev, "probe: VendorID: 0x%04x DeviceID: 0x%04x\n",
pci_get_vendor(dev), pci_get_device(dev));
if (pci_get_vendor(dev) == 0x11c1) {
- printf("We've got the Winmodem, probe successful!\n");
- return (0);
+ device_printf(dev, "We've got the Winmodem, probe successful!\n");
+ device_set_desc(dev, "Winmodem");
+ return (BUS_PROBE_DEFAULT);
}
return (ENXIO);
}
-/* Attach function is only called if the probe is successful */
-
+/*
+ * Attach function is only called if the probe is successful.
+ */
static int
mypci_attach(device_t dev)
{
-
- printf("MyPCI Attach for : deviceID : 0x%x\n",pci_get_vendor(dev));
- sdev = make_dev(<literal>&</literal>mypci_cdevsw, 0, UID_ROOT,
+ device_printf(dev, "attach: DeviceID: 0x%04x\n", pci_get_device(dev));
+ mypci_dev = make_dev(<literal>&</literal>mypci_cdevsw, 0, UID_ROOT,
GID_WHEEL, 0600, "mypci");
- printf("Mypci device loaded.\n");
- return (ENXIO);
+ return (0);
}
-/* Detach device. */
-
+/*
+ * Detach device.
+ */
static int
mypci_detach(device_t dev)
{
-
- printf("Mypci detach!\n");
+ device_printf(dev, "detach!\n");
return (0);
}
-/* Called during system shutdown after sync. */
-
+/*
+ * Called during system shutdown after sync.
+ */
static int
mypci_shutdown(device_t dev)
{
-
- printf("Mypci shutdown!\n");
+ device_printf(dev, "shutdown!\n");
return (0);
}
@@ -159,20 +152,17 @@
static int
mypci_suspend(device_t dev)
{
-
- printf("Mypci suspend!\n");
+ device_printf(dev, "suspend!\n");
return (0);
}
/*
* Device resume routine.
*/
-
static int
mypci_resume(device_t dev)
{
-
- printf("Mypci resume!\n");
+ device_printf(dev, "resume!\n");
return (0);
}
@@ -191,24 +181,41 @@
static driver_t mypci_driver = {
"mypci",
mypci_methods,
- 0,
- /* sizeof(struct mypci_softc), */
+ 0 /* sizeof(struct mypci_softc) */
};
static devclass_t mypci_devclass;
DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);</programlisting>
- <para>Additional Resources
- <itemizedlist>
- <listitem><simpara><ulink url="http://www.pcisig.org/">PCI
- Special Interest Group</ulink></simpara></listitem>
+ </sect2>
+ <sect2>
+ <title>Makefile</title>
+
+ <programlisting>KMOD=mypci
+SRCS=mypci.c
+SRCS+=device_if.h bus_if.h pci_if.h
+
+.include <bsd.kmod.mk></programlisting>
+
+ <para>Simply running <command>make</command> with the above
+ <filename>Makefile</filename>
+ will create a file <filename>mypci.ko</filename> that can
+ be loaded into your system by typing:
+ <screen>&prompt.root; <userinput>kldload ./mypci.ko</userinput></screen>
+ </para>
+ </sect2>
+ <sect2>
+ <title>Additional Resources</title>
+ <itemizedlist>
+ <listitem><simpara><ulink url="http://www.pcisig.org/">PCI
+ Special Interest Group</ulink></simpara></listitem>
- <listitem><simpara>PCI System Architecture, Fourth Edition by
- Tom Shanley, et al.</simpara></listitem>
+ <listitem><simpara>PCI System Architecture, Fourth Edition by
+ Tom Shanley, et al.</simpara></listitem>
- </itemizedlist>
- </para>
+ </itemizedlist>
+ </sect2>
</sect1>
<sect1 id="pci-bus">
--- pci.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-doc
mailing list