1 /* 2 * Copyright 2023, Cypress Semiconductor Corporation (an Infineon company) 3 * SPDX-License-Identifier: Apache-2.0 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /** @file 19 * The whd Thread allows thread safe access to the whd hardware bus 20 * This is an whd internal file and should not be used by functions outside whd. 21 * 22 * This file provides prototypes for functions which allow multiple threads to use the whd hardware bus (SDIO or SPI) 23 * This is achieved by having a single thread (the "whd Thread") which queues messages to be sent, sending 24 * them sequentially, as well as receiving messages as they arrive. 25 * 26 * Messages to be sent come from the @ref whd_sdpcm_send_common function in whd_sdpcm.c . The messages already 27 * contain SDPCM headers, but not any bus headers (GSPI), and are passed via a queue 28 * This function can be called from any thread. 29 * 30 * Messages are received by way of a callback supplied by in whd_sdpcm.c - whd_sdpcm_process_rx_packet 31 * Received messages are delivered in the context of the whd Thread, so the callback function needs to avoid blocking. 32 * 33 */ 34 #include "cyabs_rtos.h" 35 #include "whd.h" 36 37 #ifndef INCLUDED_WHD_THREAD_H_ 38 #define INCLUDED_WHD_THREAD_H_ 39 40 #ifdef __cplusplus 41 extern "C" 42 { 43 #endif 44 45 /****************************************************** 46 * Constants 47 ******************************************************/ 48 #define WHD_THREAD_RX_BOUND (20) 49 #define WHD_MAX_BUS_FAIL (10) 50 51 typedef struct whd_thread_info 52 { 53 54 volatile whd_bool_t thread_quit_flag; 55 volatile whd_bool_t whd_inited; 56 cy_thread_t whd_thread; 57 cy_semaphore_t transceive_semaphore; 58 volatile whd_bool_t bus_interrupt; 59 void *thread_stack_start; 60 uint32_t thread_stack_size; 61 cy_thread_priority_t thread_priority; 62 63 } whd_thread_info_t; 64 65 void whd_thread_info_init(whd_driver_t whd_driver, whd_init_config_t *whd_init_config); 66 67 /** Initialises the whd Thread 68 * 69 * Initialises the whd thread, and its flags/semaphores, 70 * then starts it running 71 * 72 * @return whd result code 73 */ 74 extern whd_result_t whd_thread_init(whd_driver_t whd_driver); 75 76 77 /** Terminates the whd Thread 78 * 79 * Sets a flag then wakes the whd Thread to force it to terminate. 80 * 81 */ 82 extern void whd_thread_quit(whd_driver_t whd_driver); 83 84 85 extern void whd_thread_notify(whd_driver_t whd_driver); 86 extern void whd_thread_notify_irq(whd_driver_t whd_driver); 87 88 #ifdef __cplusplus 89 } /* extern "C" */ 90 #endif 91 92 #endif /* ifndef INCLUDED_WHD_THREAD_H_ */ 93 94