From c90348397a4a61d9ea0ca013f860a71fd8be69ed Mon Sep 17 00:00:00 2001 From: kristina Date: Sat, 21 May 2016 03:22:03 +0100 Subject: [PATCH] Added C++ ctors and partial SDHOST driver --- arm_chainloader/Makefile | 10 +++ arm_chainloader/chainloader.h | 22 ++++- arm_chainloader/drivers/cprman.cc | 0 arm_chainloader/drivers/sd2.hpp | 86 ++++++++++++++++++++ arm_chainloader/drivers/sdhost.cc | 131 ++++++++++++++++++++++++++++++ arm_chainloader/linker.lds | 43 ++++++++-- 6 files changed, 284 insertions(+), 8 deletions(-) create mode 100755 arm_chainloader/drivers/cprman.cc create mode 100755 arm_chainloader/drivers/sd2.hpp create mode 100755 arm_chainloader/drivers/sdhost.cc diff --git a/arm_chainloader/Makefile b/arm_chainloader/Makefile index 05b8945..7427c6c 100755 --- a/arm_chainloader/Makefile +++ b/arm_chainloader/Makefile @@ -4,7 +4,10 @@ TARGET_ARM_CHAINLOADER = arm_chainloader.bin SRCS = \ start.s \ drivers/uart.c \ + drivers/cprman.cc \ + drivers/sdhost.cc \ ../lib/xprintf.c \ + ../lib/udelay.c \ firmware_rendezvous.c \ main.c @@ -27,11 +30,13 @@ OBJ := $(addprefix $(TARGET_BUILD_DIR)/, $(addsuffix .o, $(basename $(SRCS)))) CROSS_COMPILE = arm-none-eabi- CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)gcc AS = $(CC) OBJCOPY = $(CROSS_COMPILE)objcopy LINKFLAGS = -nostdlib -march=$(ARCH) -Wl,--build-id=none -T linker.lds COMMON_FLAGS = -c -nostdlib -nostartfiles -ffreestanding -march=$(ARCH) -I../ -I./ -mfpu=vfp -mfloat-abi=hard -mtune=arm1176jzf-s CFLAGS = $(COMMON_FLAGS) -std=c11 +CXXFLAGS = $(COMMON_FLAGS) -std=c++11 -fno-exceptions -fno-rtti ASFLAGS = $(COMMON_FLAGS) -x assembler-with-cpp HEADERS := \ @@ -54,6 +59,11 @@ $(TARGET_BUILD_DIR)/%.o: %.c $(HEADERS) @echo $(WARN_COLOR)CC $(NO_COLOR) $@ @$(CC) $(CFLAGS) $< -o $@ +$(TARGET_BUILD_DIR)/%.o: %.cc $(HEADERS) + $(CREATE_SUBDIR) + @echo $(WARN_COLOR)CXX $(NO_COLOR) $@ + @$(CXX) $(CXXFLAGS) $< -o $@ + $(TARGET_BUILD_DIR)/%.o: %.s $(HEADERS) $(CREATE_SUBDIR) @echo $(WARN_COLOR)AS $(NO_COLOR) $@ diff --git a/arm_chainloader/chainloader.h b/arm_chainloader/chainloader.h index 4aa7626..63ea608 100755 --- a/arm_chainloader/chainloader.h +++ b/arm_chainloader/chainloader.h @@ -1,5 +1,25 @@ #pragma once +#include #include -#define printf xprintf \ No newline at end of file +#define printf xprintf + +#ifdef __cplusplus +extern "C" { +#endif + +extern void udelay(uint32_t time); + +#define STATIC_INIT_PRIORITY(x) __attribute__((init_priority(x))) + +#define STATIC_CPRMAN_DRIVER STATIC_INIT_PRIORITY(101) +#define STATIC_DRIVER STATIC_INIT_PRIORITY(200) +#define STATIC_APP STATIC_INIT_PRIORITY(600) + +#define mfence() __sync_synchronize() + +#ifdef __cplusplus +} +#endif + diff --git a/arm_chainloader/drivers/cprman.cc b/arm_chainloader/drivers/cprman.cc new file mode 100755 index 0000000..e69de29 diff --git a/arm_chainloader/drivers/sd2.hpp b/arm_chainloader/drivers/sd2.hpp new file mode 100755 index 0000000..27157ea --- /dev/null +++ b/arm_chainloader/drivers/sd2.hpp @@ -0,0 +1,86 @@ +#pragma once + +/* Error Code */ +#define SD_NO_ERROR 0x0 +#define SD_CRC_ERR 0x80 +#define SD_TO_ERR 0x40 +#define SD_NO_CARD 0x20 +#define SD_BUSY 0x10 +#define SD_STS_ERR 0x08 +#define SD_RSP_TIMEOUT 0x04 +#define SD_IO_ERR 0x02 +/* Return code for MMC switch bus */ +#define SWITCH_SUCCESS 0 +#define SWITCH_ERR 1 +#define SWITCH_FAIL 2 +/* MMC/SD Command Index */ +/* Basic command (class 0) */ +#define GO_IDLE_STATE 0 +#define SEND_OP_COND 1 +#define ALL_SEND_CID 2 +#define SET_RELATIVE_ADDR 3 +#define SEND_RELATIVE_ADDR 3 +#define SET_DSR 4 +#define IO_SEND_OP_COND 5 +#define SWITCH 6 +#define SELECT_CARD 7 +#define DESELECT_CARD 7 +/* CMD8 is "SEND_EXT_CSD" for MMC4.x Spec + * while is "SEND_IF_COND" for SD 2.0 + */ +#define SEND_EXT_CSD 8 +#define SEND_IF_COND 8 +#define SEND_CSD 9 +#define SEND_CID 10 +#define VOLTAGE_SWITCH 11 +#define READ_DAT_UTIL_STOP 11 +#define STOP_TRANSMISSION 12 +#define SEND_STATUS 13 +#define GO_INACTIVE_STATE 15 +#define SET_BLOCKLEN 16 +#define READ_SINGLE_BLOCK 17 +#define READ_MULTIPLE_BLOCK 18 +#define SEND_TUNING_PATTERN 19 +#define BUSTEST_R 14 +#define BUSTEST_W 19 +#define WRITE_BLOCK 24 +#define WRITE_MULTIPLE_BLOCK 25 +#define PROGRAM_CSD 27 +#define ERASE_WR_BLK_START 32 +#define ERASE_WR_BLK_END 33 +#define ERASE_CMD 38 +#define LOCK_UNLOCK 42 +#define IO_RW_DIRECT 52 +#define APP_CMD 55 +#define GEN_CMD 56 +#define SET_BUS_WIDTH 6 +#define SD_STATUS 13 +#define SEND_NUM_WR_BLOCKS 22 +#define SET_WR_BLK_ERASE_COUNT 23 +#define SD_APP_OP_COND 41 +#define SET_CLR_CARD_DETECT 42 +#define SEND_SCR 51 +#define SD_READ_COMPLETE 0x00 +#define SD_READ_TO 0x01 +#define SD_READ_ADVENCE 0x02 +#define SD_CHECK_MODE 0x00 +#define SD_SWITCH_MODE 0x80 +#define SD_FUNC_GROUP_1 0x01 +#define SD_FUNC_GROUP_2 0x02 +#define SD_FUNC_GROUP_3 0x03 +#define SD_FUNC_GROUP_4 0x04 +#define SD_CHECK_SPEC_V1_1 0xFF +#define NO_ARGUMENT 0x00 +#define CHECK_PATTERN 0x000000AA +#define VOLTAGE_SUPPLY_RANGE 0x00000100 +#define SUPPORT_HIGH_AND_EXTENDED_CAPACITY 0x40000000 +#define SUPPORT_MAX_POWER_PERMANCE 0x10000000 +#define SUPPORT_1V8 0x01000000 +#define SWTICH_NO_ERR 0x00 +#define CARD_NOT_EXIST 0x01 +#define SPEC_NOT_SUPPORT 0x02 +#define CHECK_MODE_ERR 0x03 +#define CHECK_NOT_READY 0x04 +#define SWITCH_CRC_ERR 0x05 +#define SWITCH_MODE_ERR 0x06 +#define SWITCH_PASS 0x07 diff --git a/arm_chainloader/drivers/sdhost.cc b/arm_chainloader/drivers/sdhost.cc new file mode 100755 index 0000000..22a2a68 --- /dev/null +++ b/arm_chainloader/drivers/sdhost.cc @@ -0,0 +1,131 @@ +/*============================================================================= +Copyright (C) 2016 Kristina Brooks +All rights reserved. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +FILE DESCRIPTION +SDHOST driver. This used to be known as ALTMMC. + +=============================================================================*/ + +#include +#include + +#include "sd2.hpp" + +#define SDEDM_WRITE_THRESHOLD_SHIFT 9 +#define SDEDM_READ_THRESHOLD_SHIFT 14 +#define SDEDM_THRESHOLD_MASK 0x1f + +#define SAFE_READ_THRESHOLD 4 +#define SAFE_WRITE_THRESHOLD 4 + +#define logf(fmt, ...) printf("[sdhost::%s]: " fmt, __FUNCTION__, ##__VA_ARGS__); + +struct sdhost_t { + void set_power(bool on) { + SH_VDD = on ? SH_VDD_POWER_ON_SET : 0x0; + } + + bool wait(uint32_t timeout = 10000) { + uint32_t t = timeout; + + while(SH_CMD & SH_CMD_NEW_FLAG_SET) { + if (t == 0) { + logf("timed out after %dus!\n", timeout) + return false; + } + t--; + udelay(10); + } + + return true; + } + + bool send(uint32_t command, uint32_t arg) { + if (!wait()) + return false; + + SH_ARG = arg; + SH_CMD = (command & SH_CMD_COMMAND_SET) | SH_CMD_NEW_FLAG_SET; + + udelay(300); + mfence(); + + return true; + } + + void configure_pinmux() { + GP_FSEL4 = 0x24000000; + GP_FSEL5 = 0x924; + GP_PUD = 2; + + logf("GPIOs set!\n"); + } + + void reset() { + logf("resetting controller ...\n"); + + set_power(false); + + SH_CMD = 0; + SH_ARG = 0; + SH_TOUT = 0xF00000; + SH_CDIV = 0; + SH_HSTS = 0x7f8; + SH_HCFG = 0; + SH_HBCT = 0; + SH_HBLC = 0; + + uint32_t temp = SH_EDM; + + temp &= ~((SDEDM_THRESHOLD_MASK< ram - .bss : { *(.bss*) } > ram + . = 0x0; + + _text = .; + + .text : { + *(.text) + *(.text.*) + *(.gnu.warning) + } + + _etext = .; + + .rodata : { *(.rodata) *(.rodata.*) } + . = ALIGN(4096); + _erodata = .; + + . = ALIGN(32 / 8); + + PROVIDE (__init_array_start = .); + .init_array : { + *(.init_array) + *(.init_array.*) + } + PROVIDE (__init_array_end = .); + + .data : { /* Data */ + *(.data) + } + + .bss : { + _edata = .; + __bss_start = .; + *(.bss) + } + + _end = . ; } \ No newline at end of file