cursada_mc2
Base de control de temperatura para EDU-CIAA-NXP
Loading...
Searching...
No Matches
eeprom_driver.c
Go to the documentation of this file.
1
6#include "eeprom_driver.h"
7
8#include "chip.h"
9
10#include <string.h>
11
12#define EEPROM_DRIVER_PAGE_WORDS (EEPROM_PAGE_SIZE / sizeof(uint32_t))
13
14static bool eeprom_driver_inicializado_ = false;
15
23static void driver_eeprom_programar_pagina(uint32_t pagina, const uint8_t* datos_pagina)
24{
25 volatile uint32_t* palabra_destino = (volatile uint32_t*) EEPROM_ADDRESS(pagina, 0U);
26 uint32_t palabras_origen[EEPROM_DRIVER_PAGE_WORDS];
27 uint32_t indice = 0U;
28
29 (void) memcpy(palabras_origen, datos_pagina, EEPROM_PAGE_SIZE);
30
31 Chip_EEPROM_SetAutoProg(LPC_EEPROM, EEPROM_AUTOPROG_AFT_LASTWORDWRITTEN);
32 for (indice = 0U; indice < EEPROM_DRIVER_PAGE_WORDS; ++indice) {
33 palabra_destino[indice] = palabras_origen[indice];
34 }
35 Chip_EEPROM_WaitForIntStatus(LPC_EEPROM, EEPROM_INT_ENDOFPROG);
36 Chip_EEPROM_SetAutoProg(LPC_EEPROM, EEPROM_AUTOPROG_OFF);
37}
38
40{
41 Chip_EEPROM_Init(LPC_EEPROM);
42 Chip_EEPROM_SetAutoProg(LPC_EEPROM, EEPROM_AUTOPROG_OFF);
44 return true;
45}
46
47bool driver_eeprom_read(void* destino, uint32_t cantidad)
48{
49 if (!eeprom_driver_inicializado_ || (destino == 0)) {
50 return false;
51 }
52
53 if (cantidad == 0U) {
54 return true;
55 }
56
57 if (cantidad > DRIVER_EEPROM_REGION_SIZE) {
58 return false;
59 }
60
61 (void) memcpy(destino, (const void*) EEPROM_START, cantidad);
62 return true;
63}
64
65bool driver_eeprom_write(const void* origen, uint32_t cantidad)
66{
67 const uint8_t* datos_origen = (const uint8_t*) origen;
68 uint8_t pagina_buffer[EEPROM_PAGE_SIZE];
69 uint32_t offset = 0U;
70
71 if (!eeprom_driver_inicializado_ || (origen == 0)) {
72 return false;
73 }
74
75 if (cantidad == 0U) {
76 return true;
77 }
78
79 if (cantidad > DRIVER_EEPROM_REGION_SIZE) {
80 return false;
81 }
82
91 while (cantidad > 0U) {
92 const uint32_t direccion_actual = offset;
93 const uint32_t pagina = direccion_actual / EEPROM_PAGE_SIZE;
94 const uint32_t offset_pagina = direccion_actual % EEPROM_PAGE_SIZE;
95 const uint32_t bytes_pagina = EEPROM_PAGE_SIZE - offset_pagina;
96 const uint32_t bytes_a_copiar = (cantidad < bytes_pagina) ? cantidad : bytes_pagina;
97 const uint8_t* direccion_pagina = (const uint8_t*) EEPROM_ADDRESS(pagina, 0U);
98
99 (void) memcpy(pagina_buffer, direccion_pagina, EEPROM_PAGE_SIZE);
100 (void) memcpy(&pagina_buffer[offset_pagina], datos_origen, bytes_a_copiar);
101
102 if (memcmp(pagina_buffer, direccion_pagina, EEPROM_PAGE_SIZE) != 0) {
103 driver_eeprom_programar_pagina(pagina, pagina_buffer);
104 }
105
106 offset += bytes_a_copiar;
107 datos_origen += bytes_a_copiar;
108 cantidad -= bytes_a_copiar;
109 }
110
111 return true;
112}
bool driver_eeprom_read(void *destino, uint32_t cantidad)
Lee un bloque desde la region reservada de EEPROM.
bool driver_eeprom_write(const void *origen, uint32_t cantidad)
Escribe un bloque dentro de la region reservada de EEPROM.
#define EEPROM_DRIVER_PAGE_WORDS
bool driver_eeprom_init(void)
Inicializa el periferico EEPROM.
static void driver_eeprom_programar_pagina(uint32_t pagina, const uint8_t *datos_pagina)
Programa una pagina completa de EEPROM a partir de un buffer RAM.
static bool eeprom_driver_inicializado_
Driver de acceso a la EEPROM interna del LPC4337.
#define DRIVER_EEPROM_REGION_SIZE
Tamano reservado para datos persistentes de la aplicacion.