summaryrefslogtreecommitdiffstats
path: root/doc/bsp_howto
diff options
context:
space:
mode:
Diffstat (limited to 'doc/bsp_howto')
-rw-r--r--doc/bsp_howto/Makefile152
-rw-r--r--doc/bsp_howto/Makefile.am118
-rw-r--r--doc/bsp_howto/network.t342
3 files changed, 460 insertions, 152 deletions
diff --git a/doc/bsp_howto/Makefile b/doc/bsp_howto/Makefile
deleted file mode 100644
index 0e12e674b3..0000000000
--- a/doc/bsp_howto/Makefile
+++ /dev/null
@@ -1,152 +0,0 @@
-#
-# COPYRIGHT (c) 1988-1999.
-# On-Line Applications Research Corporation (OAR).
-# All rights reserved.
-#
-# $Id$
-#
-
-PROJECT=bsp_howto
-
-include ../Make.config
-
-all: html info ps pdf
-
-dirs:
- $(make-dirs)
-
-COMMON_FILES=../common/cpright.texi ../common/setup.texi
-
-GENERATED_FILES= \
- intro.texi target.texi makefiles.texi linkcmds.texi support.texi \
- adaintr.texi init.texi console.texi clock.texi timer.texi rtc.texi \
- nvmem.texi network.texi shmsupp.texi analog.texi discrete.texi
-
-FILES=$(PROJECT).texi $(GENERATED_FILES)
-
-INFOFILES=$(wildcard $(PROJECT) $(PROJECT)-*)
-
-info: dirs $(PROJECT)
- #cp $(wildcard $(PROJECT) $(PROJECT)-*) $(INFO_INSTALL)
- # cp $(PROJECT) $(INFO_INSTALL)
-
-$(PROJECT): $(FILES)
- $(MAKEINFO) $(PROJECT).texi
-
-dvi: dirs $(PROJECT).dvi
-ps: dirs $(PROJECT).ps
-pdf: dirs $(PROJECT).pdf
-
-$(PROJECT).pdf: $(FILES)
- $(TEXI2PDF) $(PROJECT).texi
- cp $(PROJECT).pdf $(WWW_INSTALL)/$(PROJECT)
-
-$(PROJECT).ps: $(PROJECT).dvi
- dvips -o $(PROJECT).ps $(PROJECT).dvi
- cp $(PROJECT).ps $(WWW_INSTALL)/$(PROJECT)
-
-$(PROJECT).dvi: $(FILES)
- $(TEXI2DVI) $(PROJECT).texi
- cp $(PROJECT).dvi $(WWW_INSTALL)/$(PROJECT)
-
-html: dirs $(FILES)
- -mkdir -p $(WWW_INSTALL)/$(PROJECT)
- $(TEXI2WWW) $(TEXI2WWW_ARGS) -dir $(WWW_INSTALL)/$(PROJECT) \
- $(PROJECT).texi
-
-clean:
- rm -f *.o $(PROG) *.txt core $(PROJECT).pdf
- rm -f *.dvi *.ps *.log *.aux *.cp *.fn *.ky *.pg *.toc *.tp *.vr $(BASE)
- rm -f $(PROJECT) $(PROJECT)-* $(GENERATED_FILES)
- rm -f *.fixed _* network.t
-
-#
-# Grab the chapter on writing a network device driver.
-#
-network.t:
- ln -s ../networking/driver.t network.t
-
-
-#
-# Process Automatically Generated Files
-#
-
-intro.texi: intro.t Makefile
- $(BMENU) -p "Top" \
- -u "Top" \
- -n "Target Dependent Files" ${*}.t
-
-target.texi: target.t Makefile
- $(BMENU) -p "Introduction" \
- -u "Top" \
- -n "Makefiles" ${*}.t
-
-makefiles.texi: makefiles.t Makefile
- $(BMENU) -p "Target Dependent Files Board Support Package Structure" \
- -u "Top" \
- -n "Linker Script" ${*}.t
-
-linkcmds.texi: linkcmds.t Makefile
- $(BMENU) -p "Makefiles Creating a New BSP Make Customization File" \
- -u "Top" \
- -n "Ada95 Interrupt Support" ${*}.t
-
-adaintr.texi: adaintr.t Makefile
- $(BMENU) -p "Linker Script Initialized Data" \
- -u "Top" \
- -n "Miscellaneous Support Files" ${*}.t
-
-support.texi: support.t Makefile
- $(BMENU) -p "Ada95 Interrupt Support Version Requirements" \
- -u "Top" \
- -n "" ${*}.t
-
-init.texi: init.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-console.texi: console.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-clock.texi: clock.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-timer.texi: timer.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-rtc.texi: rtc.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-nvmem.texi: nvmem.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-network.texi: network.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-shmsupp.texi: shmsupp.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-analog.texi: analog.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
-
-discrete.texi: discrete.t Makefile
- $(BMENU) -p "" \
- -u "Top" \
- -n "" ${*}.t
diff --git a/doc/bsp_howto/Makefile.am b/doc/bsp_howto/Makefile.am
new file mode 100644
index 0000000000..4657bbe873
--- /dev/null
+++ b/doc/bsp_howto/Makefile.am
@@ -0,0 +1,118 @@
+#
+# COPYRIGHT (c) 1988-1999.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+AUTOMAKE_OPTIONS = foreign
+
+PROJECT=bsp_howto
+
+include $(top_srcdir)/project.am
+
+COMMON_FILES=$(top_srcdir)/common/cpright.texi $(top_builddir)/common/setup.texi
+
+GENERATED_FILES= \
+ intro.texi target.texi makefiles.texi linkcmds.texi support.texi \
+ adaintr.texi init.texi console.texi clock.texi timer.texi rtc.texi \
+ nvmem.texi network.texi shmsupp.texi analog.texi discrete.texi
+
+FILES=
+
+info_TEXINFOS = bsp_howto.texi
+bsp_howto_TEXINFOS = $(FILES) $(COMMON_FILES) $(GENERATED_FILES)
+
+#
+# Grab the chapter on writing a network device driver.
+#
+network.t:
+ ln -s ../networking/driver.t network.t
+
+
+#
+# Process Automatically Generated Files
+#
+
+intro.texi: intro.t
+ $(BMENU) -p "Top" \
+ -u "Top" \
+ -n "Target Dependent Files" $<
+
+target.texi: target.t
+ $(BMENU) -p "Introduction" \
+ -u "Top" \
+ -n "Makefiles" $<
+
+makefiles.texi: makefiles.t
+ $(BMENU) -p "Target Dependent Files Board Support Package Structure" \
+ -u "Top" \
+ -n "Linker Script" $<
+
+linkcmds.texi: linkcmds.t
+ $(BMENU) -p "Makefiles Creating a New BSP Make Customization File" \
+ -u "Top" \
+ -n "Ada95 Interrupt Support" $<
+
+adaintr.texi: adaintr.t
+ $(BMENU) -p "Linker Script Initialized Data" \
+ -u "Top" \
+ -n "Miscellaneous Support Files" $<
+
+support.texi: support.t
+ $(BMENU) -p "Ada95 Interrupt Support Version Requirements" \
+ -u "Top" \
+ -n "" $<
+
+init.texi: init.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+console.texi: console.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+clock.texi: clock.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+timer.texi: timer.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+rtc.texi: rtc.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+nvmem.texi: nvmem.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+network.texi: network.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+shmsupp.texi: shmsupp.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+analog.texi: analog.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+discrete.texi: discrete.t
+ $(BMENU) -p "" \
+ -u "Top" \
+ -n "" $<
+
+EXTRA_DIST = *.t
diff --git a/doc/bsp_howto/network.t b/doc/bsp_howto/network.t
new file mode 100644
index 0000000000..c2fa4866f6
--- /dev/null
+++ b/doc/bsp_howto/network.t
@@ -0,0 +1,342 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-1999.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Networking Driver
+
+@section Introduction
+
+This chapter is intended to provide an introduction to the
+procedure for writing RTEMS network device drivers.
+The example code is taken from the `Generic 68360' network device
+driver. The source code for this driver is located in the
+@code{c/src/lib/libbsp/m68k/gen68360/network} directory in the RTEMS
+source code distribution. Having a copy of this driver at
+hand when reading the following notes will help significantly.
+
+@section Learn about the network device
+
+Before starting to write the network driver become completely
+familiar with the programmer's view of the device.
+The following points list some of the details of the
+device that must be understood before a driver can be written.
+
+@itemize @bullet
+
+@item Does the device use DMA to transfer packets to and from
+memory or does the processor have to
+copy packets to and from memory on the device?
+
+@item If the device uses DMA, is it capable of forming a single
+outgoing packet from multiple fragments scattered in separate
+memory buffers?
+
+@item If the device uses DMA, is it capable of chaining multiple
+outgoing packets, or does each outgoing packet require
+intervention by the driver?
+
+@item Does the device automatically pad short frames to the minimum
+64 bytes or does the driver have to supply the padding?
+
+@item Does the device automatically retry a transmission on detection
+of a collision?
+
+@item If the device uses DMA, is it capable of buffering multiple
+packets to memory, or does the receiver have to be restarted
+after the arrival of each packet?
+
+@item How are packets that are too short, too long, or received with
+CRC errors handled? Does the device automatically continue
+reception or does the driver have to intervene?
+
+@item How is the device Ethernet address set? How is the device
+programmed to accept or reject broadcast and multicast packets?
+
+@item What interrupts does the device generate? Does it generate an
+interrupt for each incoming packet, or only for packets received
+without error? Does it generate an interrupt for each packet
+transmitted, or only when the transmit queue is empty? What
+happens when a transmit error is detected?
+
+@end itemize
+
+In addition, some controllers have specific questions regarding
+board specific configuration. For example, the SONIC Ethernet
+controller has a very configurable data bus interface. It can
+even be configured for sixteen and thirty-two bit data buses. This
+type of information should be obtained from the board vendor.
+
+@section Understand the network scheduling conventions
+
+When writing code for the driver transmit and receive tasks,
+take care to follow the network scheduling conventions. All tasks
+which are associated with networking share various
+data structures and resources. To ensure the consistency
+of these structures the tasks
+execute only when they hold the network semaphore (@code{rtems_bsdnet_semaphore}).
+The transmit and receive tasks must abide by this protocol. Be very
+careful to avoid `deadly embraces' with the other network tasks.
+A number of routines are provided to make it easier for the network
+driver code to conform to the network task scheduling conventions.
+
+@itemize @bullet
+
+@item @code{void rtems_bsdnet_semaphore_release(void)}
+
+This function releases the network semaphore.
+The network driver tasks must call this function immediately before
+making any blocking RTEMS request.
+
+@item @code{void rtems_bsdnet_semaphore_obtain(void)}
+
+This function obtains the network semaphore.
+If a network driver task has released the network semaphore to allow other
+network-related tasks to run while the task blocks, then this function must
+be called to reobtain the semaphore immediately after the return from the
+blocking RTEMS request.
+
+@item @code{rtems_bsdnet_event_receive(rtems_event_set, rtems_option, rtems_interval, rtems_event_set *)}
+The network driver task should call this function when it wishes to wait
+for an event. This function releases the network semaphore,
+calls @code{rtems_event_receive} to wait for the specified event
+or events and reobtains the semaphore.
+The value returned is the value returned by the @code{rtems_event_receive}.
+
+@end itemize
+
+@section Network Driver Makefile
+
+Network drivers are considered part of the BSD network package and as such
+are to be compiled with the appropriate flags. This can be accomplished by
+adding @code{-D__INSIDE_RTEMS_BSD_TCPIP_STACK__} to the @code{command line}.
+If the driver is inside the RTEMS source tree or is built using the
+RTEMS application Makefiles, then adding the following line accomplishes
+this:
+
+@example
+DEFINES += -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
+@end example
+
+This is equivalent to the following list of definitions. Early versions
+of the RTEMS BSD network stack required that all of these be defined.
+
+@example
+-D_COMPILING_BSD_KERNEL_ -DKERNEL -DINET -DNFS \
+ -DDIAGNOSTIC -DBOOTP_COMPAT
+@end example
+
+Defining these macros tells the network header files that the driver
+is to be compiled with extended visibility into the network stack. This
+is in sharp contrast to applications that simply use the network stack.
+Applications do not require this level of visibility and should stick
+to the portable application level API.
+
+As a direct result of being logically internal to the network stack,
+network drivers use the BSD memory allocation routines This means,
+for example, that malloc takes three arguments. See the SONIC
+device driver (@code{c/src/lib/libchip/network/sonic.c}) for an example
+of this. Because of this, network drivers should not include
+@code{<stdlib.h>}. Doing so will result in conflicting definitions
+of @code{malloc()}.
+
+@b{Application level} code including network servers such as the FTP
+daemon are @b{not} part of the BSD kernel network code and should not be
+compiled with the BSD network flags. They should include
+@code{<stdlib.h>} and not define the network stack visibility
+macros.
+
+@section Write the Driver Attach Function
+
+The driver attach function is responsible for configuring the driver
+and making the connection between the network stack
+and the driver.
+
+Driver attach functions take a pointer to an
+@code{rtems_bsdnet_ifconfig} structure as their only argument.
+and set the driver parameters based on the
+values in this structure. If an entry in the configuration
+structure is zero the attach function chooses an
+appropriate default value for that parameter.
+
+
+The driver should then set up several fields in the ifnet structure
+in the device-dependent data structure supplied and maintained by the driver:
+
+@table @code
+@item ifp->if_softc
+Pointer to the device-dependent data. The first entry
+in the device-dependent data structure must be an @code{arpcom}
+structure.
+
+@item ifp->if_name
+The name of the device. The network stack uses this string
+and the device number for device name lookups. The device name should
+be obtained from the @code{name} entry in the configuration structure.
+
+@item ifp->if_unit
+The device number. The network stack uses this number and the
+device name for device name lookups. For example, if
+@code{ifp->if_name} is @samp{scc} and @code{ifp->if_unit} is @samp{1},
+the full device name would be @samp{scc1}. The unit number should be
+obtained from the `name' entry in the configuration structure.
+
+@item ifp->if_mtu
+The maximum transmission unit for the device. For Ethernet
+devices this value should almost always be 1500.
+
+@item ifp->if_flags
+The device flags. Ethernet devices should set the flags
+to @code{IFF_BROADCAST|IFF_SIMPLEX}, indicating that the
+device can broadcast packets to multiple destinations
+and does not receive and transmit at the same time.
+
+@item ifp->if_snd.ifq_maxlen
+The maximum length of the queue of packets waiting to be
+sent to the driver. This is normally set to @code{ifqmaxlen}.
+
+@item ifp->if_init
+The address of the driver initialization function.
+
+@item ifp->if_start
+The address of the driver start function.
+
+@item ifp->if_ioctl
+The address of the driver ioctl function.
+
+@item ifp->if_output
+The address of the output function. Ethernet devices
+should set this to @code{ether_output}.
+@end table
+
+RTEMS provides a function to parse the driver name in the
+configuration structure into a device name and unit number.
+
+@example
+int rtems_bsdnet_parse_driver_name (
+ const struct rtems_bsdnet_ifconfig *config,
+ char **namep
+);
+@end example
+
+The function takes two arguments; a pointer to the configuration
+structure and a pointer to a pointer to a character. The function
+parses the configuration name entry, allocates memory for the driver
+name, places the driver name in this memory, sets the second argument
+to point to the name and returns the unit number.
+On error, a message is printed and -1 is returned.
+
+Once the attach function has set up the above entries it must link the
+driver data structure onto the list of devices by
+calling @code{if_attach}. Ethernet devices should then
+call @code{ether_ifattach}. Both functions take a pointer to the
+device's @code{ifnet} structure as their only argument.
+
+The attach function should return a non-zero value to indicate that
+the driver has been successfully configured and attached.
+
+@section Write the Driver Start Function.
+This function is called each time the network stack wants to start the
+transmitter. This occures whenever the network stack adds a packet
+to a device's send queue and the @code{IFF_OACTIVE} bit in the
+device's @code{if_flags} is not set.
+
+For many devices this function need only set the @code{IFF_OACTIVE} bit in the
+@code{if_flags} and send an event to the transmit task
+indicating that a packet is in the driver transmit queue.
+
+
+@section Write the Driver Initialization Function.
+
+This function should initialize the device, attach to interrupt handler,
+and start the driver transmit and receive tasks. The function
+
+@example
+rtems_id
+rtems_bsdnet_newproc (char *name,
+ int stacksize,
+ void(*entry)(void *),
+ void *arg);
+@end example
+
+should be used to start the driver tasks.
+
+Note that the network stack may call the driver initialization function more
+than once.
+Make sure multiple versions of the receive and transmit tasks are not accidentally
+started.
+
+
+
+@section Write the Driver Transmit Task
+
+This task is reponsible for removing packets from the driver send queue and sending them to the device. The task should block waiting for an event from the
+driver start function indicating that packets are waiting to be transmitted.
+When the transmit task has drained the driver send queue the task should clear
+the @code{IFF_OACTIVE} bit in @code{if_flags} and block until another outgoing
+packet is queued.
+
+
+@section Write the Driver Receive Task
+This task should block until a packet arrives from the device. If the
+device is an Ethernet interface the function @code{ether_input} should be called
+to forward the packet to the network stack. The arguments to @code{ether_input}
+are a pointer to the interface data structure, a pointer to the ethernet
+header and a pointer to an mbuf containing the packet itself.
+
+
+
+
+@section Write the Driver Interrupt Handler
+A typical interrupt handler will do nothing more than the hardware
+manipulation required to acknowledge the interrupt and send an RTEMS event
+to wake up the driver receive or transmit task waiting for the event.
+Network interface interrupt handlers must not make any calls to other
+network routines.
+
+
+
+@section Write the Driver IOCTL Function
+This function handles ioctl requests directed at the device. The ioctl
+commands which must be handled are:
+
+@table @code
+@item SIOCGIFADDR
+@item SIOCSIFADDR
+If the device is an Ethernet interface these
+commands should be passed on to @code{ether_ioctl}.
+
+@item SIOCSIFFLAGS
+This command should be used to start or stop the device,
+depending on the state of the interface @code{IFF_UP} and
+@code{IFF_RUNNING} bits in @code{if_flags}:
+@table @code
+@item IFF_RUNNING
+Stop the device.
+
+@item IFF_UP
+Start the device.
+
+@item IFF_UP|IFF_RUNNING
+Stop then start the device.
+
+@item 0
+Do nothing.
+
+@end table
+@end table
+
+
+
+@section Write the Driver Statistic-Printing Function
+This function should print the values of any statistic/diagnostic
+counters the network driver may use. The driver ioctl function should call
+the statistic-printing function when the ioctl command is
+@code{SIO_RTEMS_SHOW_STATS}.
+
+