Multicore Test App ################## These applications aim to provide an easy way to test the PM multicore support from Quark SE. It implements two common flows: 1) LMT core is idle while ARC core is busy so the system is not put on DEEP SLEEP mode, and 2) LMT core is idle when ARC core is also idle so the system enters in DEEP SLEEP mode. These applications implement a master/slave approach where LMT application plays the master role while ARC application plays the slave. The master is the one which controls the wakeup device (in this example it is the RTC) and actually puts the system in deep sleep mode. To keep the synchronization logic simple and demonstrate the multi-core coordination, we do not handle any events in ARC other than the notification IPM from LMT. Handling events in ARC itself may need more complex communication and synchronization logic between the applications of the the 2 cores. For example, such an implementation should be able to handle the corner case of ARC getting woken up by some event when LMT is in the process of putting the SOC in deep sleep. In the following section the working mechanism from both ARC and LMT applications are described, and building and wiring instructions are provided. test/power/multicore/arc ************************ The ARC application is very simple, it keeps the system bouncing between 'busy' and 'idle' states. The application keeps the system busy for 10 seconds and then idle until woken up by IPM event from LMT. When system goes into idle, the application puts the system in SYS_POWER_STATE_DEEP_SLEEP_2 state which allows LMT core to put the system in sleep mode. The application uses UART_0 as console output device so, in order to be able to see ARC output messages, make sure you have attached a serial cable to UART_0. In 'quark_se_c1000_ss_devboard', UART_0 pins are in J14 header. The table below shows the wiring instructions. +---------+------------------+ | J14 PIN | SERIAL CABLE PIN | +=========+==================+ | 3 | RXD | +---------+------------------+ | 5 | TXD | +---------+------------------+ | 11 | GND | +---------+------------------+ If your wiring is correct, you should see the following output on console: :: ARC: Quark SE PM Multicore Demo ARC: busy ARC: idle ARC: busy ARC: idle ARC: busy ARC: idle ARC: busy ... To build the ARC application, run the following commands: :: $ cd tests/power/multicore/arc/ $ make test/power/multicore/lmt ************************ The LMT application is very simple and also keeps the system bouncing between 'busy' and 'idle'. When the system goes into idle, the application tries to put the system in DEEP_SLEEP state. If ARC core is busy, it fails. If ARC core is idle, it succeeds. When 'TEST_CASE=sleep-success', the application will be busy for 15 seconds and idle for 5. This means that ARC core will be idle when LMT core tries to enter in DEEP_SLEEP, and it will succeed. In this case, the output on your console should look like this: :: LMT: Quark SE PM Multicore Demo LMT: busy LMT: idle LMT: Try to put the system in SYS_POWER_STATE_DEEP_SLEEP_2 state LMT: Succeed. LMT: busy LMT: idle LMT: Try to put the system in SYS_POWER_STATE_DEEP_SLEEP_2 state LMT: Succeed. LMT: busy LMT: idle LMT: Try to put the system in SYS_POWER_STATE_DEEP_SLEEP_2 state LMT: Succeed. ... To build the LMT application which tests the "success" path, run the following commands: :: $ cd tests/power/multicore/lmt TEST_CASE=sleep-success $ make When 'TEST_CASE=sleep-fail', application is busy for 5 seconds and idle for 15 seconds. This means that ARC core will be busy when LMT core tries to enter in DEEP_SLEEP, and it will fail. In this case the output on your console should look like this: :: LMT: Quark SE PM Multicore Demo LMT: busy LMT: idle LMT: Try to put the system in SYS_POWER_STATE_DEEP_SLEEP_2 state LMT: Failed. ARC is busy. LMT: busy LMT: idle LMT: Try to put the system in SYS_POWER_STATE_DEEP_SLEEP_2 state LMT: Failed. ARC is busy. LMT: busy LMT: idle LMT: Try to put the system in SYS_POWER_STATE_DEEP_SLEEP_2 state LMT: Failed. ARC is busy. ... To build the LMT application which tests the "failure" path, run the following commands: :: $ cd tests/power/multicore/lmt $ make TEST_CASE=sleep-fail The application uses UART_1 device as console output device, which is the default console device.