nkjnm

Dependencies:   MAX44000 nexpaq_mdk

Fork of LED_Demo by Maxim nexpaq

Revision:
0:b86eda0e990d
Child:
2:3842948024ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nexpaq_mdk_src/source/np_system.c	Sat Sep 17 16:21:40 2016 +0000
@@ -0,0 +1,200 @@
+/*
+ * np_system.c
+ *
+ *  Created on: July 14, 2016
+ *      Author: Alan.Lin
+ *
+ *  Copyright: NexPack Ltd.
+ */
+
+#include "np_config.h"
+#include "np_driver_timer.h"
+#include "np_driver_spi.h"
+#include "np_app_spi.h"
+#include "np_app_ncn_interface.h"
+#include "spis.h"
+#include "np_system.h"
+#include "np_command.h"
+
+extern const gpio_cfg_t gpio_req_spi[];
+
+/* Description: delay function
+ * t_ms: the time for delay.MS as the unit
+ *
+ */
+void delay_ms(uint32_t t_ms)
+{
+    while(t_ms) {
+        SYS_SysTick_Delay(96000);
+        t_ms--;
+    }
+}
+
+/*
+ * Description: disable all interrupt used on MDK
+ * Parameter  : null
+ * Return     : null
+ */
+void np_system_disable_interrupt(void)
+{
+    NVIC_DisableIRQ(TMR0_0_IRQn);
+    NVIC_DisableIRQ(SPIS_IRQn);
+}
+
+/*
+ * Description: Setting the version of MDK
+ * Parameter: mdk version
+ * Return: null
+ */
+void np_function_set_mdk_version(uint8_t HV, uint8_t MV, uint8_t LV)
+{
+    mdk_mdk_version[0] = HV;
+    mdk_mdk_version[1] = MV;
+    mdk_mdk_version[2] = LV;
+}
+
+/*
+ * Description: MDK initial
+ * Parameter  : null
+ * Return     : null
+ */
+void np_mdk_setup(void)
+{
+    int t_reback = E_BUSY;
+
+    GPIO_Config(&gpio_req_spi[0]);	//Input
+    //ignore clock initial
+    while(t_reback != E_NO_ERROR) {
+        t_reback = driver_spi_slave_initial();
+        delay_ms(10);
+    }
+
+    Timer0_initial();
+    np_function_set_post_address(RAM_SOURCE_ADDR);
+
+    spi_status = SPI_FREE;
+    my_node = RAM_MY_NODE;
+}
+
+/*
+ * Description: system initial,include app initial and mdk initial
+ * Parameter  : null
+ * Return     : null
+ */
+void np_system_initial(app_function np_app_setup)
+{
+    uint8_t answer = 0;
+
+    np_function_set_mdk_version(1,0,7);
+    np_mdk_setup();
+    np_app_setup();
+    np_function_ncn_interface_post_message(RSP_INTO_APP, &answer, 1);
+    flag_jump_bsl = 0;
+}
+
+/*
+ * Description: mdk initialization
+ * Parameter  : null
+ * Return     : null
+ */
+void np_sys_init()
+{
+    np_function_set_mdk_version(1,0,7);
+    np_mdk_setup();
+#ifdef DBG_MSG            
+      		printf("NP System Initialized\n\r");  
+#endif            
+}
+
+/*
+ * Description: signal when system is ready
+ * Parameter  : null
+ * Return     : null
+ */
+void np_sys_start()
+{
+    uint8_t answer = 0;
+    np_function_ncn_interface_post_message(RSP_INTO_APP, &answer, 1);
+    flag_jump_bsl = 0;
+#ifdef DBG_MSG            
+      		printf("NP System Started\n\r");  
+#endif            
+}
+
+/*
+ * Description: function to check and jump to boot loader
+ * Parameter  : null
+ * Return     : null
+ */
+#ifdef TOOLCHAIN_ARM_STD
+register int _r0 __asm("r0");
+register int _pc __asm("pc");
+#endif
+
+void np_sys_bsl_chk()
+{
+    if( flag_jump_bsl > 0x00 ) {
+        flag_jump_bsl = 0x00;
+        np_system_disable_interrupt();
+#ifdef DBG_MSG            
+      		printf("Entering Bootloader\n\r");  
+#endif            
+#ifdef TOOLCHAIN_ARM_STD
+        __asm {
+            mov _r0, #0x20000008
+            ldr _pc, [_r0]
+        }
+    }
+    __asm {
+        mov _r0, _r0
+        mov _r0, _r0
+    }
+#else
+        __asm volatile(
+            " LDR R0, =0x20000008	\n"
+            " LDR PC, [R0]			\n"
+        );
+    }
+    __asm volatile("nop \n");
+    __asm volatile("nop \n");
+#endif
+}
+
+/*
+ * Description: system loop,software will run the function forever when software is on app mode.
+ * Parameter  : null
+ * Return     : null
+ */
+void np_system_loop(app_function np_api_loop)
+{
+    while(1) {
+        np_api_loop();
+        //jumping to the bootloader
+        if( flag_jump_bsl > 0x00 ) {
+            flag_jump_bsl = 0x00;
+            np_system_disable_interrupt();
+#ifdef DBG_MSG            
+      		printf("Entering NP Bootloader\n\r");  
+#endif            
+#ifdef TOOLCHAIN_ARM_STD
+            __asm {
+                mov _r0, #0x20000008
+                ldr _pc, [_r0]
+            }
+        }
+        __asm {
+            mov _r0, _r0
+            mov _r0, _r0
+        }
+#else
+            __asm volatile(
+                " LDR R0, =0x20000008	\n"
+                " LDR PC, [R0]			\n"
+            );
+        }
+        __asm volatile("nop \n");
+        __asm volatile("nop \n");
+#endif
+    }
+}
+