Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Mbed Application program for TYBLE-16
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * Copyright (c) 2018,'19 Kenji Arai / JH1PJL
kenjiArai 0:5b88d5760320 5 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:5b88d5760320 6 * https://os.mbed.com/users/kenjiArai/
kenjiArai 0:5b88d5760320 7 * Created: Feburary 16th, 2018
kenjiArai 0:5b88d5760320 8 * Revised: December 15th, 2019
kenjiArai 0:5b88d5760320 9 */
kenjiArai 0:5b88d5760320 10
kenjiArai 0:5b88d5760320 11 #include "mbed.h"
kenjiArai 0:5b88d5760320 12
kenjiArai 0:5b88d5760320 13 static uint32_t mem_range[][2] = { // Memory access range
kenjiArai 0:5b88d5760320 14 { 0x00000000, 0x0003ffff }, // On-chip non-volatile memory //128 or 256KB
kenjiArai 0:5b88d5760320 15 { 0x20000000, 0x20007fff }, // On-chip SRAM //16 or 32KB
kenjiArai 0:5b88d5760320 16 { 0x10000000, 0x1000007f }, // FICR
kenjiArai 0:5b88d5760320 17 { 0x10001000, 0x100010ff }, // UICR
kenjiArai 0:5b88d5760320 18 { 0x40000000, 0x400245ff }, // Peripheral
kenjiArai 0:5b88d5760320 19 { 0x50000500, 0x500007ff } // GPIO
kenjiArai 0:5b88d5760320 20 };
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 static void mem_cnfg_init( uint8_t print )
kenjiArai 0:5b88d5760320 23 {
kenjiArai 0:5b88d5760320 24 uint32_t a, b, c;
kenjiArai 0:5b88d5760320 25
kenjiArai 0:5b88d5760320 26 a = NRF_FICR->CODEPAGESIZE;
kenjiArai 0:5b88d5760320 27 b = NRF_FICR->CODESIZE;
kenjiArai 0:5b88d5760320 28 c = a * b;
kenjiArai 0:5b88d5760320 29 mem_range[0][1] = mem_range[0][0] + c -1;
kenjiArai 0:5b88d5760320 30 if (print) {
kenjiArai 0:5b88d5760320 31 printf("CODEPAGESIZE:%d, CODESIZE:%d\r\nFLASH:0x%08x-0x%08x\r\n",
kenjiArai 0:5b88d5760320 32 a, b, mem_range[0][0], mem_range[0][1]);
kenjiArai 0:5b88d5760320 33 }
kenjiArai 0:5b88d5760320 34 a = NRF_FICR->NUMRAMBLOCK;
kenjiArai 0:5b88d5760320 35 b = NRF_FICR->SIZERAMBLOCKS;
kenjiArai 0:5b88d5760320 36 c = a * b;
kenjiArai 0:5b88d5760320 37 mem_range[1][1] = mem_range[1][0] + c -1;
kenjiArai 0:5b88d5760320 38 if (print) {
kenjiArai 0:5b88d5760320 39 printf("NUMRAMBLOCK:%d, SIZERAMBLOCKS:%d\r\nRAM: 0x%08x-0x%08x\r\n",
kenjiArai 0:5b88d5760320 40 a, b, mem_range[1][0], mem_range[1][1]);
kenjiArai 0:5b88d5760320 41 }
kenjiArai 0:5b88d5760320 42 }
kenjiArai 0:5b88d5760320 43
kenjiArai 0:5b88d5760320 44 void cpu_sys(void)
kenjiArai 0:5b88d5760320 45 {
kenjiArai 0:5b88d5760320 46 uint32_t m1 = 0, m2 = 0;
kenjiArai 0:5b88d5760320 47
kenjiArai 0:5b88d5760320 48 //printf("line:%d\r\n", __LINE__);
kenjiArai 0:5b88d5760320 49 wait(0.1f);
kenjiArai 0:5b88d5760320 50 m1 = SCB->CPUID;
kenjiArai 0:5b88d5760320 51 m2 = ( m1 >> 24 );
kenjiArai 0:5b88d5760320 52 if ( m2 == 0x41 ) {
kenjiArai 0:5b88d5760320 53 printf( "CPU = ARM " );
kenjiArai 0:5b88d5760320 54 wait(0.1f);
kenjiArai 0:5b88d5760320 55 } else {
kenjiArai 0:5b88d5760320 56 printf( "CPU = NOT ARM " );
kenjiArai 0:5b88d5760320 57 }
kenjiArai 0:5b88d5760320 58 m2 = ( m1 >> 4 ) & 0xfff;
kenjiArai 0:5b88d5760320 59 if ( m2 == 0xc20 ) {
kenjiArai 0:5b88d5760320 60 printf( "Cortex-M0" );
kenjiArai 0:5b88d5760320 61 wait(0.1f);
kenjiArai 0:5b88d5760320 62 } else {
kenjiArai 0:5b88d5760320 63 printf( "NOT Cortex-M0" );
kenjiArai 0:5b88d5760320 64 }
kenjiArai 0:5b88d5760320 65 m2 = ( m1 >> 20 ) & 0x0f;
kenjiArai 0:5b88d5760320 66 printf( " Variant:%x ", m2 );
kenjiArai 0:5b88d5760320 67 m2 = m1 & 0x7;
kenjiArai 0:5b88d5760320 68 printf( "Revision:%x\r\n", m2 );
kenjiArai 0:5b88d5760320 69 printf( "CPU ID: 0x%08x\r\n", m1 );
kenjiArai 0:5b88d5760320 70 // nRF Chip revision
kenjiArai 0:5b88d5760320 71 m1 = (((*((uint32_t volatile *)0xF0000FE8)) & 0x000000F0) >> 4);
kenjiArai 0:5b88d5760320 72 switch (m1) {
kenjiArai 0:5b88d5760320 73 case 1: // revision 1
kenjiArai 0:5b88d5760320 74 m2 = 1;
kenjiArai 0:5b88d5760320 75 break;
kenjiArai 0:5b88d5760320 76 case 4: // revision 2
kenjiArai 0:5b88d5760320 77 m2 = 2;
kenjiArai 0:5b88d5760320 78 break;
kenjiArai 0:5b88d5760320 79 case 7:
kenjiArai 0:5b88d5760320 80 case 8:
kenjiArai 0:5b88d5760320 81 case 9: // revision 3
kenjiArai 0:5b88d5760320 82 m2 = 3;
kenjiArai 0:5b88d5760320 83 break;
kenjiArai 0:5b88d5760320 84 default:
kenjiArai 0:5b88d5760320 85 m2 = 0;
kenjiArai 0:5b88d5760320 86 break;
kenjiArai 0:5b88d5760320 87 }
kenjiArai 0:5b88d5760320 88 if (m2) {
kenjiArai 0:5b88d5760320 89 printf( "nRF Revision: %d\r\n", m2 );
kenjiArai 0:5b88d5760320 90 } else {
kenjiArai 0:5b88d5760320 91 printf( "nRF Revision: Unknown\r\n" );
kenjiArai 0:5b88d5760320 92 }
kenjiArai 0:5b88d5760320 93 // Firmware
kenjiArai 0:5b88d5760320 94 m1 = NRF_UICR->FWID & 0xffff;
kenjiArai 0:5b88d5760320 95 printf( "Firmware ID: 0x%04x\r\n", m1 );
kenjiArai 0:5b88d5760320 96 // System Clock
kenjiArai 0:5b88d5760320 97 m1 = NRF_UICR->XTALFREQ & 0xff;
kenjiArai 0:5b88d5760320 98 printf( "System clock by " );
kenjiArai 0:5b88d5760320 99 if (m1) {
kenjiArai 0:5b88d5760320 100 printf( "XTAL:16MHz\r\n" );
kenjiArai 0:5b88d5760320 101 } else {
kenjiArai 0:5b88d5760320 102 printf( "XTAL:32MHz\r\n" );
kenjiArai 0:5b88d5760320 103 }
kenjiArai 0:5b88d5760320 104 m1 = NRF_CLOCK->LFCLKSRCCOPY & 0x3;
kenjiArai 0:5b88d5760320 105 printf( "LFCLK Source=32.768 kHz " );
kenjiArai 0:5b88d5760320 106 switch (m1) {
kenjiArai 0:5b88d5760320 107 case 0: // revision 1
kenjiArai 0:5b88d5760320 108 printf( "RC oscillator" );
kenjiArai 0:5b88d5760320 109 break;
kenjiArai 0:5b88d5760320 110 case 1: // revision 1
kenjiArai 0:5b88d5760320 111 printf( "crystal oscillator" );
kenjiArai 0:5b88d5760320 112 break;
kenjiArai 0:5b88d5760320 113 case 2: // revision 1
kenjiArai 0:5b88d5760320 114 printf( "synthesized from HFCLK" );
kenjiArai 0:5b88d5760320 115 break;
kenjiArai 0:5b88d5760320 116 default:
kenjiArai 0:5b88d5760320 117 printf( "unknown" );
kenjiArai 0:5b88d5760320 118 break;
kenjiArai 0:5b88d5760320 119 }
kenjiArai 0:5b88d5760320 120 printf("\r\n");
kenjiArai 0:5b88d5760320 121 // FLASH & RAM
kenjiArai 0:5b88d5760320 122 mem_cnfg_init(1);
kenjiArai 0:5b88d5760320 123 }
kenjiArai 0:5b88d5760320 124
kenjiArai 0:5b88d5760320 125 bool compile_condition(void)
kenjiArai 0:5b88d5760320 126 {
kenjiArai 0:5b88d5760320 127 uint32_t m1 = 0, m2 = 0;
kenjiArai 0:5b88d5760320 128
kenjiArai 0:5b88d5760320 129 // ARM
kenjiArai 0:5b88d5760320 130 m1 = SCB->CPUID;
kenjiArai 0:5b88d5760320 131 m2 = ( m1 >> 24 );
kenjiArai 0:5b88d5760320 132 if ( m2 != 0x41 ) {
kenjiArai 0:5b88d5760320 133 return false;
kenjiArai 0:5b88d5760320 134 }
kenjiArai 0:5b88d5760320 135 // M0
kenjiArai 0:5b88d5760320 136 m2 = ( m1 >> 4 ) & 0xfff;
kenjiArai 0:5b88d5760320 137 if ( m2 != 0xc20 ) {
kenjiArai 0:5b88d5760320 138 return false;
kenjiArai 0:5b88d5760320 139 }
kenjiArai 0:5b88d5760320 140 // FLASH
kenjiArai 0:5b88d5760320 141 m1 = NRF_FICR->CODEPAGESIZE;
kenjiArai 0:5b88d5760320 142 if (m1 != 1024) {
kenjiArai 0:5b88d5760320 143 return false;
kenjiArai 0:5b88d5760320 144 }
kenjiArai 0:5b88d5760320 145 m1 = NRF_FICR->CODESIZE;
kenjiArai 0:5b88d5760320 146 if (m1 != 256) {
kenjiArai 0:5b88d5760320 147 return false;
kenjiArai 0:5b88d5760320 148 }
kenjiArai 0:5b88d5760320 149 // RAM
kenjiArai 0:5b88d5760320 150 m1 = NRF_FICR->NUMRAMBLOCK;
kenjiArai 0:5b88d5760320 151 if (m1 != 4) {
kenjiArai 0:5b88d5760320 152 return false;
kenjiArai 0:5b88d5760320 153 }
kenjiArai 0:5b88d5760320 154 m1 = NRF_FICR->SIZERAMBLOCKS;
kenjiArai 0:5b88d5760320 155 if (m1 != 8192) {
kenjiArai 0:5b88d5760320 156 return false;
kenjiArai 0:5b88d5760320 157 }
kenjiArai 0:5b88d5760320 158 // 32MHz Xtal
kenjiArai 0:5b88d5760320 159 m1 = NRF_UICR->XTALFREQ & 0xff;
kenjiArai 0:5b88d5760320 160 if (m1) {
kenjiArai 0:5b88d5760320 161 return false; // Not 32MHz XTAL
kenjiArai 0:5b88d5760320 162 }
kenjiArai 0:5b88d5760320 163 // LF = internal RC
kenjiArai 0:5b88d5760320 164 m1 = NRF_CLOCK->LFCLKSRCCOPY & 0x3;
kenjiArai 0:5b88d5760320 165 if (m1 != 0) {
kenjiArai 0:5b88d5760320 166 printf("Looks TY51822r3 board\r\n");
kenjiArai 0:5b88d5760320 167 return false; // Not RC
kenjiArai 0:5b88d5760320 168 }
kenjiArai 0:5b88d5760320 169 printf("Looks TYBLE16 board\r\n");
kenjiArai 0:5b88d5760320 170 return true;
kenjiArai 0:5b88d5760320 171 }