| 
									
										
										
										
											2015-07-17 10:55:54 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is part of PortaPack. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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, 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; see the file COPYING.  If not, write to | 
					
						
							|  |  |  |  * the Free Software Foundation, Inc., 51 Franklin Street, | 
					
						
							|  |  |  |  * Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "ch.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "lpc43xx_cpp.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "portapack_shared_memory.hpp"
 | 
					
						
							|  |  |  | #include "portapack_dma.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "gpdma.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "touch_dma.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "message_queue.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "utility.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "debug.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "audio_dma.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "gcc.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <cstdint>
 | 
					
						
							|  |  |  | #include <cstddef>
 | 
					
						
							|  |  |  | #include <array>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void __late_init(void) { | 
					
						
							| 
									
										
										
										
											2015-08-14 12:20:45 -07:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * System initializations. | 
					
						
							|  |  |  | 	 * - HAL initialization, this also initializes the configured device drivers | 
					
						
							|  |  |  | 	 *   and performs the board-specific initializations. | 
					
						
							|  |  |  | 	 * - Kernel initialization, the main() function becomes a thread and the | 
					
						
							|  |  |  | 	 *   RTOS is active. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	halInit(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-17 10:55:54 -07:00
										 |  |  | 	/* After this call, scheduler, systick, heap, etc. are available. */ | 
					
						
							|  |  |  | 	/* By doing chSysInit() here, it runs before C++ constructors, which may
 | 
					
						
							|  |  |  | 	 * require the heap. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	chSysInit(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void init() { | 
					
						
							|  |  |  | 	audio::dma::init(); | 
					
						
							|  |  |  | 	audio::dma::configure(); | 
					
						
							|  |  |  | 	audio::dma::enable(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	LPC_CREG->DMAMUX = portapack::gpdma_mux; | 
					
						
							|  |  |  | 	gpdma::controller.enable(); | 
					
						
							|  |  |  | 	nvicEnableVector(DMA_IRQn, CORTEX_PRIORITY_MASK(LPC_DMA_IRQ_PRIORITY)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	touch::dma::init(); | 
					
						
							| 
									
										
										
										
											2015-12-10 17:29:16 -08:00
										 |  |  | 	touch::dma::allocate(); | 
					
						
							|  |  |  | 	touch::dma::enable(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-30 11:53:58 -07:00
										 |  |  | extern void run(); | 
					
						
							| 
									
										
										
										
											2016-06-25 11:14:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 17:29:16 -08:00
										 |  |  | static void halt() { | 
					
						
							|  |  |  | 	port_disable(); | 
					
						
							|  |  |  | 	while(true) { | 
					
						
							|  |  |  | 		port_wait_for_interrupt(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-17 10:55:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-20 20:40:46 -07:00
										 |  |  | static void shutdown() { | 
					
						
							|  |  |  | 	// TODO: Is this complete?
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	nvicDisableVector(DMA_IRQn); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	chSysDisable(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	systick_stop(); | 
					
						
							| 
									
										
										
										
											2015-12-10 17:19:18 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ShutdownMessage shutdown_message; | 
					
						
							|  |  |  | 	shared_memory.application_queue.push(shutdown_message); | 
					
						
							| 
									
										
										
										
											2015-08-20 20:40:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-02 16:02:50 -07:00
										 |  |  | 	shared_memory.baseband_message = nullptr; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-10 17:29:16 -08:00
										 |  |  | 	halt(); | 
					
						
							| 
									
										
										
										
											2015-09-01 13:49:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-17 10:55:54 -07:00
										 |  |  | int main(void) { | 
					
						
							|  |  |  | 	init(); | 
					
						
							| 
									
										
										
										
											2016-06-25 11:14:28 -07:00
										 |  |  | 	run(); | 
					
						
							| 
									
										
										
										
											2015-12-10 17:33:44 -08:00
										 |  |  | 	shutdown(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-17 10:55:54 -07:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  | } |