diff options
Diffstat (limited to 'recipes-bsp/esp32spid')
-rw-r--r-- | recipes-bsp/esp32spid/LICENSE | 339 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/esp32spid_0.1.bb | 28 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/src/Makefile | 15 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/src/msgq.c | 42 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/src/msgq.h | 19 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/src/spi.c | 284 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/src/spi.h | 24 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/src/tun.c | 94 | ||||
-rw-r--r-- | recipes-bsp/esp32spid/src/tun.h | 8 |
9 files changed, 0 insertions, 853 deletions
diff --git a/recipes-bsp/esp32spid/LICENSE b/recipes-bsp/esp32spid/LICENSE deleted file mode 100644 index d159169..0000000 --- a/recipes-bsp/esp32spid/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/recipes-bsp/esp32spid/esp32spid_0.1.bb b/recipes-bsp/esp32spid/esp32spid_0.1.bb deleted file mode 100644 index f403c5b..0000000 --- a/recipes-bsp/esp32spid/esp32spid_0.1.bb +++ /dev/null @@ -1,28 +0,0 @@ -DESCRIPTION = "esp32 spi daemon" -SECTION = "base" -LICENSE = "GPLv2" -LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263" -PR = "r0" - -FILESEXTRAPATHS_prepend := "${THISDIR}:" - -SRC_URI = " \ - file://src/ \ - file://LICENSE \ -" - -S = "${WORKDIR}/src" -TARGET_CC_ARCH += "${LDFLAGS}" - -do_compile () { - cd ${S} - ${MAKE} -} - -do_install () { - install -d ${D}${bindir} - install -m 0755 ${S}/esp32spid ${D}${bindir}/ -} - -DEPENDS = "libgpiod" -RDEPENDS_${PN} = "libgpiod"
\ No newline at end of file diff --git a/recipes-bsp/esp32spid/src/Makefile b/recipes-bsp/esp32spid/src/Makefile deleted file mode 100644 index fcecbd5..0000000 --- a/recipes-bsp/esp32spid/src/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -#CFLAGS = -LDFLAGS = -pthread -lgpiod -TARGET = esp32spid -obj = msgq.o spi.o tun.o - -all: $(TARGET) - -%.o: %.c %.h - $(CC) $(CFLAGS) -c $< - -$(TARGET): $(obj) - $(CC) $(obj) $(LDFLAGS) -o $@ - -clean: - rm -f $(TARGET) *.o diff --git a/recipes-bsp/esp32spid/src/msgq.c b/recipes-bsp/esp32spid/src/msgq.c deleted file mode 100644 index ff9f59e..0000000 --- a/recipes-bsp/esp32spid/src/msgq.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdlib.h> -#include <pthread.h> - -#include "msgq.h" - -#define IDX_MASK(IDX, SIZE) ((IDX) & ((SIZE) - 1)) - -int msgq_init(MSGQueue *msgq, unsigned char **array, uint16_t size) { - int rv; - - msgq->idx_r = 0; - msgq->idx_w = 0; - msgq->size = size; - msgq->array = array; - rv = pthread_mutex_init(&msgq->mutex, NULL); - if (rv) { - return MSGQ_ERR; - } - - rv = pthread_cond_init(&msgq->cond, NULL); - if (rv) { - pthread_mutex_destroy(&msgq->mutex); - return MSGQ_ERR; - } -} - -int msgq_push(MSGQueue *msgq, unsigned char *buffer) { - if ((uint16_t)(msgq->idx_w - msgq->idx_r) == msgq->size) return MSGQ_ERR_FULL; - - msgq->array[IDX_MASK(msgq->idx_w++, msgq->size)] = buffer; - return MSGQ_OK; -} - -unsigned char *msgq_pop(MSGQueue *msgq) { - if (msgq->idx_r == msgq->idx_w) return NULL; - - return msgq->array[IDX_MASK(msgq->idx_r++, msgq->size)]; -} - -uint16_t msgq_len(MSGQueue *msgq) { - return (uint16_t)(msgq->idx_w - msgq->idx_r); -} diff --git a/recipes-bsp/esp32spid/src/msgq.h b/recipes-bsp/esp32spid/src/msgq.h deleted file mode 100644 index 665be32..0000000 --- a/recipes-bsp/esp32spid/src/msgq.h +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdint.h> - -#define MSGQ_OK 0 -#define MSGQ_ERR -1 -#define MSGQ_ERR_FULL -10 - -typedef struct MSGQueue { - uint16_t idx_r; - uint16_t idx_w; - uint16_t size; - unsigned char **array; - pthread_mutex_t mutex; - pthread_cond_t cond; -} MSGQueue; - -int msgq_init(MSGQueue *msgq, unsigned char **array, uint16_t size); -int msgq_push(MSGQueue *msgq, unsigned char *buffer); -unsigned char *msgq_pop(MSGQueue *msgq); -uint16_t msgq_len(MSGQueue *msgq); diff --git a/recipes-bsp/esp32spid/src/spi.c b/recipes-bsp/esp32spid/src/spi.c deleted file mode 100644 index 5bd0718..0000000 --- a/recipes-bsp/esp32spid/src/spi.c +++ /dev/null @@ -1,284 +0,0 @@ -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <stdio.h> -#include <fcntl.h> -#include <sys/ioctl.h> - -#include <linux/spi/spidev.h> - -#include <gpiod.h> -#include <pthread.h> - -#include "msgq.h" -#include "tun.h" -#include "spi.h" - -static pthread_t rtscts_thd; -static pthread_t worker_thd; -static pthread_t handler_thd; -static pthread_mutex_t mutex; - -struct gpiod_line *gpio_rts, *gpio_cts; -static struct gpiod_line_bulk gpio_rtscts; - -static MSGQueue spi_bufq; -static unsigned char *spi_bufq_array[SPI_SIZE_BUFQ]; - -static MSGQueue spi_msgq_in; -static unsigned char *spi_msgq_in_array[SPI_SIZE_MSGQ]; - -static MSGQueue spi_msgq_out; -static unsigned char *spi_msgq_out_array[SPI_SIZE_MSGQ]; - -static uint32_t spi_speed = 5000000; -static int spi_fd; - -static int _spi_xchg(unsigned char *buffer) { - int rv; - uint16_t len_tx; - uint16_t len_rx; - struct spi_ioc_transfer tr; - - memset(&tr, 0, sizeof(tr)); - tr.tx_buf = (unsigned long)buffer; - tr.rx_buf = (unsigned long)buffer; - tr.speed_hz = spi_speed, - - len_tx = (uint16_t)buffer[1] << 8; - len_tx |= (uint16_t)buffer[2] & 0xFF; - if (len_tx > SPI_MTU) return SPI_ERR; - - len_tx += SPI_SIZE_HDR; - // esp32 dma workaraund - if (len_tx < 8) { - len_tx = 8; - } else if (len_tx % 4 != 0) { - len_tx = (len_tx / 4 + 1) * 4; - } - - tr.len = len_tx; - - pthread_mutex_lock(&mutex); - rv = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr); - if (rv < 0) return SPI_ERR_MSG; - - len_rx = (uint16_t)buffer[1] << 8; - len_rx |= (uint16_t)buffer[2] & 0xFF; - if (len_rx > SPI_MTU) return SPI_ERR; - - len_rx += SPI_SIZE_HDR; - if (len_rx > len_tx) { - tr.tx_buf = (unsigned long)NULL; - tr.rx_buf = (unsigned long)(buffer + len_tx); - - len_tx = len_rx - len_tx; - // esp32 dma workaraund - if (len_tx < 8) { - len_tx = 8; - } else if (len_tx % 4 != 0) { - len_tx = (len_tx / 4 + 1) * 4; - } - - tr.len = len_tx; - - pthread_mutex_lock(&mutex); - rv = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr); - if (rv < 0) return SPI_ERR_MSG; - } - - return SPI_OK; -} - -static void *spi_rtscts_handler(void *arg) { - MSGQueue *msgq_out = &spi_msgq_out; - int i, rv; - struct gpiod_line_bulk evt_lines; - struct gpiod_line_event event; - - while (1) { - rv = gpiod_line_event_wait_bulk(&gpio_rtscts, NULL, &evt_lines); - if (rv < 0) continue; - - for (i=0; i<gpiod_line_bulk_num_lines(&evt_lines); i++) { - struct gpiod_line *line; - - line = gpiod_line_bulk_get_line(&evt_lines, i); - rv = gpiod_line_event_read(line, &event); - if (rv || (event.event_type != GPIOD_LINE_EVENT_RISING_EDGE)) continue; - - switch (gpiod_line_offset(line)) { - case SPI_GPIO_RTS: - pthread_mutex_lock(&msgq_out->mutex); - pthread_cond_signal(&msgq_out->cond); - pthread_mutex_unlock(&msgq_out->mutex); - break; - case SPI_GPIO_CTS: - pthread_mutex_unlock(&mutex); - break; - } - } - } - return NULL; -} - -static void *spi_worker(void *arg) { - MSGQueue *bufq = &spi_bufq; - MSGQueue *msgq_in = &spi_msgq_in; - MSGQueue *msgq_out = &spi_msgq_out; - int rv; - unsigned char *buffer; - - while (1) { - pthread_mutex_lock(&msgq_out->mutex); - buffer = msgq_pop(msgq_out); - if ((buffer == NULL) && (gpiod_line_get_value(gpio_rts) == 1)) { - pthread_mutex_lock(&bufq->mutex); - buffer = msgq_pop(bufq); - pthread_mutex_unlock(&bufq->mutex); - } - if (buffer == NULL) { - pthread_cond_wait(&msgq_out->cond, &msgq_out->mutex); - buffer = msgq_pop(msgq_out); - } - pthread_mutex_unlock(&msgq_out->mutex); - if (buffer) { - rv = _spi_xchg(buffer); - if (rv || (buffer[0] == 0)) { - buffer[1] = 0; - buffer[2] = 0; - pthread_mutex_lock(&bufq->mutex); - rv = msgq_push(bufq, buffer); - pthread_mutex_unlock(&bufq->mutex); - } else { - pthread_mutex_lock(&msgq_in->mutex); - rv = msgq_push(msgq_in, buffer); - pthread_cond_signal(&msgq_in->cond); - pthread_mutex_unlock(&msgq_in->mutex); - } - } - } - return NULL; -} - -static void *spi_handler(void *arg) { - MSGQueue *bufq = &spi_bufq; - MSGQueue *msgq_in = &spi_msgq_in; - unsigned char *buffer; - unsigned char mtype; - uint16_t len; - int rv; - - while (1) { - pthread_mutex_lock(&msgq_in->mutex); - buffer = msgq_pop(msgq_in); - if (buffer == NULL) { - pthread_cond_wait(&msgq_in->cond, &msgq_in->mutex); - buffer = msgq_pop(msgq_in); - } - pthread_mutex_unlock(&msgq_in->mutex); - if (buffer) { - mtype = buffer[0]; - len = (uint16_t)buffer[1] << 8; - len |= (uint16_t)buffer[2] & 0xFF; - - switch (mtype) { - case SPI_MTYPE_TUN: - tun_write(buffer + SPI_SIZE_HDR, len); - break; - } - buffer[0] = 0; - buffer[1] = 0; - buffer[2] = 0; - pthread_mutex_lock(&bufq->mutex); - rv = msgq_push(bufq, buffer); - pthread_mutex_unlock(&bufq->mutex); - } - } -} - -unsigned char *spi_alloc(void) { - MSGQueue *bufq = &spi_bufq; - unsigned char *ret; - - pthread_mutex_lock(&bufq->mutex); - ret = msgq_pop(bufq); - pthread_mutex_unlock(&bufq->mutex); - - return ret; -} - -void spi_free(unsigned char *buffer) { - MSGQueue *bufq = &spi_bufq; - - buffer[0] = 0; - buffer[1] = 0; - buffer[2] = 0; - pthread_mutex_lock(&bufq->mutex); - msgq_push(bufq, buffer); - pthread_mutex_unlock(&bufq->mutex); -} - -int spi_xchg(unsigned char mtype, unsigned char *buffer, uint16_t len) { - int rv; - MSGQueue *msgq_out = &spi_msgq_out; - - buffer[0] = mtype; - buffer[1] = len >> 8; - buffer[2] = len & 0xFF; - - pthread_mutex_lock(&msgq_out->mutex); - rv = msgq_push(msgq_out, buffer); - pthread_cond_signal(&msgq_out->cond); - pthread_mutex_unlock(&msgq_out->mutex); - - return rv; -} - -int spi_init(char *fname) { - int rv, i; - struct gpiod_chip *gpio_chip; - - spi_fd = open(fname, O_RDWR); - if (spi_fd < 0) return SPI_ERR_OPEN; - - rv = ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed); - if (rv == -1) return SPI_ERR; - - gpio_chip = gpiod_chip_open_by_name(SPI_GPIO_BANK); - if (gpio_chip == NULL) return SPI_ERR; - - gpio_rts = gpiod_chip_get_line(gpio_chip, SPI_GPIO_RTS); - gpio_cts = gpiod_chip_get_line(gpio_chip, SPI_GPIO_CTS); - if ((gpio_rts == NULL) || (gpio_cts == NULL)) return SPI_ERR; - - gpiod_line_bulk_init(&gpio_rtscts); - gpiod_line_bulk_add(&gpio_rtscts, gpio_rts); - gpiod_line_bulk_add(&gpio_rtscts, gpio_cts); - rv = gpiod_line_request_bulk_rising_edge_events(&gpio_rtscts, "rtscts"); - if (rv) return SPI_ERR; - - msgq_init(&spi_bufq, spi_bufq_array, SPI_SIZE_BUFQ); - msgq_init(&spi_msgq_in, spi_msgq_in_array, SPI_SIZE_MSGQ); - msgq_init(&spi_msgq_out, spi_msgq_out_array, SPI_SIZE_MSGQ); - for (i=0; i<SPI_SIZE_BUFQ; i++) { - msgq_push(&spi_bufq, malloc(SPI_SIZE_BUF)); - } - - rv = pthread_mutex_init(&mutex, NULL); - rv = pthread_create(&rtscts_thd, NULL, spi_rtscts_handler, NULL); - rv = pthread_create(&worker_thd, NULL, spi_worker, NULL); - rv = pthread_create(&handler_thd, NULL, spi_handler, NULL); - - return SPI_OK; -} - -int main(int argc, char *argv[]) { - int rv; - - rv = spi_init("/dev/spidev0.0"); - if (rv) printf("SPI INIT ERR\n"); - rv = tun_init(); - if (rv) printf("TUN INIT ERR\n"); - tun_read(NULL); -} diff --git a/recipes-bsp/esp32spid/src/spi.h b/recipes-bsp/esp32spid/src/spi.h deleted file mode 100644 index c1a4d94..0000000 --- a/recipes-bsp/esp32spid/src/spi.h +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdint.h> - -#define SPI_GPIO_BANK "gpiochip2" -#define SPI_GPIO_CTS 3 -#define SPI_GPIO_RTS 4 - -#define SPI_MTU 1500 -#define SPI_SIZE_BUF (SPI_MTU + 8) -#define SPI_SIZE_HDR 3 - -#define SPI_SIZE_BUFQ 64 -#define SPI_SIZE_MSGQ 256 - -#define SPI_MTYPE_TUN 1 - -#define SPI_OK 0 -#define SPI_ERR -1 -#define SPI_ERR_OPEN -10 -#define SPI_ERR_MSG -11 - -unsigned char *spi_alloc(void); -void spi_free(unsigned char *buffer); -int spi_xchg(unsigned char mtype, unsigned char *buffer, uint16_t len); -int spi_init(char *fname);
\ No newline at end of file diff --git a/recipes-bsp/esp32spid/src/tun.c b/recipes-bsp/esp32spid/src/tun.c deleted file mode 100644 index d75edc4..0000000 --- a/recipes-bsp/esp32spid/src/tun.c +++ /dev/null @@ -1,94 +0,0 @@ -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <stdio.h> -#include <fcntl.h> -#include <sys/ioctl.h> - -#include <linux/if.h> -#include <linux/if_tun.h> - -#include <pthread.h> - -#include "spi.h" -#include "tun.h" - -static pthread_t read_thd; - -static int tun_fd; -static char tun_name[IFNAMSIZ]; - -static int tun_alloc(char *dev, int flags) { - struct ifreq ifr; - int fd, err; - char *clonedev = "/dev/net/tun"; - - /* Arguments taken by the function: - * - * char *dev: the name of an interface (or '\0'). MUST have enough - * space to hold the interface name if '\0' is passed - * int flags: interface flags (eg, IFF_TUN etc.) - */ - - fd = open(clonedev, O_RDWR); - if (fd < 0) { - return fd; - } - - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_flags = flags; /* IFF_TUN or IFF_TAP, plus maybe IFF_NO_PI */ - - if (*dev) { - /* if a device name was specified, put it in the structure; otherwise, - * the kernel will try to allocate the "next" device of the - * specified type */ - strncpy(ifr.ifr_name, dev, IFNAMSIZ); - } - - /* try to create the device */ - err = ioctl(fd, TUNSETIFF, (void *) &ifr); - if (err < 0) { - close(fd); - return err; - } - - /* if the operation was successful, write back the name of the - * interface to the variable "dev", so the caller can know - * it. Note that the caller MUST reserve space in *dev (see calling - * code below) */ - strcpy(dev, ifr.ifr_name); - - /* this is the special file descriptor that the caller will use to talk - * with the virtual interface */ - return fd; -} - -void *tun_read(void *arg) { - unsigned char *buffer; - int len; - - while (1) { - buffer = spi_alloc(); - if (buffer == NULL) continue; - len = read(tun_fd, buffer + SPI_SIZE_HDR, SPI_SIZE_BUF - SPI_SIZE_HDR); - if (len < 0) { - perror("tun read"); - continue; - } - spi_xchg(SPI_MTYPE_TUN, buffer, len); - } -} - -int tun_write(unsigned char *buffer, uint16_t len) { - return write(tun_fd, buffer, len); -} - -int tun_init(void) { - int rv; - - strcpy(tun_name, "tun0"); - tun_fd = tun_alloc(tun_name, IFF_TUN | IFF_NO_PI); - if (tun_fd < 0) return TUN_ERR; - - return TUN_OK; -} diff --git a/recipes-bsp/esp32spid/src/tun.h b/recipes-bsp/esp32spid/src/tun.h deleted file mode 100644 index bcfdac5..0000000 --- a/recipes-bsp/esp32spid/src/tun.h +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdint.h> - -#define TUN_OK 0 -#define TUN_ERR -1 - -void *tun_read(void *arg); -int tun_write(unsigned char *buffer, uint16_t len); -int tun_init(void);
\ No newline at end of file |