diff --git a/ChangeLog b/ChangeLog index 8044da6e69..229e496b8a 100755 --- a/ChangeLog +++ b/ChangeLog @@ -10796,4 +10796,11 @@ interface (2015-08-08). * arch/arm/src/samv7: Add the framework for an SPI slave drvier. This driver has a lot of missing logic on initial commit (2015-08-09). + * arch/arm/src/samv7: Basic, no-DMA SPI slave driver is in place + (2015-080=-10). + * fs/vfs/epoll.c and include/sys/epoll.h: Add a very simple epoll layer + just around poll calls. To satisfy build app requirements. From Anton + D. Kachalov. + * drivers/mtd/ramtron.c: Update to include supportf for newer + RAMTRON parts. From David Sidrane. diff --git a/arch b/arch index 1efba67cba..6190d66466 160000 --- a/arch +++ b/arch @@ -1 +1 @@ -Subproject commit 1efba67cba08b28a2a4a1a4649daf2df93b2d596 +Subproject commit 6190d664666b19580969c4e620646ef4e54f0182 diff --git a/drivers/mtd/ramtron.c b/drivers/mtd/ramtron.c index 215c13f7b2..b800d0f27c 100644 --- a/drivers/mtd/ramtron.c +++ b/drivers/mtd/ramtron.c @@ -176,6 +176,14 @@ static const struct ramtron_parts_s g_ramtron_parts[] = 2, /* addr_len */ RAMTRON_INIT_CLK_MAX /* speed */ }, + { + "FM25V01A", /* name */ + 0x21, /* id1 */ + 0x08, /* id2 */ + 16L*1024L, /* size */ + 2, /* addr_len */ + RAMTRON_INIT_CLK_MAX /* speed */ + }, { "FM25V02", /* name */ 0x22, /* id1 */ @@ -184,6 +192,14 @@ static const struct ramtron_parts_s g_ramtron_parts[] = 2, /* addr_len */ RAMTRON_INIT_CLK_MAX /* speed */ }, + { + "FM25V02A", /* name */ + 0x22, /* id1 */ + 0x08, /* id2 */ + 32L*1024L, /* size */ + 2, /* addr_len */ + RAMTRON_INIT_CLK_MAX /* speed */ + }, { "FM25VN02", /* name */ 0x22, /* id1 */ @@ -224,6 +240,22 @@ static const struct ramtron_parts_s g_ramtron_parts[] = 3, /* addr_len */ RAMTRON_INIT_CLK_MAX /* speed */ }, + { + "FM25V20A", /* name */ + 0x25, /* id1 */ + 0x08, /* id2 */ + 256L*1024L, /* size */ + 3, /* addr_len */ + RAMTRON_INIT_CLK_MAX /* speed */ + }, + { + "CY15B104Q", /* name */ + 0x26, /* id1 */ + 0x08, /* id2 */ + 512L*1024L, /* size */ + 3, /* addr_len */ + RAMTRON_INIT_CLK_MAX /* speed */ + }, { "MB85RS1MT", /* name */ 0x27, /* id1 */ diff --git a/fs/vfs/Make.defs b/fs/vfs/Make.defs index 09d0eb5242..4c3fca0258 100644 --- a/fs/vfs/Make.defs +++ b/fs/vfs/Make.defs @@ -1,7 +1,7 @@ ############################################################################ # fs/vfs/Make.defs # -# Copyright (C) 2014 Gregory Nutt. All rights reserved. +# Copyright (C) 2014-2015 Gregory Nutt. All rights reserved. # Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without @@ -66,9 +66,9 @@ else # Common file/socket descriptor support CSRCS += fs_close.c fs_dup.c fs_dup2.c fs_fcntl.c fs_dupfd.c fs_dupfd2.c -CSRCS += fs_getfilep.c fs_ioctl.c fs_lseek.c fs_mkdir.c fs_open.c fs_poll.c -CSRCS += fs_read.c fs_rename.c fs_rmdir.c fs_stat.c fs_statfs.c fs_select.c -CSRCS += fs_unlink.c fs_write.c +CSRCS += fs_epoll.c fs_getfilep.c fs_ioctl.c fs_lseek.c fs_mkdir.c fs_open.c +CSRCS += fs_poll.c fs_read.c fs_rename.c fs_rmdir.c fs_stat.c fs_statfs.c +CSRCS += fs_select.c fs_unlink.c fs_write.c # Certain interfaces are not available if there is no mountpoint support diff --git a/fs/vfs/fs_epoll.c b/fs/vfs/fs_epoll.c new file mode 100644 index 0000000000..8cd6e227ac --- /dev/null +++ b/fs/vfs/fs_epoll.c @@ -0,0 +1,214 @@ +/**************************************************************************** + * fs/vfs/fs_epoll.c + * + * Copyright (C) 2015 Anton D. Kachalov. All rights reserved. + * Author: Anton D. Kachalov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#ifndef CONFIG_DISABLE_POLL + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: epoll_create + * + * Description: + * + * Input Parameters: + * + * Returned Value: + * + ****************************************************************************/ + +int epoll_create(int size) +{ + FAR struct epoll_head *eph = + (FAR struct epoll_head *)malloc(sizeof(struct epoll_head)); + + eph->size = size; + eph->occupied = 0; + eph->evs = malloc(sizeof(struct epoll_event) * eph->size); + + return (int)eph; +} + +/**************************************************************************** + * Name: epoll_close + * + * Description: + * + * Input Parameters: + * + * Returned Value: + * + ****************************************************************************/ + +void epoll_close(int epfd) +{ + struct epoll_head *eph = (struct epoll_head *)epfd; + + free(eph->evs); + free(eph); +} + +/**************************************************************************** + * Name: epoll_ctl + * + * Description: + * + * Input Parameters: + * + * Returned Value: + * + ****************************************************************************/ + +int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev) +{ + FAR struct epoll_head *eph = (FAR struct epoll_head *)epfd; + + switch (op) + { + case EPOLL_CTL_ADD: + fvdbg("%08x CTL ADD(%d): fd=%d ev=%08x\n", + epfd, eph->occupied, fd, ev->events); + + eph->evs[eph->occupied].events = ev->events | POLLERR | POLLHUP; + eph->evs[eph->occupied++].data.fd = fd; + return 0; + + case EPOLL_CTL_DEL: + { + int i; + + for (i = 0; i < eph->occupied; i++) + { + if (eph->evs[i].data.fd == fd) + { + if (i != eph->occupied-1) + { + memmove(&eph->evs[i], &eph->evs[i + 1], + eph->occupied - i); + } + + eph->occupied--; + return 0; + } + } + + return -ENOENT; + } + + case EPOLL_CTL_MOD: + { + int i; + + fvdbg("%08x CTL MOD(%d): fd=%d ev=%08x\n", + epfd, eph->occupied, fd, ev->events); + + for (i = 0; i < eph->occupied; i++) + { + if (eph->evs[i].data.fd == fd) + { + eph->evs[i].events = ev->events | POLLERR | POLLHUP; + return 0; + } + } + + return -ENOENT; + } + } + + return -EINVAL; +} + +/**************************************************************************** + * Name: epoll_wait + * + * Description: + * + * Input Parameters: + * + * Returned Value: + * + ****************************************************************************/ + +int epoll_wait(int epfd, FAR struct epoll_event *evs, int maxevents, + int timeout) +{ + int i; + int rc; + FAR struct epoll_head *eph = (FAR struct epoll_head *)epfd; + + rc = poll((FAR struct pollfd *)eph->evs, eph->occupied, timeout); + + if (rc <= 0) + { + if (rc < 0) + { + fdbg("%08x poll fail: %d for %d, %d msecs\n", + epfd, rc, eph->occupied, timeout); + + for (i = 0; i < eph->occupied; i++) + { + fdbg("%02d: fd=%d\n", i, eph->evs[i].data.fd); + } + } + + return rc; + } + + for (i = 0; i < rc; i++) + { + evs[i].data.fd = (pollevent_t)eph->evs[i].data.fd; + evs[i].events = (pollevent_t)eph->evs[i].revents; + } + + return rc; +} + +#endif /* CONFIG_DISABLE_POLL */ diff --git a/include/nuttx/spi/slave.h b/include/nuttx/spi/slave.h index f57493fa53..2fb7dd3762 100644 --- a/include/nuttx/spi/slave.h +++ b/include/nuttx/spi/slave.h @@ -133,7 +133,7 @@ * sctrlr - SPI slave controller interface instance * * Returned Value: - * true if the output wueue is full + * true if the output queue is full * ****************************************************************************/ @@ -172,11 +172,12 @@ * none * * Assumptions: - * May be called from an interrupt handler. + * May be called from an interrupt handler. Processing should be as + * brief as possible. * ****************************************************************************/ -#define SPI_SDEV_SELECT(d,s) ((c)->ops->select(d,s)) +#define SPI_SDEV_SELECT(d,s) ((d)->ops->select(d,s)) /**************************************************************************** * Name: SPI_SDEV_CMDDATA @@ -199,7 +200,8 @@ * none * * Assumptions: - * May be called from an interrupt handler. + * May be called from an interrupt handler. Processing should be as + * brief as possible. * ****************************************************************************/ @@ -225,7 +227,8 @@ * The next data value to be shifted out * * Assumptions: - * May be called from an interrupt handler. + * May be called from an interrupt handler and the response is usually + * time critical. * ****************************************************************************/ @@ -248,7 +251,10 @@ * None * * Assumptions: - * May be called from an interrupt handler. + * May be called from an interrupt handler and in time-critical + * circumstances. A good implementation might just add the newly + * received word to a queue, post a processing task, and return as + * quickly as possible to avoid any data overrun problems. * ****************************************************************************/ @@ -355,7 +361,12 @@ * For the case of uni-directional transfer of data from the master to * the SPI device, there is no need to call the enqueue() method at all; * the value that is shifted out is not important that fallback behavior - * is suficient. + * is sufficient. + * + * The SPI slave controller driver, of course, has no sense of the + * directionality of a data transfer; its role is only to exchange the + * data shifted in from the master with new data to be shifted out from + * the SPI device driver. * * 6) The activity of 5) will continue until the master raises the chip * select signal. In that case, the SPI slave controller driver will @@ -369,6 +380,12 @@ * the initial indication of chip selected will be the only call to the * select() method that is made. * + * Other SPI peripherals (such as Atmel) do not make the state of the + * chip select pin available (only the final rising edge transitions). + * So the SPI device driver implementation may use the chip select + * reports to optimize performance, but the design should never depend + * upon it. + * * A typical DMA data transfer processes as follows: * To be provided */ diff --git a/include/sys/epoll.h b/include/sys/epoll.h new file mode 100644 index 0000000000..01aecdd69e --- /dev/null +++ b/include/sys/epoll.h @@ -0,0 +1,110 @@ +/**************************************************************************** + * fs/vfs/fs_epoll.c + * + * Copyright (C) 2015 Anton D. Kachalov. All rights reserved. + * Author: Anton D. Kachalov + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __INCLUDE_NUTTX_SYS_EPOLL_H +#define __INCLUDE_NUTTX_SYS_EPOLL_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define EPOLL_CTL_ADD 1 /* Add a file descriptor to the interface. */ +#define EPOLL_CTL_DEL 2 /* Remove a file descriptor from the interface. */ +#define EPOLL_CTL_MOD 3 /* Change file descriptor epoll_event structure. */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +enum EPOLL_EVENTS + { + EPOLLIN = POLLIN, +#define EPOLLIN EPOLLIN + EPOLLPRI = POLLPRI, +#define EPOLLPRI EPOLLPRI + EPOLLOUT = POLLOUT, +#define EPOLLOUT EPOLLOUT + EPOLLRDNORM = POLLRDNORM, +#define EPOLLRDNORM EPOLLRDNORM + EPOLLRDBAND = POLLRDBAND, +#define EPOLLRDBAND EPOLLRDBAND + EPOLLWRNORM = POLLWRNORM, +#define EPOLLWRNORM EPOLLWRNORM + EPOLLWRBAND = POLLWRBAND, +#define EPOLLWRBAND EPOLLWRBAND + EPOLLERR = POLLERR, +#define EPOLLERR EPOLLERR + EPOLLHUP = POLLHUP, +#define EPOLLHUP EPOLLHUP + }; + +typedef union poll_data +{ + int fd; /* The descriptor being polled */ +} epoll_data_t; + +struct epoll_event +{ + epoll_data_t data; + FAR sem_t *sem; /* Pointer to semaphore used to post output event */ + pollevent_t events; /* The input event flags */ + pollevent_t revents; /* The output event flags */ + FAR void *priv; /* For use by drivers */ +}; + +struct epoll_head +{ + int size; + int occupied; + FAR struct epoll_event *evs; +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +int epoll_create(int size); +int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev); +int epoll_wait(int epfd, struct epoll_event *evs, int maxevents, int timeout); + +void epoll_close(int epfd); + +#endif /* __INCLUDE_NUTTX_SYS_EPOLL_H */