Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sun May 14 23:18:57 2017 +0000
Revision:
18:6a4db94011d3
Publishing again

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /* mbed Microcontroller Library
sahilmgandhi 18:6a4db94011d3 2 * Copyright (c) 2017 ARM Limited
sahilmgandhi 18:6a4db94011d3 3 *
sahilmgandhi 18:6a4db94011d3 4 * Licensed under the Apache License, Version 2.0 (the "License");
sahilmgandhi 18:6a4db94011d3 5 * you may not use this file except in compliance with the License.
sahilmgandhi 18:6a4db94011d3 6 * You may obtain a copy of the License at
sahilmgandhi 18:6a4db94011d3 7 *
sahilmgandhi 18:6a4db94011d3 8 * http://www.apache.org/licenses/LICENSE-2.0
sahilmgandhi 18:6a4db94011d3 9 *
sahilmgandhi 18:6a4db94011d3 10 * Unless required by applicable law or agreed to in writing, software
sahilmgandhi 18:6a4db94011d3 11 * distributed under the License is distributed on an "AS IS" BASIS,
sahilmgandhi 18:6a4db94011d3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sahilmgandhi 18:6a4db94011d3 13 * See the License for the specific language governing permissions and
sahilmgandhi 18:6a4db94011d3 14 * limitations under the License.
sahilmgandhi 18:6a4db94011d3 15 */
sahilmgandhi 18:6a4db94011d3 16
sahilmgandhi 18:6a4db94011d3 17 #include "flash_api.h"
sahilmgandhi 18:6a4db94011d3 18 #include "flash_data.h"
sahilmgandhi 18:6a4db94011d3 19 #include "mbed_critical.h"
sahilmgandhi 18:6a4db94011d3 20
sahilmgandhi 18:6a4db94011d3 21 #define MBED_FLASH_ALGO_ERASE 1UL
sahilmgandhi 18:6a4db94011d3 22 #define MBED_FLASH_ALGO_PROGRAM 2UL
sahilmgandhi 18:6a4db94011d3 23
sahilmgandhi 18:6a4db94011d3 24 extern uint32_t SystemCoreClock;
sahilmgandhi 18:6a4db94011d3 25
sahilmgandhi 18:6a4db94011d3 26 /*
sahilmgandhi 18:6a4db94011d3 27 This binary blob (thumb code) sets r9 (static base) as the code we are jumping to
sahilmgandhi 18:6a4db94011d3 28 is PIC (position independent code).
sahilmgandhi 18:6a4db94011d3 29
sahilmgandhi 18:6a4db94011d3 30 These are the instructions (r0 is a pointer to arg_t):
sahilmgandhi 18:6a4db94011d3 31 push {r5, lr, r4}
sahilmgandhi 18:6a4db94011d3 32 mov r5, r9
sahilmgandhi 18:6a4db94011d3 33 push {r5}
sahilmgandhi 18:6a4db94011d3 34 ldr r5, [r0, #20]
sahilmgandhi 18:6a4db94011d3 35 ldr r3, [r0, #16]
sahilmgandhi 18:6a4db94011d3 36 mov r9, r3
sahilmgandhi 18:6a4db94011d3 37 ldr r3, [r0, #12]
sahilmgandhi 18:6a4db94011d3 38 ldr r2, [r0, #8]
sahilmgandhi 18:6a4db94011d3 39 ldr r1, [r0, #4]
sahilmgandhi 18:6a4db94011d3 40 ldr r0, [r0, #0]
sahilmgandhi 18:6a4db94011d3 41 blx r5
sahilmgandhi 18:6a4db94011d3 42 pop {r5}
sahilmgandhi 18:6a4db94011d3 43 mov r9, r5
sahilmgandhi 18:6a4db94011d3 44 pop {r4-r5, pc}
sahilmgandhi 18:6a4db94011d3 45 bx r14
sahilmgandhi 18:6a4db94011d3 46 */
sahilmgandhi 18:6a4db94011d3 47 static uint32_t jump_to_flash_algo[] = {
sahilmgandhi 18:6a4db94011d3 48 0x464DB530,
sahilmgandhi 18:6a4db94011d3 49 0x6945B420,
sahilmgandhi 18:6a4db94011d3 50 0x46996903,
sahilmgandhi 18:6a4db94011d3 51 0x688268C3,
sahilmgandhi 18:6a4db94011d3 52 0x68006841,
sahilmgandhi 18:6a4db94011d3 53 0xBC2047A8,
sahilmgandhi 18:6a4db94011d3 54 0xBD3046A9
sahilmgandhi 18:6a4db94011d3 55 };
sahilmgandhi 18:6a4db94011d3 56
sahilmgandhi 18:6a4db94011d3 57 // should be called within critical section
sahilmgandhi 18:6a4db94011d3 58 static int32_t flash_algo_init(flash_t *obj, uint32_t address, uint32_t function)
sahilmgandhi 18:6a4db94011d3 59 {
sahilmgandhi 18:6a4db94011d3 60 args_t arguments = {
sahilmgandhi 18:6a4db94011d3 61 .r0 = address,
sahilmgandhi 18:6a4db94011d3 62 .r1 = SystemCoreClock,
sahilmgandhi 18:6a4db94011d3 63 .r2 = function,
sahilmgandhi 18:6a4db94011d3 64 .r3 = 0,
sahilmgandhi 18:6a4db94011d3 65 .r9 = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->static_base,
sahilmgandhi 18:6a4db94011d3 66 .pc = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->init
sahilmgandhi 18:6a4db94011d3 67 };
sahilmgandhi 18:6a4db94011d3 68 return ((flash_algo_jump_t)(((uint32_t)&jump_to_flash_algo) | 1))(&arguments);
sahilmgandhi 18:6a4db94011d3 69 }
sahilmgandhi 18:6a4db94011d3 70
sahilmgandhi 18:6a4db94011d3 71 // should be called within critical section
sahilmgandhi 18:6a4db94011d3 72 static int32_t flash_algo_uninit(flash_t *obj, uint32_t address, uint32_t function)
sahilmgandhi 18:6a4db94011d3 73 {
sahilmgandhi 18:6a4db94011d3 74 args_t arguments = {
sahilmgandhi 18:6a4db94011d3 75 .r0 = address,
sahilmgandhi 18:6a4db94011d3 76 .r1 = SystemCoreClock,
sahilmgandhi 18:6a4db94011d3 77 .r2 = function,
sahilmgandhi 18:6a4db94011d3 78 .r3 = 0,
sahilmgandhi 18:6a4db94011d3 79 .r9 = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->static_base,
sahilmgandhi 18:6a4db94011d3 80 .pc = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->uninit
sahilmgandhi 18:6a4db94011d3 81 };
sahilmgandhi 18:6a4db94011d3 82 return ((flash_algo_jump_t)(((uint32_t)&jump_to_flash_algo) | 1))(&arguments);
sahilmgandhi 18:6a4db94011d3 83 }
sahilmgandhi 18:6a4db94011d3 84
sahilmgandhi 18:6a4db94011d3 85
sahilmgandhi 18:6a4db94011d3 86 int32_t flash_init(flash_t *obj)
sahilmgandhi 18:6a4db94011d3 87 {
sahilmgandhi 18:6a4db94011d3 88 flash_set_target_config(obj);
sahilmgandhi 18:6a4db94011d3 89 return 0;
sahilmgandhi 18:6a4db94011d3 90 }
sahilmgandhi 18:6a4db94011d3 91
sahilmgandhi 18:6a4db94011d3 92 int32_t flash_free(flash_t *obj)
sahilmgandhi 18:6a4db94011d3 93 {
sahilmgandhi 18:6a4db94011d3 94 return 0;
sahilmgandhi 18:6a4db94011d3 95 }
sahilmgandhi 18:6a4db94011d3 96
sahilmgandhi 18:6a4db94011d3 97 int32_t flash_erase_sector(flash_t *obj, uint32_t address)
sahilmgandhi 18:6a4db94011d3 98 {
sahilmgandhi 18:6a4db94011d3 99 core_util_critical_section_enter();
sahilmgandhi 18:6a4db94011d3 100 flash_algo_init(obj, address, MBED_FLASH_ALGO_ERASE);
sahilmgandhi 18:6a4db94011d3 101
sahilmgandhi 18:6a4db94011d3 102 args_t arguments = {
sahilmgandhi 18:6a4db94011d3 103 .r0 = address,
sahilmgandhi 18:6a4db94011d3 104 .r1 = 0,
sahilmgandhi 18:6a4db94011d3 105 .r2 = 0,
sahilmgandhi 18:6a4db94011d3 106 .r3 = 0,
sahilmgandhi 18:6a4db94011d3 107 .r9 = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->static_base,
sahilmgandhi 18:6a4db94011d3 108 .pc = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->erase_sector
sahilmgandhi 18:6a4db94011d3 109 };
sahilmgandhi 18:6a4db94011d3 110 int32_t ret = ((flash_algo_jump_t)(((uint32_t)&jump_to_flash_algo) | 1))(&arguments);
sahilmgandhi 18:6a4db94011d3 111
sahilmgandhi 18:6a4db94011d3 112 flash_algo_uninit(obj, address, MBED_FLASH_ALGO_ERASE);
sahilmgandhi 18:6a4db94011d3 113 core_util_critical_section_exit();
sahilmgandhi 18:6a4db94011d3 114 return ret ? -1 : 0;
sahilmgandhi 18:6a4db94011d3 115 }
sahilmgandhi 18:6a4db94011d3 116
sahilmgandhi 18:6a4db94011d3 117
sahilmgandhi 18:6a4db94011d3 118 int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
sahilmgandhi 18:6a4db94011d3 119 {
sahilmgandhi 18:6a4db94011d3 120 core_util_critical_section_enter();
sahilmgandhi 18:6a4db94011d3 121 flash_algo_init(obj, address, MBED_FLASH_ALGO_PROGRAM);
sahilmgandhi 18:6a4db94011d3 122
sahilmgandhi 18:6a4db94011d3 123 args_t arguments = {
sahilmgandhi 18:6a4db94011d3 124 .r0 = address,
sahilmgandhi 18:6a4db94011d3 125 .r1 = size,
sahilmgandhi 18:6a4db94011d3 126 .r2 = (uint32_t)data,
sahilmgandhi 18:6a4db94011d3 127 .r3 = 0,
sahilmgandhi 18:6a4db94011d3 128 .r9 = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->static_base,
sahilmgandhi 18:6a4db94011d3 129 .pc = (uint32_t)obj->flash_algo->algo_blob + obj->flash_algo->program_page
sahilmgandhi 18:6a4db94011d3 130 };
sahilmgandhi 18:6a4db94011d3 131 int32_t ret = ((flash_algo_jump_t)(((uint32_t)&jump_to_flash_algo) | 1))(&arguments);
sahilmgandhi 18:6a4db94011d3 132
sahilmgandhi 18:6a4db94011d3 133 flash_algo_uninit(obj, address, MBED_FLASH_ALGO_PROGRAM);
sahilmgandhi 18:6a4db94011d3 134 core_util_critical_section_exit();
sahilmgandhi 18:6a4db94011d3 135 return ret ? -1 : 0;
sahilmgandhi 18:6a4db94011d3 136 }
sahilmgandhi 18:6a4db94011d3 137
sahilmgandhi 18:6a4db94011d3 138
sahilmgandhi 18:6a4db94011d3 139 uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
sahilmgandhi 18:6a4db94011d3 140 {
sahilmgandhi 18:6a4db94011d3 141 const sector_info_t *sectors = obj->target_config->sectors;
sahilmgandhi 18:6a4db94011d3 142
sahilmgandhi 18:6a4db94011d3 143 if (address >= obj->target_config->flash_start + obj->target_config->flash_size) {
sahilmgandhi 18:6a4db94011d3 144 return MBED_FLASH_INVALID_SIZE;
sahilmgandhi 18:6a4db94011d3 145 }
sahilmgandhi 18:6a4db94011d3 146
sahilmgandhi 18:6a4db94011d3 147 int sector_index = obj->target_config->sector_info_count - 1;
sahilmgandhi 18:6a4db94011d3 148 for (; sector_index >= 0; sector_index--) {
sahilmgandhi 18:6a4db94011d3 149 if (address >= sectors[sector_index].start) {
sahilmgandhi 18:6a4db94011d3 150 return sectors[sector_index].size;
sahilmgandhi 18:6a4db94011d3 151 }
sahilmgandhi 18:6a4db94011d3 152 }
sahilmgandhi 18:6a4db94011d3 153 return MBED_FLASH_INVALID_SIZE;
sahilmgandhi 18:6a4db94011d3 154 }
sahilmgandhi 18:6a4db94011d3 155
sahilmgandhi 18:6a4db94011d3 156 uint32_t flash_get_page_size(const flash_t *obj)
sahilmgandhi 18:6a4db94011d3 157 {
sahilmgandhi 18:6a4db94011d3 158 return obj->target_config->page_size;
sahilmgandhi 18:6a4db94011d3 159 }
sahilmgandhi 18:6a4db94011d3 160
sahilmgandhi 18:6a4db94011d3 161 uint32_t flash_get_start_address(const flash_t *obj)
sahilmgandhi 18:6a4db94011d3 162 {
sahilmgandhi 18:6a4db94011d3 163 return obj->target_config->flash_start;
sahilmgandhi 18:6a4db94011d3 164 }
sahilmgandhi 18:6a4db94011d3 165
sahilmgandhi 18:6a4db94011d3 166 uint32_t flash_get_size(const flash_t *obj)
sahilmgandhi 18:6a4db94011d3 167 {
sahilmgandhi 18:6a4db94011d3 168 return obj->target_config->flash_size;
sahilmgandhi 18:6a4db94011d3 169 }