At an interrupt barrier, the host must be able to ensure that no
interrupt generated before reaching the barrier is still pending and
will be delivered after crossing the barrier.
For this, we introduce the following concept:
- interrupts have a serial number. This number is sent to the host
on EP 1 (currently bulk) to signal the interrupt, instead of the
zero byte we used previously.
- the new request ATUSB_SPI_WRITE2_SYNC returns the interrupt
serial number from after the register write (the register write
itself is the interrupt barrier).
- the host can now check if the serial indicated from bulk and the
serial from ATUSB_SPI_WRITE2_SYNC are the same. If yes, interrupts
are synchronized. If not, it has to wait for the interrupt to be
signaled on EP 1.
We should also consider the case that the interrupt serial has gotten
ahead of ATUSB_SPI_WRITE2_SYNC. But that seems to happen rarely. In
any case, it's something for the host driver to worry about, not for
the firmware.
- board.h (irq_serial), board_app.c (irq_serial, INT0_vect): count
the interrupt serial number and return it when signaling the
interrupt
- include/atusb/ep0.h (ATUSB_SPI_WRITE2_SYNC), ep0.c (my_setup):
new request ATUSB_SPI_WRITE2_SYNC that does a register write, then
returns the interrupt serial
This reverts commit 391c37f587.
The log isn't so useful in its present state because we may have to
unplug/replug to get out of a troublesome condition.
This reverts commit 39e3d4e61a.
The log isn't so useful in its present state because we may have to
unplug/replug to get out of a troublesome condition.
- atben.c (MMC_PATH, AT86RF230_PATH, find_file, slot_in_use): check
if the MMC or AT86RF230 kernel driver uses the 8:10 card slot and
print a detailed error message if it is
- atben.c (atben_open): fail if the 8:10 card slot is busy
The old "raw" function becomes get_key_init. Calling get_key_init is
only necessary if one wants to control the moment standard input is
switched to raw mode. If get_key is invoked without a prior call to
get_key_init, it will initialize automatically.
- atrf-path/gui.c (raw, main): renamed "raw" to get_key_init
- atrf-path/gui.c (old_term, restore_term, get_key_init, get_key):
moved to include/getkey.h and lib/getkey.c
- lib/getkey.c (get_key_init, get_key): made calling get_key_init
optional
- lib/Makefile (OBJS): added getkey.o
- install/INSTALL-PC: updated build process of lowpan-tools to
use the git repository
- tools/dirtpan/Makefile (CFLAGS): added include path for lowpan
tools from git
- install/INSTALL-PC: updated build process of lowpan-tools to
use the git repository
- tools/dirtpan/Makefile (CFLAGS): added include path for lowpan
tools from git
- usb/atu2.c (NUM_EPS), board.h (NUM_EPS): moved definition to
board.h
- board.h (NUM_EPS): use one EP for the boot loader, two for the
application
- usb/atu2.c (ep_init): initialize EP 1 only in an application build
- Makefile (USB_OBJS): moved into OBJS and BOOT_OBJS
- Makefile (OBJS): atu2.o is now app-atu2.o
- Makefile (BOOT_OBJS): atu2.o is now boot-atu2.o
- Makefile (MKDEP, %.o): moved dependency generation to macro $(MKDEP)
- Makefile (app-%.o): build from usb/%.c
- Makefile (boot -%.o): build from usb/%.c and set -DBOOT_LOADER
- dirtpan.c (stats, send_frame, send_more, send_ack, rx_pck, tx_pck,
ack_timeout, reass_timeout): gather extensive statistics
- dirtpan.c (handle_usr1, main): if running in the foreground, dump
statistics on standard error on SIGUSR1
- dirtpan.c (handle_usr2, main): if running in the foreground, reset
statistics to zero on SIGUSR2
- gui.c (area_off, gui): don't show a regulation area by default
- letter.h, letter.c: drawing of limited character set
- Makefile (OBJS_host, OBJS_ben_jlime): added letter.o
- gui.c (print, area_selector, gui): show regulation area selector
- gui.c (wlan_area): the currently displayed regulation domain
- gui.c (wlan_channels): return the number of WLAN channels
- gui.c (show_wlan_channel): determine whether the specified channel
should be used in the currently displayed regulation domain
- gui.c (label_wlan_channels): show WLAN channel numbers and their
width
- gui.c (gui): switch regulation domain with E (Europe), J (Japan),
and U (US)
- gui.c (gui): quit now only if Q is pressed instead of any key
- gui.c (gui): call label_wlan_channels to display the WLAN channels
- atrf-xmit.c (xfer_one): wait 10 ms for the packet to be sent (1 ms
was clearly too short)
- atrf-xmit.c (xfer_one): use wait_for_interrupt instead of
atrf_interrupt_wait, so that the retry logic can do its work
- atusb-common.c (atusb_interrupt_wait): the atusb firmware no longer
reads and accumulates IRQs for us. We now just wait for the
notification, then read IRQ_STATUS. Let higher layers take care of
retries and all that.
- atusb-common.c (atusb_open): clear any pending interrupts
- board_app.c (INT0_vect): always read IRQ_STATUS, even if an
interrupt is already enqueued
- board_app.c (INT0_vect): if an interrupt is enqueued, accumulate
the interrupts signaled since
- board_app.c (irqs_more): when a pending transfer completes, send
interrupts accumulated since (if any)
- board.h (gpio_cleanup), board_app.c (gpio_cleanup): restore INT0
when done manipulating GPIOs
- board.c (gpio): updated comment explaining how to restore INT0
- include/atusb/ep0.h (enum atspi_requests), ep0.c
(ATUSB_GPIO_CLEANUP): new request to return to normal operation
after ATUSB_GPIO
ausb_bulk_read may lose data when timing out. We therefore try to
minimize the number of times we time out. Reading until no more
interrupts arrive may have looked like a good idea, but it just
causes trouble for now.
- lib/atrf.c (atrf_interrupt_wait): interrupt_wait is no longer
optional
- atrf-proxy/atrf-proxy.c (cmd_more): we no longer need to handle
atrf_interrupt_wait being unsupported
- lib/atusb-common.c (atusb_interrupt_wait): clarify what we don't
want to return -1 on error