Compare commits
1 Commits
hekate-5.7
...
script_dic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a1f8d4243 |
12
.github/workflows/builder.yml
vendored
12
.github/workflows/builder.yml
vendored
@@ -5,21 +5,15 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: devkitpro/devkita64
|
container: devkitpro/devkita64_devkitarm
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
- name: Build TegraExplorer
|
- name: Build TegraExplorer
|
||||||
run: |
|
run: make -j$(nproc)
|
||||||
sudo apt update -y
|
|
||||||
sudo apt install build-essential -y
|
|
||||||
|
|
||||||
make -j$(nproc)
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@master
|
- uses: actions/upload-artifact@master
|
||||||
with:
|
with:
|
||||||
name: TegraExplorer
|
name: TegraExplorer
|
||||||
path: |
|
path: output/TegraExplorer.bin
|
||||||
output/TegraExplorer.bin
|
|
||||||
output/TegraExplorer_small.bin
|
|
||||||
|
|||||||
14
.gitignore
vendored
14
.gitignore
vendored
@@ -2,17 +2,3 @@
|
|||||||
build
|
build
|
||||||
output
|
output
|
||||||
research
|
research
|
||||||
|
|
||||||
loader/payload_00.h
|
|
||||||
|
|
||||||
loader/payload_01.h
|
|
||||||
|
|
||||||
source/script/Debug
|
|
||||||
source/script/*.te
|
|
||||||
source/script/.vs
|
|
||||||
|
|
||||||
*.exe
|
|
||||||
|
|
||||||
source/script/builtin.c
|
|
||||||
|
|
||||||
source/script/builtin.h
|
|
||||||
|
|||||||
51
Makefile
51
Makefile
@@ -8,11 +8,10 @@ include $(DEVKITARM)/base_rules
|
|||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
IPL_LOAD_ADDR := 0x40008000
|
IPL_LOAD_ADDR := 0x40003000
|
||||||
LPVERSION_MAJOR := 4
|
LPVERSION_MAJOR := 3
|
||||||
LPVERSION_MINOR := 0
|
LPVERSION_MINOR := 0
|
||||||
LPVERSION_BUGFX := 1
|
LPVERSION_BUGFX := 2
|
||||||
LPVERSION := \"$(LPVERSION_MAJOR).$(LPVERSION_MINOR).$(LPVERSION_BUGFX)\"
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
@@ -22,13 +21,10 @@ OUTPUTDIR := output
|
|||||||
SOURCEDIR = source
|
SOURCEDIR = source
|
||||||
BDKDIR := bdk
|
BDKDIR := bdk
|
||||||
BDKINC := -I./$(BDKDIR)
|
BDKINC := -I./$(BDKDIR)
|
||||||
LOADERDIR := ./loader
|
|
||||||
LZ77DIR := ./tools/lz
|
|
||||||
BIN2CDIR := ./tools/bin2c
|
|
||||||
VPATH = $(dir ./$(SOURCEDIR)/) $(dir $(wildcard ./$(SOURCEDIR)/*/)) $(dir $(wildcard ./$(SOURCEDIR)/*/*/))
|
VPATH = $(dir ./$(SOURCEDIR)/) $(dir $(wildcard ./$(SOURCEDIR)/*/)) $(dir $(wildcard ./$(SOURCEDIR)/*/*/))
|
||||||
VPATH += $(dir $(wildcard ./$(BDKDIR)/)) $(dir $(wildcard ./$(BDKDIR)/*/)) $(dir $(wildcard ./$(BDKDIR)/*/*/))
|
VPATH += $(dir $(wildcard ./$(BDKDIR)/)) $(dir $(wildcard ./$(BDKDIR)/*/)) $(dir $(wildcard ./$(BDKDIR)/*/*/))
|
||||||
|
|
||||||
OBJS = $(BUILDDIR)/$(TARGET)/script/builtin.c $(patsubst $(SOURCEDIR)/%.S, $(BUILDDIR)/$(TARGET)/%.o, \
|
OBJS = $(patsubst $(SOURCEDIR)/%.S, $(BUILDDIR)/$(TARGET)/%.o, \
|
||||||
$(patsubst $(SOURCEDIR)/%.c, $(BUILDDIR)/$(TARGET)/%.o, \
|
$(patsubst $(SOURCEDIR)/%.c, $(BUILDDIR)/$(TARGET)/%.o, \
|
||||||
$(call rwildcard, $(SOURCEDIR), *.S *.c)))
|
$(call rwildcard, $(SOURCEDIR), *.S *.c)))
|
||||||
OBJS += $(patsubst $(BDKDIR)/%.S, $(BUILDDIR)/$(TARGET)/%.o, \
|
OBJS += $(patsubst $(BDKDIR)/%.S, $(BUILDDIR)/$(TARGET)/%.o, \
|
||||||
@@ -41,11 +37,9 @@ FFCFG_INC := '"../$(SOURCEDIR)/libs/fatfs/ffconf.h"'
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
|
CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
|
||||||
CUSTOMDEFINES += -DLP_VER_MJ=$(LPVERSION_MAJOR) -DLP_VER_MN=$(LPVERSION_MINOR) -DLP_VER_BF=$(LPVERSION_BUGFX) -DLP_VER=$(LPVERSION) -DBDK_EMUMMC_ENABLE
|
CUSTOMDEFINES += -DLP_VER_MJ=$(LPVERSION_MAJOR) -DLP_VER_MN=$(LPVERSION_MINOR) -DLP_VER_BF=$(LPVERSION_BUGFX)
|
||||||
CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC)
|
CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC)
|
||||||
|
|
||||||
FFCFG_INC := '"../$(PROJECT_DIR)/libs/fatfs/ffconf.h"'
|
|
||||||
|
|
||||||
# 0: UART_A, 1: UART_B.
|
# 0: UART_A, 1: UART_B.
|
||||||
#CUSTOMDEFINES += -DDEBUG_UART_PORT=0
|
#CUSTOMDEFINES += -DDEBUG_UART_PORT=0
|
||||||
|
|
||||||
@@ -59,30 +53,16 @@ LDFLAGS = $(ARCH) -nostartfiles -lgcc -Wl,--nmagic,--gc-sections -Xlinker --defs
|
|||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
all: $(OUTPUTDIR)/$(TARGET)_small.bin
|
all: $(OUTPUTDIR)/$(TARGET).bin
|
||||||
|
@echo -n "Payload size is "
|
||||||
$(eval BIN_SIZE = $(shell wc -c < $(OUTPUTDIR)/$(TARGET).bin))
|
$(eval BIN_SIZE = $(shell wc -c < $(OUTPUTDIR)/$(TARGET).bin))
|
||||||
@echo "Payload size is $(BIN_SIZE)"
|
@echo $(BIN_SIZE)
|
||||||
$(eval COMPR_BIN_SIZE = $(shell wc -c < $(OUTPUTDIR)/$(TARGET)_small.bin))
|
|
||||||
@echo "Compressed Payload size is $(COMPR_BIN_SIZE)"
|
|
||||||
|
|
||||||
@echo "Max size is 126296 Bytes."
|
@echo "Max size is 126296 Bytes."
|
||||||
@if [ ${BIN_SIZE} -gt 126296 ]; then echo "\e[1;33mPayload size exceeds limit!\e[0m"; fi
|
@if [ ${BIN_SIZE} -gt 126296 ]; then echo "\e[1;33mPayload size exceeds limit!\e[0m"; fi
|
||||||
@if [ ${COMPR_BIN_SIZE} -gt 126296 ]; then echo "\e[1;33mCompressed Payload size exceeds limit!\e[0m"; fi
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rf $(BUILDDIR)
|
@rm -rf $(BUILDDIR)
|
||||||
@rm -rf $(OUTPUTDIR)
|
@rm -rf $(OUTPUTDIR)
|
||||||
@rm -rf $(LOADERDIR)/payload_*.h
|
|
||||||
|
|
||||||
$(OUTPUTDIR)/$(TARGET)_small.bin: $(OUTPUTDIR)/$(TARGET).bin
|
|
||||||
@$(MAKE) -C $(LZ77DIR)
|
|
||||||
@$(LZ77DIR)/lz77 $(OUTPUTDIR)/$(TARGET).bin
|
|
||||||
@$(MAKE) -C $(BIN2CDIR)
|
|
||||||
@$(BIN2CDIR)/bin2c $(OUTPUTDIR)/$(TARGET).bin.00.lz payload_00 > $(LOADERDIR)/payload_00.h
|
|
||||||
@$(BIN2CDIR)/bin2c $(OUTPUTDIR)/$(TARGET).bin.01.lz payload_01 > $(LOADERDIR)/payload_01.h
|
|
||||||
@rm -rf $(OUTPUTDIR)/$(TARGET).bin.*.lz
|
|
||||||
|
|
||||||
$(MAKE) -C $(LOADERDIR) PAYLOAD_NAME=$(TARGET)_small
|
|
||||||
|
|
||||||
$(OUTPUTDIR)/$(TARGET).bin: $(BUILDDIR)/$(TARGET)/$(TARGET).elf
|
$(OUTPUTDIR)/$(TARGET).bin: $(BUILDDIR)/$(TARGET)/$(TARGET).elf
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
@@ -106,18 +86,3 @@ $(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.c
|
|||||||
$(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.S
|
$(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.S
|
||||||
@mkdir -p "$(@D)"
|
@mkdir -p "$(@D)"
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(BUILDDIR)/$(TARGET)/script/builtin.o: $(BUILDDIR)/$(TARGET)/script/builtin.c
|
|
||||||
@mkdir -p "$(@D)"
|
|
||||||
$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@
|
|
||||||
|
|
||||||
$(BUILDDIR)/$(TARGET)/script/builtin.c: scripts/*.te
|
|
||||||
@mkdir -p "$(@D)"
|
|
||||||
@mkdir -p "$(BUILDDIR)/$(TARGET)/scripts"
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
@py ts-minifier.py --such-meme -d "$(BUILDDIR)/$(TARGET)/scripts" $(wildcard scripts/*.te)
|
|
||||||
@py te2c.py "$(BUILDDIR)/$(TARGET)/script/builtin" "$(BUILDDIR)/$(TARGET)/scripts"
|
|
||||||
else
|
|
||||||
@python3 ts-minifier.py --such-meme -d "$(BUILDDIR)/$(TARGET)/scripts" $(wildcard scripts/*.te)
|
|
||||||
@python3 te2c.py "$(BUILDDIR)/$(TARGET)/script/builtin" "$(BUILDDIR)/$(TARGET)/scripts"
|
|
||||||
endif
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
For future reference if updating the BDK
|
|
||||||
|
|
||||||
// TODO: memory map(?)
|
|
||||||
|
|
||||||
## /bdk/sec/SE.c&h
|
|
||||||
- Added se_aes_cmac
|
|
||||||
- Added se_calc_hmac_sha256
|
|
||||||
|
|
||||||
## /bdk/usb
|
|
||||||
- Removed entirely
|
|
||||||
|
|
||||||
## /bdk/storage/sd.c
|
|
||||||
- in sd_file_read(), extend read buffer by 1 and place a NULL byte at the end
|
|
||||||
|
|
||||||
## /bdk/libs/fatfs/ff.c&h
|
|
||||||
- Added f_fdisk_mod
|
|
||||||
- Stubbed exfat partition creation
|
|
||||||
|
|
||||||
## /bdk/utils/ini.c
|
|
||||||
- Added initial 'unknown' section to parse prod.keys
|
|
||||||
|
|
||||||
## /bdk/libs
|
|
||||||
- Added nx-savedata from [Lockpick_RCM](https://github.com/shchmue/Lockpick_RCM)
|
|
||||||
76
bdk/bdk.h
76
bdk/bdk.h
@@ -1,76 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2022 CTCaer
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BDK_H
|
|
||||||
#define BDK_H
|
|
||||||
|
|
||||||
#include <memory_map.h>
|
|
||||||
|
|
||||||
#include <display/di.h>
|
|
||||||
#include <input/als.h>
|
|
||||||
#include <input/joycon.h>
|
|
||||||
#include <input/touch.h>
|
|
||||||
#include <mem/emc.h>
|
|
||||||
#include <mem/heap.h>
|
|
||||||
#include <mem/mc.h>
|
|
||||||
#include <mem/minerva.h>
|
|
||||||
#include <mem/sdram.h>
|
|
||||||
#include <mem/smmu.h>
|
|
||||||
#include <module.h>
|
|
||||||
#include <power/bm92t36.h>
|
|
||||||
#include <power/bq24193.h>
|
|
||||||
#include <power/max17050.h>
|
|
||||||
#include <power/max77620.h>
|
|
||||||
#include <power/max7762x.h>
|
|
||||||
#include <power/max77812.h>
|
|
||||||
#include <power/regulator_5v.h>
|
|
||||||
#include <rtc/max77620-rtc.h>
|
|
||||||
#include <sec/se.h>
|
|
||||||
#include <sec/tsec.h>
|
|
||||||
#include <soc/actmon.h>
|
|
||||||
#include <soc/bpmp.h>
|
|
||||||
#include <soc/ccplex.h>
|
|
||||||
#include <soc/clock.h>
|
|
||||||
#include <soc/fuse.h>
|
|
||||||
#include <soc/gpio.h>
|
|
||||||
#include <soc/hw_init.h>
|
|
||||||
#include <soc/i2c.h>
|
|
||||||
#include <soc/kfuse.h>
|
|
||||||
#include <soc/pinmux.h>
|
|
||||||
#include <soc/pmc.h>
|
|
||||||
#include <soc/t210.h>
|
|
||||||
#include <soc/uart.h>
|
|
||||||
#include <storage/emmc.h>
|
|
||||||
#include <storage/mbr_gpt.h>
|
|
||||||
#include <storage/mmc.h>
|
|
||||||
#include <storage/nx_emmc_bis.h>
|
|
||||||
#include <storage/ramdisk.h>
|
|
||||||
#include <storage/sd.h>
|
|
||||||
#include <storage/sdmmc.h>
|
|
||||||
#include <thermal/fan.h>
|
|
||||||
#include <thermal/tmp451.h>
|
|
||||||
#include <utils/aarch64_util.h>
|
|
||||||
#include <utils/btn.h>
|
|
||||||
#include <utils/dirlist.h>
|
|
||||||
#include <utils/ini.h>
|
|
||||||
#include <utils/list.h>
|
|
||||||
#include <utils/sprintf.h>
|
|
||||||
#include <utils/types.h>
|
|
||||||
#include <utils/util.h>
|
|
||||||
|
|
||||||
#include <gfx_utils.h>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
278
bdk/display/di.c
278
bdk/display/di.c
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
#include <power/max7762x.h>
|
#include <power/max7762x.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include <soc/clock.h>
|
#include <soc/clock.h>
|
||||||
#include <soc/fuse.h>
|
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include <soc/hw_init.h>
|
#include <soc/hw_init.h>
|
||||||
#include <soc/i2c.h>
|
#include <soc/i2c.h>
|
||||||
@@ -36,7 +35,6 @@
|
|||||||
extern volatile nyx_storage_t *nyx_str;
|
extern volatile nyx_storage_t *nyx_str;
|
||||||
|
|
||||||
static u32 _display_id = 0;
|
static u32 _display_id = 0;
|
||||||
static bool nx_aula = false;
|
|
||||||
|
|
||||||
static void _display_panel_and_hw_end(bool no_panel_deinit);
|
static void _display_panel_and_hw_end(bool no_panel_deinit);
|
||||||
|
|
||||||
@@ -93,7 +91,7 @@ int display_dsi_read(u8 cmd, u32 len, void *data, bool video_enabled)
|
|||||||
|
|
||||||
// Wait for vblank before starting the transfer.
|
// Wait for vblank before starting the transfer.
|
||||||
DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) = DC_CMD_INT_FRAME_END_INT; // Clear interrupt.
|
DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) = DC_CMD_INT_FRAME_END_INT; // Clear interrupt.
|
||||||
while (!(DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) & DC_CMD_INT_FRAME_END_INT))
|
while (DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) & DC_CMD_INT_FRAME_END_INT)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,22 +134,19 @@ int display_dsi_read(u8 cmd, u32 len, void *data, bool video_enabled)
|
|||||||
case DCS_2_BYTE_SHORT_RD_RES:
|
case DCS_2_BYTE_SHORT_RD_RES:
|
||||||
memcpy(data, &fifo[2], 2);
|
memcpy(data, &fifo[2], 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACK_ERROR_RES:
|
case ACK_ERROR_RES:
|
||||||
default:
|
default:
|
||||||
res = 1;
|
res = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
res = 1;
|
|
||||||
|
|
||||||
// Disable host cmd packets during video and restore host control.
|
// Disable host cmd packets during video and restore host control.
|
||||||
if (video_enabled)
|
if (video_enabled)
|
||||||
{
|
{
|
||||||
// Wait for vblank before reseting sync points.
|
// Wait for vblank before reseting sync points.
|
||||||
DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) = DC_CMD_INT_FRAME_END_INT; // Clear interrupt.
|
DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) = DC_CMD_INT_FRAME_END_INT; // Clear interrupt.
|
||||||
while (!(DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) & DC_CMD_INT_FRAME_END_INT))
|
while (DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) & DC_CMD_INT_FRAME_END_INT)
|
||||||
;
|
;
|
||||||
|
|
||||||
// Reset all states of syncpt block.
|
// Reset all states of syncpt block.
|
||||||
@@ -176,21 +171,17 @@ int display_dsi_read(u8 cmd, u32 len, void *data, bool video_enabled)
|
|||||||
|
|
||||||
void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
||||||
{
|
{
|
||||||
static u32 *fifo32 = NULL;
|
|
||||||
u8 *fifo8;
|
u8 *fifo8;
|
||||||
|
u32 *fifo32;
|
||||||
u32 host_control;
|
u32 host_control;
|
||||||
|
|
||||||
// Allocate fifo buffer.
|
|
||||||
if (!fifo32)
|
|
||||||
fifo32 = malloc(DSI_STATUS_RX_FIFO_SIZE * 8 * sizeof(u32));
|
|
||||||
|
|
||||||
// Enable host cmd packets during video and save host control.
|
// Enable host cmd packets during video and save host control.
|
||||||
if (video_enabled)
|
if (video_enabled)
|
||||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = DSI_CMD_PKT_VID_ENABLE;
|
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = DSI_CMD_PKT_VID_ENABLE;
|
||||||
host_control = DSI(_DSIREG(DSI_HOST_CONTROL));
|
host_control = DSI(_DSIREG(DSI_HOST_CONTROL));
|
||||||
|
|
||||||
// Enable host transfer trigger.
|
// Enable host transfer trigger.
|
||||||
DSI(_DSIREG(DSI_HOST_CONTROL)) = host_control | DSI_HOST_CONTROL_TX_TRIG_HOST;
|
DSI(_DSIREG(DSI_HOST_CONTROL)) |= DSI_HOST_CONTROL_TX_TRIG_HOST;
|
||||||
|
|
||||||
switch (len)
|
switch (len)
|
||||||
{
|
{
|
||||||
@@ -203,7 +194,7 @@ void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
memset(fifo32, 0, DSI_STATUS_RX_FIFO_SIZE * 8 * sizeof(u32));
|
fifo32 = calloc(DSI_STATUS_RX_FIFO_SIZE * 8, 4);
|
||||||
fifo8 = (u8 *)fifo32;
|
fifo8 = (u8 *)fifo32;
|
||||||
fifo32[0] = (len << 8) | MIPI_DSI_DCS_LONG_WRITE;
|
fifo32[0] = (len << 8) | MIPI_DSI_DCS_LONG_WRITE;
|
||||||
fifo8[4] = cmd;
|
fifo8[4] = cmd;
|
||||||
@@ -212,6 +203,7 @@ void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
|||||||
for (u32 i = 0; i < (ALIGN(len, 4) / 4); i++)
|
for (u32 i = 0; i < (ALIGN(len, 4) / 4); i++)
|
||||||
DSI(_DSIREG(DSI_WR_DATA)) = fifo32[i];
|
DSI(_DSIREG(DSI_WR_DATA)) = fifo32[i];
|
||||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
||||||
|
free(fifo32);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,74 +216,8 @@ void display_dsi_write(u8 cmd, u32 len, void *data, bool video_enabled)
|
|||||||
DSI(_DSIREG(DSI_HOST_CONTROL)) = host_control;
|
DSI(_DSIREG(DSI_HOST_CONTROL)) = host_control;
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_dsi_vblank_write(u8 cmd, u32 len, void *data)
|
|
||||||
{
|
|
||||||
static u32 *fifo32 = NULL;
|
|
||||||
u8 *fifo8;
|
|
||||||
|
|
||||||
// Allocate fifo buffer.
|
|
||||||
if (!fifo32)
|
|
||||||
fifo32 = malloc(DSI_STATUS_RX_FIFO_SIZE * 8 * sizeof(u32));
|
|
||||||
|
|
||||||
// Enable vblank interrupt.
|
|
||||||
DISPLAY_A(_DIREG(DC_CMD_INT_ENABLE)) = DC_CMD_INT_FRAME_END_INT;
|
|
||||||
|
|
||||||
// Use the 4th line to transmit the host cmd packet.
|
|
||||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = DSI_CMD_PKT_VID_ENABLE | DSI_DSI_LINE_TYPE(4);
|
|
||||||
|
|
||||||
// Wait for vblank before starting the transfer.
|
|
||||||
DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) = DC_CMD_INT_FRAME_END_INT; // Clear interrupt.
|
|
||||||
while (!(DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) & DC_CMD_INT_FRAME_END_INT))
|
|
||||||
;
|
|
||||||
|
|
||||||
switch (len)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
DSI(_DSIREG(DSI_WR_DATA)) = (cmd << 8) | MIPI_DSI_DCS_SHORT_WRITE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
DSI(_DSIREG(DSI_WR_DATA)) = ((cmd | (*(u8 *)data << 8)) << 8) | MIPI_DSI_DCS_SHORT_WRITE_PARAM;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
memset(fifo32, 0, DSI_STATUS_RX_FIFO_SIZE * 8 * sizeof(u32));
|
|
||||||
fifo8 = (u8 *)fifo32;
|
|
||||||
fifo32[0] = (len << 8) | MIPI_DSI_DCS_LONG_WRITE;
|
|
||||||
fifo8[4] = cmd;
|
|
||||||
memcpy(&fifo8[5], data, len);
|
|
||||||
len += 4 + 1; // Increase length by CMD/length word and DCS CMD.
|
|
||||||
for (u32 i = 0; i < (ALIGN(len, 4) / 4); i++)
|
|
||||||
DSI(_DSIREG(DSI_WR_DATA)) = fifo32[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for vblank before reseting sync points.
|
|
||||||
DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) = DC_CMD_INT_FRAME_END_INT; // Clear interrupt.
|
|
||||||
while (!(DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) & DC_CMD_INT_FRAME_END_INT))
|
|
||||||
;
|
|
||||||
|
|
||||||
// Reset all states of syncpt block.
|
|
||||||
DSI(_DSIREG(DSI_INCR_SYNCPT_CNTRL)) = DSI_INCR_SYNCPT_SOFT_RESET;
|
|
||||||
usleep(300); // Stabilization delay.
|
|
||||||
|
|
||||||
// Clear syncpt block reset.
|
|
||||||
DSI(_DSIREG(DSI_INCR_SYNCPT_CNTRL)) = 0;
|
|
||||||
usleep(300); // Stabilization delay.
|
|
||||||
|
|
||||||
// Restore video mode and host control.
|
|
||||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = 0;
|
|
||||||
|
|
||||||
// Disable and clear vblank interrupt.
|
|
||||||
DISPLAY_A(_DIREG(DC_CMD_INT_ENABLE)) = 0;
|
|
||||||
DISPLAY_A(_DIREG(DC_CMD_INT_STATUS)) = DC_CMD_INT_FRAME_END_INT;
|
|
||||||
}
|
|
||||||
|
|
||||||
void display_init()
|
void display_init()
|
||||||
{
|
{
|
||||||
// Get Hardware type, as it's used in various DI functions.
|
|
||||||
nx_aula = fuse_read_hw_type() == FUSE_NX_HW_TYPE_AULA;
|
|
||||||
|
|
||||||
// Check if display is already initialized.
|
// Check if display is already initialized.
|
||||||
if (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_L) & BIT(CLK_L_DISP1))
|
if (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_L) & BIT(CLK_L_DISP1))
|
||||||
_display_panel_and_hw_end(true);
|
_display_panel_and_hw_end(true);
|
||||||
@@ -344,31 +270,22 @@ void display_init()
|
|||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) &= ~PINMUX_TRISTATE; // PULL_DOWN | 1
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) &= ~PINMUX_TRISTATE; // PULL_DOWN | 1
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_EN) &= ~PINMUX_TRISTATE; // PULL_DOWN
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_EN) &= ~PINMUX_TRISTATE; // PULL_DOWN
|
||||||
|
|
||||||
if (nx_aula)
|
// Set LCD +-5V pins mode and direction
|
||||||
{
|
gpio_config(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_MODE_GPIO);
|
||||||
// Configure LCD RST pin.
|
gpio_output_enable(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_OUTPUT_ENABLE);
|
||||||
gpio_config(GPIO_PORT_V, GPIO_PIN_2, GPIO_MODE_GPIO);
|
|
||||||
gpio_output_enable(GPIO_PORT_V, GPIO_PIN_2, GPIO_OUTPUT_ENABLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Set LCD +-5V pins mode and direction
|
|
||||||
gpio_config(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_MODE_GPIO);
|
|
||||||
gpio_output_enable(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_OUTPUT_ENABLE);
|
|
||||||
|
|
||||||
// Enable LCD power.
|
// Enable LCD power.
|
||||||
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_HIGH); // LCD +5V enable.
|
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_HIGH); // LCD +5V enable.
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_HIGH); // LCD -5V enable.
|
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_HIGH); // LCD -5V enable.
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
|
||||||
// Configure Backlight PWM/EN and LCD RST pins (BL PWM, BL EN, LCD RST).
|
// Configure Backlight PWM/EN and LCD RST pins (BL PWM, BL EN, LCD RST).
|
||||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_MODE_GPIO);
|
gpio_config(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_MODE_GPIO);
|
||||||
gpio_output_enable(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_OUTPUT_ENABLE);
|
gpio_output_enable(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_OUTPUT_ENABLE);
|
||||||
|
|
||||||
// Enable Backlight power.
|
// Enable Backlight power.
|
||||||
gpio_write(GPIO_PORT_V, GPIO_PIN_1, GPIO_HIGH);
|
gpio_write(GPIO_PORT_V, GPIO_PIN_1, GPIO_HIGH);
|
||||||
}
|
|
||||||
|
|
||||||
// Power up supply regulator for display interface.
|
// Power up supply regulator for display interface.
|
||||||
MIPI_CAL(_DSIREG(MIPI_CAL_MIPI_BIAS_PAD_CFG2)) = 0;
|
MIPI_CAL(_DSIREG(MIPI_CAL_MIPI_BIAS_PAD_CFG2)) = 0;
|
||||||
@@ -419,18 +336,35 @@ void display_init()
|
|||||||
usleep(60000);
|
usleep(60000);
|
||||||
|
|
||||||
// Setup DSI device takeover timeout.
|
// Setup DSI device takeover timeout.
|
||||||
DSI(_DSIREG(DSI_BTA_TIMING)) = nx_aula ? 0x40103 : 0x50204;
|
DSI(_DSIREG(DSI_BTA_TIMING)) = 0x50204;
|
||||||
|
|
||||||
|
#if 0
|
||||||
// Get Display ID.
|
// Get Display ID.
|
||||||
_display_id = 0xCCCCCC;
|
_display_id = 0xCCCCCC; // Set initial value. 4th byte cleared.
|
||||||
|
display_dsi_read(MIPI_DCS_GET_DISPLAY_ID, 3, &_display_id, DSI_VIDEO_DISABLED);
|
||||||
|
#else
|
||||||
|
// Drain RX FIFO.
|
||||||
|
_display_dsi_read_rx_fifo(NULL);
|
||||||
|
|
||||||
|
// Set reply size.
|
||||||
|
_display_dsi_send_cmd(MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE, 3, 0);
|
||||||
|
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO);
|
||||||
|
|
||||||
|
// Request register read.
|
||||||
|
_display_dsi_send_cmd(MIPI_DSI_DCS_READ, MIPI_DCS_GET_DISPLAY_ID, 0);
|
||||||
|
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO);
|
||||||
|
|
||||||
|
// Transfer bus control to device for transmitting the reply.
|
||||||
|
DSI(_DSIREG(DSI_HOST_CONTROL)) = DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_IMM_BTA | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC;
|
||||||
|
_display_dsi_wait(150000, _DSIREG(DSI_HOST_CONTROL), DSI_HOST_CONTROL_IMM_BTA);
|
||||||
|
|
||||||
|
// Wait a bit for the reply.
|
||||||
|
usleep(5000);
|
||||||
|
|
||||||
|
// MIPI_DCS_GET_DISPLAY_ID reply is a long read, size 3 x u32.
|
||||||
for (u32 i = 0; i < 3; i++)
|
for (u32 i = 0; i < 3; i++)
|
||||||
{
|
_display_id = DSI(_DSIREG(DSI_RD_DATA)) & 0xFFFFFF; // Skip ack and msg type info and get the payload (display id).
|
||||||
if (!display_dsi_read(MIPI_DCS_GET_DISPLAY_ID, 3, &_display_id, DSI_VIDEO_DISABLED))
|
#endif
|
||||||
break;
|
|
||||||
|
|
||||||
usleep(10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save raw Display ID to Nyx storage.
|
// Save raw Display ID to Nyx storage.
|
||||||
nyx_str->info.disp_id = _display_id;
|
nyx_str->info.disp_id = _display_id;
|
||||||
|
|
||||||
@@ -440,23 +374,9 @@ void display_init()
|
|||||||
if ((_display_id & 0xFF) == PANEL_JDI_XXX062M)
|
if ((_display_id & 0xFF) == PANEL_JDI_XXX062M)
|
||||||
_display_id = PANEL_JDI_XXX062M;
|
_display_id = PANEL_JDI_XXX062M;
|
||||||
|
|
||||||
// For Aula ensure that we have a compatible panel id.
|
|
||||||
if (nx_aula && _display_id == 0xCCCC)
|
|
||||||
_display_id = PANEL_SAM_AMS699VC01;
|
|
||||||
|
|
||||||
// Initialize display panel.
|
// Initialize display panel.
|
||||||
switch (_display_id)
|
switch (_display_id)
|
||||||
{
|
{
|
||||||
case PANEL_SAM_AMS699VC01:
|
|
||||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_EXIT_SLEEP_MODE, 180000);
|
|
||||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, 0xA0, 0); // Write 0 to 0xA0.
|
|
||||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, MIPI_DCS_SET_CONTROL_DISPLAY | (DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL << 8), 0); // Enable brightness control.
|
|
||||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x339; // MIPI_DSI_DCS_LONG_WRITE: 3 bytes.
|
|
||||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x000051; // MIPI_DCS_SET_BRIGHTNESS 0000: 0%. FF07: 100%.
|
|
||||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
|
||||||
usleep(5000);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PANEL_JDI_XXX062M:
|
case PANEL_JDI_XXX062M:
|
||||||
exec_cfg((u32 *)DSI_BASE, _display_init_config_jdi, 43);
|
exec_cfg((u32 *)DSI_BASE, _display_init_config_jdi, 43);
|
||||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_EXIT_SLEEP_MODE, 180000);
|
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_EXIT_SLEEP_MODE, 180000);
|
||||||
@@ -495,7 +415,7 @@ void display_init()
|
|||||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_SET_DISPLAY_ON, 20000);
|
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_SET_DISPLAY_ON, 20000);
|
||||||
|
|
||||||
// Configure PLLD for DISP1.
|
// Configure PLLD for DISP1.
|
||||||
plld_div = (1 << 20) | (24 << 11) | 1; // DIVM: 1, DIVN: 24, DIVP: 1. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 234 MHz (offset, it's ddr btw, so normally div2).
|
plld_div = (1 << 20) | (24 << 11) | 1; // DIVM: 1, DIVN: 24, DIVP: 1. PLLD_OUT: 768 MHz, PLLD_OUT0 (DSI): 234 MHz (offset).
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div;
|
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) = PLLCX_BASE_ENABLE | PLLCX_BASE_LOCK | plld_div;
|
||||||
|
|
||||||
if (tegra_t210)
|
if (tegra_t210)
|
||||||
@@ -545,9 +465,6 @@ void display_init()
|
|||||||
|
|
||||||
void display_backlight_pwm_init()
|
void display_backlight_pwm_init()
|
||||||
{
|
{
|
||||||
if (_display_id == PANEL_SAM_AMS699VC01)
|
|
||||||
return;
|
|
||||||
|
|
||||||
clock_enable_pwm();
|
clock_enable_pwm();
|
||||||
|
|
||||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN; // Enable PWM and set it to 25KHz PFM. 29.5KHz is stock.
|
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN; // Enable PWM and set it to 25KHz PFM. 29.5KHz is stock.
|
||||||
@@ -561,27 +478,20 @@ void display_backlight(bool enable)
|
|||||||
gpio_write(GPIO_PORT_V, GPIO_PIN_0, enable ? GPIO_HIGH : GPIO_LOW); // Backlight PWM GPIO.
|
gpio_write(GPIO_PORT_V, GPIO_PIN_0, enable ? GPIO_HIGH : GPIO_LOW); // Backlight PWM GPIO.
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_dsi_backlight_brightness(u32 brightness)
|
void display_backlight_brightness(u32 brightness, u32 step_delay)
|
||||||
{
|
|
||||||
// Normalize brightness value by 82% and a base of 45 duty.
|
|
||||||
if (brightness)
|
|
||||||
brightness = (brightness * PANEL_OLED_BL_COEFF / 100) + PANEL_OLED_BL_OFFSET;
|
|
||||||
|
|
||||||
u16 bl_ctrl = byte_swap_16((u16)(brightness * 8));
|
|
||||||
display_dsi_vblank_write(MIPI_DCS_SET_BRIGHTNESS, 2, &bl_ctrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void display_pwm_backlight_brightness(u32 brightness, u32 step_delay)
|
|
||||||
{
|
{
|
||||||
u32 old_value = (PWM(PWM_CONTROLLER_PWM_CSR_0) >> 16) & 0xFF;
|
u32 old_value = (PWM(PWM_CONTROLLER_PWM_CSR_0) >> 16) & 0xFF;
|
||||||
if (brightness == old_value)
|
if (brightness == old_value)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (brightness > 255)
|
||||||
|
brightness = 255;
|
||||||
|
|
||||||
if (old_value < brightness)
|
if (old_value < brightness)
|
||||||
{
|
{
|
||||||
for (u32 i = old_value; i < brightness + 1; i++)
|
for (u32 i = old_value; i < brightness + 1; i++)
|
||||||
{
|
{
|
||||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN | (i << 16);
|
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN | (i << 16); // Enable PWM and set it to 25KHz PFM.
|
||||||
usleep(step_delay);
|
usleep(step_delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -589,7 +499,7 @@ void display_pwm_backlight_brightness(u32 brightness, u32 step_delay)
|
|||||||
{
|
{
|
||||||
for (u32 i = old_value; i > brightness; i--)
|
for (u32 i = old_value; i > brightness; i--)
|
||||||
{
|
{
|
||||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN | (i << 16);
|
PWM(PWM_CONTROLLER_PWM_CSR_0) = PWM_CSR_EN | (i << 16); // Enable PWM and set it to 25KHz PFM.
|
||||||
usleep(step_delay);
|
usleep(step_delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -597,22 +507,6 @@ void display_pwm_backlight_brightness(u32 brightness, u32 step_delay)
|
|||||||
PWM(PWM_CONTROLLER_PWM_CSR_0) = 0;
|
PWM(PWM_CONTROLLER_PWM_CSR_0) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_backlight_brightness(u32 brightness, u32 step_delay)
|
|
||||||
{
|
|
||||||
if (brightness > 255)
|
|
||||||
brightness = 255;
|
|
||||||
|
|
||||||
if (_display_id != PANEL_SAM_AMS699VC01)
|
|
||||||
display_pwm_backlight_brightness(brightness, step_delay);
|
|
||||||
else
|
|
||||||
display_dsi_backlight_brightness(brightness);
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 display_get_backlight_brightness()
|
|
||||||
{
|
|
||||||
return ((PWM(PWM_CONTROLLER_PWM_CSR_0) >> 16) & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _display_panel_and_hw_end(bool no_panel_deinit)
|
static void _display_panel_and_hw_end(bool no_panel_deinit)
|
||||||
{
|
{
|
||||||
if (no_panel_deinit)
|
if (no_panel_deinit)
|
||||||
@@ -633,9 +527,7 @@ static void _display_panel_and_hw_end(bool no_panel_deinit)
|
|||||||
// De-initialize video controller.
|
// De-initialize video controller.
|
||||||
exec_cfg((u32 *)DISPLAY_A_BASE, _display_video_disp_controller_disable_config, 17);
|
exec_cfg((u32 *)DISPLAY_A_BASE, _display_video_disp_controller_disable_config, 17);
|
||||||
exec_cfg((u32 *)DSI_BASE, _display_dsi_timing_deinit_config, 16);
|
exec_cfg((u32 *)DSI_BASE, _display_dsi_timing_deinit_config, 16);
|
||||||
|
usleep(10000);
|
||||||
if (_display_id != PANEL_SAM_AMS699VC01)
|
|
||||||
usleep(10000);
|
|
||||||
|
|
||||||
// De-initialize display panel.
|
// De-initialize display panel.
|
||||||
switch (_display_id)
|
switch (_display_id)
|
||||||
@@ -687,23 +579,16 @@ static void _display_panel_and_hw_end(bool no_panel_deinit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Blank - powerdown.
|
// Blank - powerdown.
|
||||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_ENTER_SLEEP_MODE,
|
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE, MIPI_DCS_ENTER_SLEEP_MODE, 50000);
|
||||||
(_display_id == PANEL_SAM_AMS699VC01) ? 120000 : 50000);
|
|
||||||
|
|
||||||
skip_panel_deinit:
|
skip_panel_deinit:
|
||||||
// Disable LCD power pins.
|
// Disable LCD power pins.
|
||||||
gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_LOW); // LCD Reset disable.
|
gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_LOW); // LCD Reset disable.
|
||||||
|
usleep(10000);
|
||||||
if (!nx_aula) // HOS uses panel id.
|
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_LOW); // LCD -5V disable.
|
||||||
{
|
usleep(10000);
|
||||||
usleep(10000);
|
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_LOW); // LCD +5V disable.
|
||||||
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_LOW); // LCD -5V disable.
|
usleep(10000);
|
||||||
usleep(10000);
|
|
||||||
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_LOW); // LCD +5V disable.
|
|
||||||
usleep(10000);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
usleep(30000); // Aula Panel.
|
|
||||||
|
|
||||||
// Disable Display Interface specific clocks.
|
// Disable Display Interface specific clocks.
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_SET) = BIT(CLK_H_MIPI_CAL) | BIT(CLK_H_DSI);
|
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_SET) = BIT(CLK_H_MIPI_CAL) | BIT(CLK_H_DSI);
|
||||||
@@ -716,12 +601,9 @@ skip_panel_deinit:
|
|||||||
DSI(_DSIREG(DSI_POWER_CONTROL)) = 0;
|
DSI(_DSIREG(DSI_POWER_CONTROL)) = 0;
|
||||||
|
|
||||||
// Switch LCD PWM backlight pin to special function mode and enable PWM0 mode.
|
// Switch LCD PWM backlight pin to special function mode and enable PWM0 mode.
|
||||||
if (!nx_aula)
|
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_SPIO); // Backlight PWM.
|
||||||
{
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_TRISTATE) | PINMUX_TRISTATE;
|
||||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_SPIO); // Backlight PWM.
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_FUNC_MASK) | 1; // Set PWM0 mode.
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_TRISTATE) | PINMUX_TRISTATE;
|
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_FUNC_MASK) | 1; // Set PWM0 mode.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_end() { _display_panel_and_hw_end(false); };
|
void display_end() { _display_panel_and_hw_end(false); };
|
||||||
@@ -733,18 +615,11 @@ u16 display_get_decoded_panel_id()
|
|||||||
|
|
||||||
void display_set_decoded_panel_id(u32 id)
|
void display_set_decoded_panel_id(u32 id)
|
||||||
{
|
{
|
||||||
// Get Hardware type, as it's used in various DI functions.
|
|
||||||
nx_aula = fuse_read_hw_type() == FUSE_NX_HW_TYPE_AULA;
|
|
||||||
|
|
||||||
// Decode Display ID.
|
// Decode Display ID.
|
||||||
_display_id = ((id >> 8) & 0xFF00) | (id & 0xFF);
|
_display_id = ((id >> 8) & 0xFF00) | (id & 0xFF);
|
||||||
|
|
||||||
if ((_display_id & 0xFF) == PANEL_JDI_XXX062M)
|
if ((_display_id & 0xFF) == PANEL_JDI_XXX062M)
|
||||||
_display_id = PANEL_JDI_XXX062M;
|
_display_id = PANEL_JDI_XXX062M;
|
||||||
|
|
||||||
// For Aula ensure that we have a compatible panel id.
|
|
||||||
if (nx_aula && _display_id == 0xCCCC)
|
|
||||||
_display_id = PANEL_SAM_AMS699VC01;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_color_screen(u32 color)
|
void display_color_screen(u32 color)
|
||||||
@@ -757,42 +632,41 @@ void display_color_screen(u32 color)
|
|||||||
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
||||||
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
|
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
|
||||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ;
|
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ;
|
||||||
usleep(35000); // No need to wait on Aula.
|
usleep(35000);
|
||||||
|
|
||||||
if (_display_id != PANEL_SAM_AMS699VC01)
|
display_backlight(true);
|
||||||
display_backlight(true);
|
|
||||||
else
|
|
||||||
display_backlight_brightness(255, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 *display_init_framebuffer_pitch()
|
u32 *display_init_framebuffer_pitch()
|
||||||
{
|
{
|
||||||
// Sanitize framebuffer area.
|
// Sanitize framebuffer area.
|
||||||
memset((u32 *)IPL_FB_ADDRESS, 0, IPL_FB_SZ);
|
memset((u32 *)IPL_FB_ADDRESS, 0, 0x3C0000);
|
||||||
|
|
||||||
// This configures the framebuffer @ IPL_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
// This configures the framebuffer @ IPL_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_pitch, 32);
|
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_pitch, 32);
|
||||||
//usleep(35000); // No need to wait on Aula.
|
usleep(35000);
|
||||||
|
|
||||||
return (u32 *)DISPLAY_A(_DIREG(DC_WINBUF_START_ADDR));
|
return (u32 *)IPL_FB_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 *display_init_framebuffer_pitch_inv()
|
u32 *display_init_framebuffer_pitch_inv()
|
||||||
{
|
{
|
||||||
// This configures the framebuffer @ NYX_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
// This configures the framebuffer @ NYX_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_pitch_inv, 34);
|
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_pitch_inv, 34);
|
||||||
//usleep(35000); // No need to wait on Aula.
|
|
||||||
|
|
||||||
return (u32 *)DISPLAY_A(_DIREG(DC_WINBUF_START_ADDR));
|
usleep(35000);
|
||||||
|
|
||||||
|
return (u32 *)NYX_FB_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 *display_init_framebuffer_block()
|
u32 *display_init_framebuffer_block()
|
||||||
{
|
{
|
||||||
// This configures the framebuffer @ NYX_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
// This configures the framebuffer @ NYX_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_block, 34);
|
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_block, 34);
|
||||||
//usleep(35000); // No need to wait on Aula.
|
|
||||||
|
|
||||||
return (u32 *)DISPLAY_A(_DIREG(DC_WINBUF_START_ADDR));
|
usleep(35000);
|
||||||
|
|
||||||
|
return (u32 *)NYX_FB_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 *display_init_framebuffer_log()
|
u32 *display_init_framebuffer_log()
|
||||||
@@ -800,7 +674,7 @@ u32 *display_init_framebuffer_log()
|
|||||||
// This configures the framebuffer @ LOG_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
// This configures the framebuffer @ LOG_FB_ADDRESS with a resolution of 1280x720 (line stride 720).
|
||||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_log, 20);
|
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer_log, 20);
|
||||||
|
|
||||||
return (u32 *)DISPLAY_A(_DIREG(DC_WINBUF_START_ADDR));
|
return (u32 *)LOG_FB_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_activate_console()
|
void display_activate_console()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -547,17 +547,17 @@
|
|||||||
#define MIPI_DCS_GET_DISPLAY_ID1 0xDA // GET_DISPLAY_ID Byte0, Module Manufacturer ID.
|
#define MIPI_DCS_GET_DISPLAY_ID1 0xDA // GET_DISPLAY_ID Byte0, Module Manufacturer ID.
|
||||||
#define MIPI_DCS_GET_DISPLAY_ID2 0xDB // GET_DISPLAY_ID Byte1, Module/Driver Version ID.
|
#define MIPI_DCS_GET_DISPLAY_ID2 0xDB // GET_DISPLAY_ID Byte1, Module/Driver Version ID.
|
||||||
#define MIPI_DCS_GET_DISPLAY_ID3 0xDC // GET_DISPLAY_ID Byte2, Module/Driver ID.
|
#define MIPI_DCS_GET_DISPLAY_ID3 0xDC // GET_DISPLAY_ID Byte2, Module/Driver ID.
|
||||||
#define MIPI_DCS_GET_NUM_ERRORS 0x05 // 1 byte.
|
#define MIPI_DCS_GET_NUM_ERRORS 0x05
|
||||||
#define MIPI_DCS_GET_RED_CHANNEL 0x06
|
#define MIPI_DCS_GET_RED_CHANNEL 0x06
|
||||||
#define MIPI_DCS_GET_GREEN_CHANNEL 0x07
|
#define MIPI_DCS_GET_GREEN_CHANNEL 0x07
|
||||||
#define MIPI_DCS_GET_BLUE_CHANNEL 0x08
|
#define MIPI_DCS_GET_BLUE_CHANNEL 0x08
|
||||||
#define MIPI_DCS_GET_DISPLAY_STATUS 0x09 // 4 bytes.
|
#define MIPI_DCS_GET_DISPLAY_STATUS 0x09
|
||||||
#define MIPI_DCS_GET_POWER_MODE 0x0A // 1 byte. 2: DISON, 3: NORON, 4: SLPOUT, 7: BSTON.
|
#define MIPI_DCS_GET_POWER_MODE 0x0A
|
||||||
#define MIPI_DCS_GET_ADDRESS_MODE 0x0B // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR.
|
#define MIPI_DCS_GET_ADDRESS_MODE 0x0B
|
||||||
#define MIPI_DCS_GET_PIXEL_FORMAT 0x0C // 1 byte. 4-6: DPI.
|
#define MIPI_DCS_GET_PIXEL_FORMAT 0x0C
|
||||||
#define MIPI_DCS_GET_DISPLAY_MODE 0x0D // 1 byte. 0-2: GCS, 3: ALLPOFF, 4: ALLPON, 5: INVON.
|
#define MIPI_DCS_GET_DISPLAY_MODE 0x0D
|
||||||
#define MIPI_DCS_GET_SIGNAL_MODE 0x0E // 1 byte. 0: EODSI, 2: DEON, 3: PCLKON, 4: VSON, 5: HSON, 7: TEON.
|
#define MIPI_DCS_GET_SIGNAL_MODE 0x0E
|
||||||
#define MIPI_DCS_GET_DIAGNOSTIC_RESULT 0x0F // 1 byte. 6: FUNDT, 7: REGLD.
|
#define MIPI_DCS_GET_DIAGNOSTIC_RESULT 0x0F
|
||||||
#define MIPI_DCS_ENTER_SLEEP_MODE 0x10
|
#define MIPI_DCS_ENTER_SLEEP_MODE 0x10
|
||||||
#define MIPI_DCS_EXIT_SLEEP_MODE 0x11
|
#define MIPI_DCS_EXIT_SLEEP_MODE 0x11
|
||||||
#define MIPI_DCS_ENTER_PARTIAL_MODE 0x12
|
#define MIPI_DCS_ENTER_PARTIAL_MODE 0x12
|
||||||
@@ -567,7 +567,7 @@
|
|||||||
#define MIPI_DCS_ALL_PIXELS_OFF 0x22
|
#define MIPI_DCS_ALL_PIXELS_OFF 0x22
|
||||||
#define MIPI_DCS_ALL_PIXELS_ON 0x23
|
#define MIPI_DCS_ALL_PIXELS_ON 0x23
|
||||||
#define MIPI_DCS_SET_CONTRAST 0x25 // VCON in 40mV steps. 7-bit integer.
|
#define MIPI_DCS_SET_CONTRAST 0x25 // VCON in 40mV steps. 7-bit integer.
|
||||||
#define MIPI_DCS_SET_GAMMA_CURVE 0x26 // 1 byte. 0-7: GC.
|
#define MIPI_DCS_SET_GAMMA_CURVE 0x26
|
||||||
#define MIPI_DCS_SET_DISPLAY_OFF 0x28
|
#define MIPI_DCS_SET_DISPLAY_OFF 0x28
|
||||||
#define MIPI_DCS_SET_DISPLAY_ON 0x29
|
#define MIPI_DCS_SET_DISPLAY_ON 0x29
|
||||||
#define MIPI_DCS_SET_COLUMN_ADDRESS 0x2A
|
#define MIPI_DCS_SET_COLUMN_ADDRESS 0x2A
|
||||||
@@ -580,11 +580,11 @@
|
|||||||
#define MIPI_DCS_SET_SCROLL_AREA 0x33
|
#define MIPI_DCS_SET_SCROLL_AREA 0x33
|
||||||
#define MIPI_DCS_SET_TEAR_OFF 0x34
|
#define MIPI_DCS_SET_TEAR_OFF 0x34
|
||||||
#define MIPI_DCS_SET_TEAR_ON 0x35
|
#define MIPI_DCS_SET_TEAR_ON 0x35
|
||||||
#define MIPI_DCS_SET_ADDRESS_MODE 0x36 // Display Access Control. 1 byte. 0: GS, 1: SS, 3: BGR.
|
#define MIPI_DCS_SET_ADDRESS_MODE 0x36
|
||||||
#define MIPI_DCS_SET_SCROLL_START 0x37
|
#define MIPI_DCS_SET_SCROLL_START 0x37
|
||||||
#define MIPI_DCS_EXIT_IDLE_MODE 0x38
|
#define MIPI_DCS_EXIT_IDLE_MODE 0x38
|
||||||
#define MIPI_DCS_ENTER_IDLE_MODE 0x39
|
#define MIPI_DCS_ENTER_IDLE_MODE 0x39
|
||||||
#define MIPI_DCS_SET_PIXEL_FORMAT 0x3A // 1 byte. 4-6: DPI.
|
#define MIPI_DCS_SET_PIXEL_FORMAT 0x3A
|
||||||
#define MIPI_DCS_WRITE_MEMORY_CONTINUE 0x3C
|
#define MIPI_DCS_WRITE_MEMORY_CONTINUE 0x3C
|
||||||
#define MIPI_DCS_READ_MEMORY_CONTINUE 0x3E
|
#define MIPI_DCS_READ_MEMORY_CONTINUE 0x3E
|
||||||
#define MIPI_DCS_GET_3D_CONTROL 0x3F
|
#define MIPI_DCS_GET_3D_CONTROL 0x3F
|
||||||
@@ -593,34 +593,26 @@
|
|||||||
#define MIPI_DCS_GET_SCANLINE 0x45
|
#define MIPI_DCS_GET_SCANLINE 0x45
|
||||||
#define MIPI_DCS_SET_TEAR_SCANLINE_WIDTH 0x46
|
#define MIPI_DCS_SET_TEAR_SCANLINE_WIDTH 0x46
|
||||||
#define MIPI_DCS_GET_SCANLINE_WIDTH 0x47
|
#define MIPI_DCS_GET_SCANLINE_WIDTH 0x47
|
||||||
#define MIPI_DCS_SET_BRIGHTNESS 0x51 // DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL. 1 byte. 0-7: DBV.
|
#define MIPI_DCS_SET_BRIGHTNESS 0x51 // DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL.
|
||||||
#define MIPI_DCS_GET_BRIGHTNESS 0x52 // 1 byte. 0-7: DBV.
|
#define MIPI_DCS_GET_BRIGHTNESS 0x52
|
||||||
#define MIPI_DCS_SET_CONTROL_DISPLAY 0x53 // 1 byte. 2: BL, 3: DD, 5: BCTRL.
|
#define MIPI_DCS_SET_CONTROL_DISPLAY 0x53
|
||||||
#define MIPI_DCS_GET_CONTROL_DISPLAY 0x54 // 1 byte. 2: BL, 3: DD, 5: BCTRL.
|
#define MIPI_DCS_GET_CONTROL_DISPLAY 0x54
|
||||||
#define MIPI_DCS_SET_CABC_VALUE 0x55 // 1 byte. 0-32: C, 4-7: C.
|
#define MIPI_DCS_SET_CABC_VALUE 0x55
|
||||||
#define MIPI_DCS_GET_CABC_VALUE 0x56 // 1 byte. 0-32: C, 4-7: C.
|
#define MIPI_DCS_GET_CABC_VALUE 0x56
|
||||||
#define MIPI_DCS_SET_CABC_MIN_BRI 0x5E // 1 byte. 0-7: CMB.
|
#define MIPI_DCS_SET_CABC_MIN_BRI 0x5E
|
||||||
#define MIPI_DCS_GET_CABC_MIN_BRI 0x5F // 1 byte. 0-7: CMB.
|
#define MIPI_DCS_GET_CABC_MIN_BRI 0x5F
|
||||||
#define MIPI_DCS_GET_AUTO_BRI_DIAG_RES 0x68 // 1 byte. 6-7: D.
|
|
||||||
#define MIPI_DCS_READ_DDB_START 0xA1
|
#define MIPI_DCS_READ_DDB_START 0xA1
|
||||||
#define MIPI_DCS_READ_DDB_CONTINUE 0xA8 // 0x100 size.
|
#define MIPI_DCS_READ_DDB_CONTINUE 0xA8
|
||||||
|
|
||||||
/*! MIPI DCS Panel Private CMDs. */
|
/*! MIPI DCS Panel Private CMDs. */
|
||||||
#define MIPI_DCS_PRIV_UNK_A0 0xA0
|
#define MIPI_DCS_PRIV_UNK_A0 0xA0
|
||||||
#define MIPI_DCS_PRIV_SET_POWER_CONTROL 0xB1
|
#define MIPI_DCS_PRIV_SET_POWER_CONTROL 0xB1
|
||||||
#define MIPI_DCS_PRIV_SET_EXTC 0xB9 // Enable extended commands.
|
#define MIPI_DCS_PRIV_SET_EXTC 0xB9
|
||||||
#define MIPI_DCS_PRIV_UNK_BD 0xBD
|
#define MIPI_DCS_PRIV_UNK_BD 0xBD
|
||||||
#define MIPI_DCS_PRIV_UNK_D5 0xD5
|
#define MIPI_DCS_PRIV_UNK_D5 0xD5
|
||||||
#define MIPI_DCS_PRIV_UNK_D6 0xD6
|
#define MIPI_DCS_PRIV_UNK_D6 0xD6
|
||||||
#define MIPI_DCS_PRIV_UNK_D8 0xD8
|
#define MIPI_DCS_PRIV_UNK_D8 0xD8
|
||||||
#define MIPI_DCS_PRIV_UNK_D9 0xD9
|
#define MIPI_DCS_PRIV_UNK_D9 0xD9
|
||||||
#define MIPI_DCS_PRIV_READ_EXTC_CMD_SPI 0xFE // Read EXTC Command In SPI. 1 byte. 0-6: EXT_SPI_CNT, 7:EXT_SP.
|
|
||||||
#define MIPI_DCS_PRIV_SET_EXTC_CMD_REG 0xFF // EXTC Command Set enable register. 5 bytes. Pass: FF 98 06 04, PAGE.
|
|
||||||
|
|
||||||
/*! MIPI DCS Panel Private CMDs PAGE 1. */
|
|
||||||
#define MIPI_DCS_PRIV_GET_DISPLAY_ID4 0x00
|
|
||||||
#define MIPI_DCS_PRIV_GET_DISPLAY_ID5 0x01
|
|
||||||
#define MIPI_DCS_PRIV_GET_DISPLAY_ID6 0x02
|
|
||||||
|
|
||||||
/*! MIPI DCS CMD Defines. */
|
/*! MIPI DCS CMD Defines. */
|
||||||
#define DCS_POWER_MODE_DISPLAY_ON BIT(2)
|
#define DCS_POWER_MODE_DISPLAY_ON BIT(2)
|
||||||
@@ -652,30 +644,21 @@
|
|||||||
#define DCS_CONTROL_DISPLAY_DIMMING_CTRL BIT(3)
|
#define DCS_CONTROL_DISPLAY_DIMMING_CTRL BIT(3)
|
||||||
#define DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL BIT(5)
|
#define DCS_CONTROL_DISPLAY_BRIGHTNESS_CTRL BIT(5)
|
||||||
|
|
||||||
#define PANEL_OLED_BL_COEFF 82 // 82%.
|
|
||||||
#define PANEL_OLED_BL_OFFSET 45 // Least legible backlight duty.
|
|
||||||
|
|
||||||
/* Switch Panels:
|
/* Switch Panels:
|
||||||
*
|
*
|
||||||
* 6.2" panels for Icosa and Iowa SKUs:
|
* 6.2" panels for Icosa and Iowa skus:
|
||||||
* [10] 81 [26]: JDI LPM062M326A
|
* [10] 81 [26]: JDI LPM062M326A
|
||||||
* [10] 96 [09]: JDI LAM062M109A
|
* [10] 96 [09]: JDI LAM062M109A
|
||||||
* [20] 93 [0F]: InnoLux P062CCA-AZ1 (Rev A1)
|
* [20] 93 [0F]: InnoLux P062CCA-AZ1 (Rev A1)
|
||||||
* [20] 95 [0F]: InnoLux P062CCA-AZ2 (Rev B1)
|
* [20] 95 [0F]: InnoLux P062CCA-AZ2
|
||||||
* [20] 96 [0F]: InnoLux P062CCA-AZ3 [UNCONFIRMED MODEL REV]
|
* [20] 96 [0F]: InnoLux P062CCA-AZ3
|
||||||
* [20] 97 [0F]: InnoLux P062CCA-??? [UNCONFIRMED MODEL REV]
|
|
||||||
* [20] 98 [0F]: InnoLux P062CCA-??? [UNCONFIRMED MODEL REV]
|
|
||||||
* [30] 94 [0F]: AUO A062TAN01 (59.06A33.001)
|
* [30] 94 [0F]: AUO A062TAN01 (59.06A33.001)
|
||||||
* [30] 95 [0F]: AUO A062TAN02 (59.06A33.002)
|
* [30] 95 [0F]: AUO A062TAN02 (59.06A33.002)
|
||||||
* [30] XX [0F]: AUO A062TAN03 (59.06A33.003) [UNCONFIRMED ID]
|
|
||||||
*
|
*
|
||||||
* 5.5" panels for Hoag SKUs:
|
* 5.5" panels for Hoag skus:
|
||||||
* [20] 94 [10]: InnoLux 2J055IA-27A (Rev B1)
|
* [20] 94 [10]: InnoLux 2J055IA-27A (Rev B1)
|
||||||
* [30] 93 [10]: AUO A055TAN01 (59.05A30.001)
|
* [30] XX [10]: AUO A055TAN01 (59.05A30.001) [UNCONFIRMED ID]
|
||||||
* [40] XX [10]: Vendor 40 [UNCONFIRMED ID]
|
* [40] XX [10]: Vendor 40 [UNCONFIRMED ID]
|
||||||
*
|
|
||||||
* 7.0" OLED panels for Aula SKUs:
|
|
||||||
* [50] 9B [20]: Samsung AMS699VC01-0 (Rev 2.5)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Display ID Decoding:
|
/* Display ID Decoding:
|
||||||
@@ -688,13 +671,13 @@
|
|||||||
* 10h: Japan Display Inc.
|
* 10h: Japan Display Inc.
|
||||||
* 20h: InnoLux Corporation
|
* 20h: InnoLux Corporation
|
||||||
* 30h: AU Optronics
|
* 30h: AU Optronics
|
||||||
* 40h: Unknown0
|
* 40h: Unknown1
|
||||||
* 50h: Samsung
|
* 50h: Unknown2 (OLED? Samsung? LG?)
|
||||||
*
|
*
|
||||||
* Boards, Panel Size:
|
* Boards, Panel Size:
|
||||||
* 0Fh: Icosa/Iowa, 6.2"
|
* 0Fh: Icosa/Iowa, 6.2"
|
||||||
* 10h: Hoag, 5.5"
|
* 10h: Hoag, 5.5"
|
||||||
* 20h: Aula, 7.0"
|
* 20h: Unknown, x.x"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -706,8 +689,7 @@ enum
|
|||||||
PANEL_AUO_A062TAN01 = 0x0F30,
|
PANEL_AUO_A062TAN01 = 0x0F30,
|
||||||
PANEL_INL_2J055IA_27A = 0x1020,
|
PANEL_INL_2J055IA_27A = 0x1020,
|
||||||
PANEL_AUO_A055TAN01 = 0x1030,
|
PANEL_AUO_A055TAN01 = 0x1030,
|
||||||
PANEL_V40_55_UNK = 0x1040,
|
PANEL_V40_55_UNK = 0x1040
|
||||||
PANEL_SAM_AMS699VC01 = 0x2050
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void display_init();
|
void display_init();
|
||||||
@@ -724,7 +706,6 @@ void display_color_screen(u32 color);
|
|||||||
/*! Switches screen backlight ON/OFF. */
|
/*! Switches screen backlight ON/OFF. */
|
||||||
void display_backlight(bool enable);
|
void display_backlight(bool enable);
|
||||||
void display_backlight_brightness(u32 brightness, u32 step_delay);
|
void display_backlight_brightness(u32 brightness, u32 step_delay);
|
||||||
u32 display_get_backlight_brightness();
|
|
||||||
|
|
||||||
/*! Init display in full 1280x720 resolution (B8G8R8A8, line stride 768, framebuffer size = 1280*768*4 bytes). */
|
/*! Init display in full 1280x720 resolution (B8G8R8A8, line stride 768, framebuffer size = 1280*768*4 bytes). */
|
||||||
u32 *display_init_framebuffer_pitch();
|
u32 *display_init_framebuffer_pitch();
|
||||||
|
|||||||
@@ -200,10 +200,10 @@ static const cfg_op_t _display_dsi_init_config_part6[14] = {
|
|||||||
|
|
||||||
//DSI panel config.
|
//DSI panel config.
|
||||||
static const cfg_op_t _display_init_config_jdi[43] = {
|
static const cfg_op_t _display_init_config_jdi[43] = {
|
||||||
{DSI_WR_DATA, 0x0439}, // MIPI_DSI_DCS_LONG_WRITE: 4 bytes.
|
{DSI_WR_DATA, 0x439}, // MIPI_DSI_DCS_LONG_WRITE: 4 bytes.
|
||||||
{DSI_WR_DATA, 0x9483FFB9}, // MIPI_DCS_PRIV_SET_EXTC. (Pass: FF 83 94).
|
{DSI_WR_DATA, 0x9483FFB9}, // MIPI_DCS_PRIV_SET_EXTC. (Pass: FF 83 94).
|
||||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||||
{DSI_WR_DATA, 0xBD15}, // MIPI_DSI_DCS_SHORT_WRITE_PARAM: 0 to 0xBD.
|
{DSI_WR_DATA, 0x00BD15}, // MIPI_DSI_DCS_SHORT_WRITE_PARAM: 0 to 0xBD.
|
||||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||||
{DSI_WR_DATA, 0x1939}, // MIPI_DSI_DCS_LONG_WRITE: 25 bytes.
|
{DSI_WR_DATA, 0x1939}, // MIPI_DSI_DCS_LONG_WRITE: 25 bytes.
|
||||||
{DSI_WR_DATA, 0xAAAAAAD8}, // Register: 0xD8.
|
{DSI_WR_DATA, 0xAAAAAAD8}, // Register: 0xD8.
|
||||||
|
|||||||
@@ -17,12 +17,8 @@
|
|||||||
#ifndef _FATFS_CFG_H_
|
#ifndef _FATFS_CFG_H_
|
||||||
#define _FATFS_CFG_H_
|
#define _FATFS_CFG_H_
|
||||||
|
|
||||||
// define FFCFG_INC in a project to use a specific FatFS configuration.
|
|
||||||
// Example: FFCFG_INC := '"../$(PROJECT_DIR)/libs/fatfs/ffconf.h"'
|
|
||||||
#ifdef FFCFG_INC
|
#ifdef FFCFG_INC
|
||||||
#include FFCFG_INC
|
#include FFCFG_INC
|
||||||
#else
|
|
||||||
#include "fatfs_conf.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
305
bdk/fatfs_conf.h
305
bdk/fatfs_conf.h
@@ -1,305 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------/
|
|
||||||
/ FatFs Functional Configurations
|
|
||||||
/---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define FFCONF_DEF 86604 /* Revision ID */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------/
|
|
||||||
/ Function Configurations
|
|
||||||
/---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define FF_FS_READONLY 0
|
|
||||||
/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
|
|
||||||
/ Read-only configuration removes writing API functions, f_write(), f_sync(),
|
|
||||||
/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
|
|
||||||
/ and optional writing functions as well. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_FS_MINIMIZE 0
|
|
||||||
/* This option defines minimization level to remove some basic API functions.
|
|
||||||
/
|
|
||||||
/ 0: Basic functions are fully enabled.
|
|
||||||
/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()
|
|
||||||
/ are removed.
|
|
||||||
/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
|
|
||||||
/ 3: f_lseek() function is removed in addition to 2. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_STRFUNC 2
|
|
||||||
/* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf().
|
|
||||||
/
|
|
||||||
/ 0: Disable string functions.
|
|
||||||
/ 1: Enable without LF-CRLF conversion.
|
|
||||||
/ 2: Enable with LF-CRLF conversion. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_FIND 1
|
|
||||||
/* This option switches filtered directory read functions, f_findfirst() and
|
|
||||||
/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_MKFS 0
|
|
||||||
/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */
|
|
||||||
|
|
||||||
#if FF_USE_MKFS
|
|
||||||
#define FF_MKFS_LABEL "SWITCH SD "
|
|
||||||
#endif
|
|
||||||
/* This sets FAT/FAT32 label. Exactly 11 characters, all caps. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_FASTSEEK 0
|
|
||||||
/* This option switches fast seek function. (0:Disable or 1:Enable) */
|
|
||||||
|
|
||||||
#define FF_FASTFS 0
|
|
||||||
#if FF_FASTFS
|
|
||||||
#undef FF_USE_FASTSEEK
|
|
||||||
#define FF_USE_FASTSEEK 1
|
|
||||||
#endif
|
|
||||||
/* This option switches fast access to chained clusters. (0:Disable or 1:Enable) */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_SIMPLE_GPT 1
|
|
||||||
/* This option switches support for the first GPT partition. (0:Disable or 1:Enable) */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_EXPAND 0
|
|
||||||
/* This option switches f_expand function. (0:Disable or 1:Enable) */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_CHMOD 1
|
|
||||||
/* This option switches attribute manipulation functions, f_chmod() and f_utime().
|
|
||||||
/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_LABEL 0
|
|
||||||
/* This option switches volume label functions, f_getlabel() and f_setlabel().
|
|
||||||
/ (0:Disable or 1:Enable) */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_FORWARD 0
|
|
||||||
/* This option switches f_forward() function. (0:Disable or 1:Enable) */
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------/
|
|
||||||
/ Locale and Namespace Configurations
|
|
||||||
/---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define FF_CODE_PAGE 850
|
|
||||||
/* This option specifies the OEM code page to be used on the target system.
|
|
||||||
/ Incorrect code page setting can cause a file open failure.
|
|
||||||
/
|
|
||||||
/ 437 - U.S.
|
|
||||||
/ 720 - Arabic
|
|
||||||
/ 737 - Greek
|
|
||||||
/ 771 - KBL
|
|
||||||
/ 775 - Baltic
|
|
||||||
/ 850 - Latin 1
|
|
||||||
/ 852 - Latin 2
|
|
||||||
/ 855 - Cyrillic
|
|
||||||
/ 857 - Turkish
|
|
||||||
/ 860 - Portuguese
|
|
||||||
/ 861 - Icelandic
|
|
||||||
/ 862 - Hebrew
|
|
||||||
/ 863 - Canadian French
|
|
||||||
/ 864 - Arabic
|
|
||||||
/ 865 - Nordic
|
|
||||||
/ 866 - Russian
|
|
||||||
/ 869 - Greek 2
|
|
||||||
/ 932 - Japanese (DBCS)
|
|
||||||
/ 936 - Simplified Chinese (DBCS)
|
|
||||||
/ 949 - Korean (DBCS)
|
|
||||||
/ 950 - Traditional Chinese (DBCS)
|
|
||||||
/ 0 - Include all code pages above and configured by f_setcp()
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_LFN 3
|
|
||||||
#define FF_MAX_LFN 255
|
|
||||||
/* The FF_USE_LFN switches the support for LFN (long file name).
|
|
||||||
/
|
|
||||||
/ 0: Disable LFN. FF_MAX_LFN has no effect.
|
|
||||||
/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
|
|
||||||
/ 2: Enable LFN with dynamic working buffer on the STACK.
|
|
||||||
/ 3: Enable LFN with dynamic working buffer on the HEAP.
|
|
||||||
/
|
|
||||||
/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function
|
|
||||||
/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and
|
|
||||||
/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled.
|
|
||||||
/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can
|
|
||||||
/ be in range of 12 to 255. It is recommended to be set 255 to fully support LFN
|
|
||||||
/ specification.
|
|
||||||
/ When use stack for the working buffer, take care on stack overflow. When use heap
|
|
||||||
/ memory for the working buffer, memory management functions, ff_memalloc() and
|
|
||||||
/ ff_memfree() in ffsystem.c, need to be added to the project. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_LFN_UNICODE 0
|
|
||||||
/* This option switches the character encoding on the API when LFN is enabled.
|
|
||||||
/
|
|
||||||
/ 0: ANSI/OEM in current CP (TCHAR = char)
|
|
||||||
/ 1: Unicode in UTF-16 (TCHAR = WCHAR)
|
|
||||||
/ 2: Unicode in UTF-8 (TCHAR = char)
|
|
||||||
/ 3: Unicode in UTF-32 (TCHAR = DWORD)
|
|
||||||
/
|
|
||||||
/ Also behavior of string I/O functions will be affected by this option.
|
|
||||||
/ When LFN is not enabled, this option has no effect. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_LFN_BUF 255
|
|
||||||
#define FF_SFN_BUF 12
|
|
||||||
/* This set of options defines size of file name members in the FILINFO structure
|
|
||||||
/ which is used to read out directory items. These values should be suffcient for
|
|
||||||
/ the file names to read. The maximum possible length of the read file name depends
|
|
||||||
/ on character encoding. When LFN is not enabled, these options have no effect. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_STRF_ENCODE 0
|
|
||||||
/* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(),
|
|
||||||
/ f_putc(), f_puts and f_printf() convert the character encoding in it.
|
|
||||||
/ This option selects assumption of character encoding ON THE FILE to be
|
|
||||||
/ read/written via those functions.
|
|
||||||
/
|
|
||||||
/ 0: ANSI/OEM in current CP
|
|
||||||
/ 1: Unicode in UTF-16LE
|
|
||||||
/ 2: Unicode in UTF-16BE
|
|
||||||
/ 3: Unicode in UTF-8
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_FS_RPATH 0
|
|
||||||
/* This option configures support for relative path.
|
|
||||||
/
|
|
||||||
/ 0: Disable relative path and remove related functions.
|
|
||||||
/ 1: Enable relative path. f_chdir() and f_chdrive() are available.
|
|
||||||
/ 2: f_getcwd() function is available in addition to 1.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------/
|
|
||||||
/ Drive/Volume Configurations
|
|
||||||
/---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define FF_VOLUMES 1
|
|
||||||
/* Number of volumes (logical drives) to be used. (1-10) */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_STR_VOLUME_ID 0
|
|
||||||
#define FF_VOLUME_STRS "sd"
|
|
||||||
/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings.
|
|
||||||
/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive
|
|
||||||
/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each
|
|
||||||
/ logical drives. Number of items must not be less than FF_VOLUMES. Valid
|
|
||||||
/ characters for the volume ID strings are A-Z, a-z and 0-9, however, they are
|
|
||||||
/ compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is
|
|
||||||
/ not defined, a user defined volume string table needs to be defined as:
|
|
||||||
/
|
|
||||||
/ const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",...
|
|
||||||
/ Order is important. Any change to order, must also be reflected to diskio drive enum.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_MULTI_PARTITION 0
|
|
||||||
/* This option switches support for multiple volumes on the physical drive.
|
|
||||||
/ By default (0), each logical drive number is bound to the same physical drive
|
|
||||||
/ number and only an FAT volume found on the physical drive will be mounted.
|
|
||||||
/ When this function is enabled (1), each logical drive number can be bound to
|
|
||||||
/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()
|
|
||||||
/ funciton will be available. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_MIN_SS 512
|
|
||||||
#define FF_MAX_SS 512
|
|
||||||
/* This set of options configures the range of sector size to be supported. (512,
|
|
||||||
/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and
|
|
||||||
/ harddisk. But a larger value may be required for on-board flash memory and some
|
|
||||||
/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured
|
|
||||||
/ for variable sector size mode and disk_ioctl() function needs to implement
|
|
||||||
/ GET_SECTOR_SIZE command. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_USE_TRIM 0
|
|
||||||
/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable)
|
|
||||||
/ To enable Trim function, also CTRL_TRIM command should be implemented to the
|
|
||||||
/ disk_ioctl() function. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_FS_NOFSINFO 1
|
|
||||||
/* If you need to know correct free space on the FAT32 volume, set bit 0 of this
|
|
||||||
/ option, and f_getfree() function at first time after volume mount will force
|
|
||||||
/ a full FAT scan. Bit 1 controls the use of last allocated cluster number.
|
|
||||||
/
|
|
||||||
/ bit0=0: Use free cluster count in the FSINFO if available.
|
|
||||||
/ bit0=1: Do not trust free cluster count in the FSINFO.
|
|
||||||
/ bit1=0: Use last allocated cluster number in the FSINFO if available.
|
|
||||||
/ bit1=1: Do not trust last allocated cluster number in the FSINFO.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------/
|
|
||||||
/ System Configurations
|
|
||||||
/---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define FF_FS_TINY 0
|
|
||||||
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
|
|
||||||
/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
|
|
||||||
/ Instead of private sector buffer eliminated from the file object, common sector
|
|
||||||
/ buffer in the filesystem object (FATFS) is used for the file data transfer. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_FS_EXFAT 1
|
|
||||||
/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable)
|
|
||||||
/ To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1)
|
|
||||||
/ Note that enabling exFAT discards ANSI C (C89) compatibility. */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_FS_NORTC 1
|
|
||||||
#define FF_NORTC_MON 1
|
|
||||||
#define FF_NORTC_MDAY 1
|
|
||||||
#define FF_NORTC_YEAR 2022
|
|
||||||
/* The option FF_FS_NORTC switches timestamp function. If the system does not have
|
|
||||||
/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable
|
|
||||||
/ the timestamp function. Every object modified by FatFs will have a fixed timestamp
|
|
||||||
/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time.
|
|
||||||
/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be
|
|
||||||
/ added to the project to read current time form real-time clock. FF_NORTC_MON,
|
|
||||||
/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect.
|
|
||||||
/ These options have no effect at read-only configuration (FF_FS_READONLY = 1). */
|
|
||||||
|
|
||||||
|
|
||||||
#define FF_FS_LOCK 0
|
|
||||||
/* The option FF_FS_LOCK switches file lock function to control duplicated file open
|
|
||||||
/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY
|
|
||||||
/ is 1.
|
|
||||||
/
|
|
||||||
/ 0: Disable file lock function. To avoid volume corruption, application program
|
|
||||||
/ should avoid illegal open, remove and rename to the open objects.
|
|
||||||
/ >0: Enable file lock function. The value defines how many files/sub-directories
|
|
||||||
/ can be opened simultaneously under file lock control. Note that the file
|
|
||||||
/ lock control is independent of re-entrancy. */
|
|
||||||
|
|
||||||
|
|
||||||
/* #include <somertos.h> // O/S definitions */
|
|
||||||
#define FF_FS_REENTRANT 0
|
|
||||||
#define FF_FS_TIMEOUT 1000
|
|
||||||
#define FF_SYNC_t HANDLE
|
|
||||||
/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
|
|
||||||
/ module itself. Note that regardless of this option, file access to different
|
|
||||||
/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
|
|
||||||
/ and f_fdisk() function, are always not re-entrant. Only file/directory access
|
|
||||||
/ to the same volume is under control of this function.
|
|
||||||
/
|
|
||||||
/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect.
|
|
||||||
/ 1: Enable re-entrancy. Also user provided synchronization handlers,
|
|
||||||
/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()
|
|
||||||
/ function, must be added to the project. Samples are available in
|
|
||||||
/ option/syscall.c.
|
|
||||||
/
|
|
||||||
/ The FF_FS_TIMEOUT defines timeout period in unit of time tick.
|
|
||||||
/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,
|
|
||||||
/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be
|
|
||||||
/ included somewhere in the scope of ff.h. */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*--- End of configuration options ---*/
|
|
||||||
@@ -29,34 +29,33 @@
|
|||||||
|
|
||||||
#ifndef ELF_H
|
#ifndef ELF_H
|
||||||
#define ELF_H
|
#define ELF_H
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <utils/types.h>
|
typedef uint8_t Elf_Byte;
|
||||||
|
|
||||||
typedef u8 Elf_Byte;
|
typedef uint32_t Elf32_Addr; /* Unsigned program address */
|
||||||
|
typedef uint32_t Elf32_Off; /* Unsigned file offset */
|
||||||
|
typedef int32_t Elf32_Sword; /* Signed large integer */
|
||||||
|
typedef uint32_t Elf32_Word; /* Unsigned large integer */
|
||||||
|
typedef uint16_t Elf32_Half; /* Unsigned medium integer */
|
||||||
|
|
||||||
typedef u32 Elf32_Addr; /* Unsigned program address */
|
typedef uint64_t Elf64_Addr;
|
||||||
typedef u32 Elf32_Off; /* Unsigned file offset */
|
typedef uint64_t Elf64_Off;
|
||||||
typedef s32 Elf32_Sword; /* Signed large integer */
|
typedef int32_t Elf64_Shalf;
|
||||||
typedef u32 Elf32_Word; /* Unsigned large integer */
|
|
||||||
typedef u16 Elf32_Half; /* Unsigned medium integer */
|
|
||||||
|
|
||||||
typedef u64 Elf64_Addr;
|
|
||||||
typedef u64 Elf64_Off;
|
|
||||||
typedef s32 Elf64_Shalf;
|
|
||||||
|
|
||||||
#ifdef __alpha__
|
#ifdef __alpha__
|
||||||
typedef s64 Elf64_Sword;
|
typedef int64_t Elf64_Sword;
|
||||||
typedef u64 Elf64_Word;
|
typedef uint64_t Elf64_Word;
|
||||||
#else
|
#else
|
||||||
typedef s32 Elf64_Sword;
|
typedef int32_t Elf64_Sword;
|
||||||
typedef u32 Elf64_Word;
|
typedef uint32_t Elf64_Word;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef s64 Elf64_Sxword;
|
typedef int64_t Elf64_Sxword;
|
||||||
typedef u64 Elf64_Xword;
|
typedef uint64_t Elf64_Xword;
|
||||||
|
|
||||||
typedef u32 Elf64_Half;
|
typedef uint32_t Elf64_Half;
|
||||||
typedef u16 Elf64_Quarter;
|
typedef uint16_t Elf64_Quarter;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* e_ident[] identification indexes
|
* e_ident[] identification indexes
|
||||||
@@ -377,7 +376,7 @@ typedef struct
|
|||||||
|
|
||||||
#define ELF64_R_SYM(info) ((info) >> 32)
|
#define ELF64_R_SYM(info) ((info) >> 32)
|
||||||
#define ELF64_R_TYPE(info) ((info)&0xFFFFFFFF)
|
#define ELF64_R_TYPE(info) ((info)&0xFFFFFFFF)
|
||||||
#define ELF64_R_INFO(s, t) (((s) << 32) + (u32)(t))
|
#define ELF64_R_INFO(s, t) (((s) << 32) + (__uint32_t)(t))
|
||||||
|
|
||||||
#if defined(__mips64__) && defined(__MIPSEL__)
|
#if defined(__mips64__) && defined(__MIPSEL__)
|
||||||
/*
|
/*
|
||||||
@@ -390,7 +389,7 @@ typedef struct
|
|||||||
#undef ELF64_R_INFO
|
#undef ELF64_R_INFO
|
||||||
#define ELF64_R_TYPE(info) (swap32((info) >> 32))
|
#define ELF64_R_TYPE(info) (swap32((info) >> 32))
|
||||||
#define ELF64_R_SYM(info) ((info)&0xFFFFFFFF)
|
#define ELF64_R_SYM(info) ((info)&0xFFFFFFFF)
|
||||||
#define ELF64_R_INFO(s, t) (((u64)swap32(t) << 32) + (u32)(s))
|
#define ELF64_R_INFO(s, t) (((__uint64_t)swap32(t) << 32) + (__uint32_t)(s))
|
||||||
#endif /* __mips64__ && __MIPSEL__ */
|
#endif /* __mips64__ && __MIPSEL__ */
|
||||||
|
|
||||||
/* Program Header */
|
/* Program Header */
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ el_status el_pread(el_ctx *ctx, void *def, size_t nb, size_t offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define EL_PHOFF(ctx, num) (((ctx)->ehdr.e_phoff + (num) *(ctx)->ehdr.e_phentsize))
|
#define EL_PHOFF(ctx, num) (((ctx)->ehdr.e_phoff + (num) *(ctx)->ehdr.e_phentsize))
|
||||||
el_status el_findphdr(el_ctx *ctx, Elf_Phdr *phdr, u32 type, unsigned *i)
|
el_status el_findphdr(el_ctx *ctx, Elf_Phdr *phdr, uint32_t type, unsigned *i)
|
||||||
{
|
{
|
||||||
el_status rv = EL_OK;
|
el_status rv = EL_OK;
|
||||||
for (; *i < ctx->ehdr.e_phnum; (*i)++)
|
for (; *i < ctx->ehdr.e_phnum; (*i)++)
|
||||||
@@ -44,7 +44,7 @@ el_status el_findphdr(el_ctx *ctx, Elf_Phdr *phdr, u32 type, unsigned *i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define EL_SHOFF(ctx, num) (((ctx)->ehdr.e_shoff + (num) *(ctx)->ehdr.e_shentsize))
|
#define EL_SHOFF(ctx, num) (((ctx)->ehdr.e_shoff + (num) *(ctx)->ehdr.e_shentsize))
|
||||||
el_status el_findshdr(el_ctx *ctx, Elf_Shdr *shdr, u32 type, unsigned *i)
|
el_status el_findshdr(el_ctx *ctx, Elf_Shdr *shdr, uint32_t type, unsigned *i)
|
||||||
{
|
{
|
||||||
el_status rv = EL_OK;
|
el_status rv = EL_OK;
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ el_status el_load(el_ctx *ctx, el_alloc_cb alloc)
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
el_status el_finddyn(el_ctx *ctx, Elf_Dyn *dyn, u32 tag)
|
el_status el_finddyn(el_ctx *ctx, Elf_Dyn *dyn, uint32_t tag)
|
||||||
{
|
{
|
||||||
el_status rv = EL_OK;
|
el_status rv = EL_OK;
|
||||||
size_t ndyn = ctx->dynsize / sizeof(Elf_Dyn);
|
size_t ndyn = ctx->dynsize / sizeof(Elf_Dyn);
|
||||||
@@ -231,7 +231,7 @@ el_status el_finddyn(el_ctx *ctx, Elf_Dyn *dyn, u32 tag)
|
|||||||
return EL_OK;
|
return EL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
el_status el_findrelocs(el_ctx *ctx, el_relocinfo *ri, u32 type)
|
el_status el_findrelocs(el_ctx *ctx, el_relocinfo *ri, uint32_t type)
|
||||||
{
|
{
|
||||||
el_status rv = EL_OK;
|
el_status rv = EL_OK;
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
#include "elfarch.h"
|
#include "elfarch.h"
|
||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
|
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#include <gfx_utils.h>
|
#include <gfx_utils.h>
|
||||||
#define EL_DEBUG(format, ...) \
|
#define EL_DEBUG(format, ...) \
|
||||||
@@ -98,7 +100,7 @@ el_status el_load(el_ctx *ctx, el_alloc_cb alloccb);
|
|||||||
* If the end of the phdrs table was reached, *i is set to -1 and the contents
|
* If the end of the phdrs table was reached, *i is set to -1 and the contents
|
||||||
* of *phdr are undefined
|
* of *phdr are undefined
|
||||||
*/
|
*/
|
||||||
el_status el_findphdr(el_ctx *ctx, Elf_Phdr *phdr, u32 type, unsigned *i);
|
el_status el_findphdr(el_ctx *ctx, Elf_Phdr *phdr, uint32_t type, unsigned *i);
|
||||||
|
|
||||||
/* Relocate the loaded executable */
|
/* Relocate the loaded executable */
|
||||||
el_status el_relocate(el_ctx *ctx);
|
el_status el_relocate(el_ctx *ctx);
|
||||||
@@ -106,7 +108,7 @@ el_status el_relocate(el_ctx *ctx);
|
|||||||
/* find a dynamic table entry
|
/* find a dynamic table entry
|
||||||
* returns the entry on success, dyn->d_tag = DT_NULL on failure
|
* returns the entry on success, dyn->d_tag = DT_NULL on failure
|
||||||
*/
|
*/
|
||||||
el_status el_finddyn(el_ctx *ctx, Elf_Dyn *dyn, u32 type);
|
el_status el_finddyn(el_ctx *ctx, Elf_Dyn *dyn, uint32_t type);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -120,6 +122,6 @@ typedef struct
|
|||||||
* pass DT_REL or DT_RELA for type
|
* pass DT_REL or DT_RELA for type
|
||||||
* sets ri->entrysize = 0 if not found
|
* sets ri->entrysize = 0 if not found
|
||||||
*/
|
*/
|
||||||
el_status el_findrelocs(el_ctx *ctx, el_relocinfo *ri, u32 type);
|
el_status el_findrelocs(el_ctx *ctx, el_relocinfo *ri, uint32_t type);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -23,9 +23,9 @@
|
|||||||
|
|
||||||
el_status el_applyrela(el_ctx *ctx, Elf_RelA *rel)
|
el_status el_applyrela(el_ctx *ctx, Elf_RelA *rel)
|
||||||
{
|
{
|
||||||
uptr *p = (uptr *)(rel->r_offset + ctx->base_load_paddr);
|
uintptr_t *p = (uintptr_t *)(rel->r_offset + ctx->base_load_paddr);
|
||||||
u32 type = ELF_R_TYPE(rel->r_info);
|
uint32_t type = ELF_R_TYPE(rel->r_info);
|
||||||
u32 sym = ELF_R_SYM(rel->r_info);
|
uint32_t sym = ELF_R_SYM(rel->r_info);
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
@@ -53,9 +53,9 @@ el_status el_applyrela(el_ctx *ctx, Elf_RelA *rel)
|
|||||||
|
|
||||||
el_status el_applyrel(el_ctx *ctx, Elf_Rel *rel)
|
el_status el_applyrel(el_ctx *ctx, Elf_Rel *rel)
|
||||||
{
|
{
|
||||||
uptr *p = (uptr *)(rel->r_offset + ctx->base_load_paddr);
|
uintptr_t *p = (uintptr_t *)(rel->r_offset + ctx->base_load_paddr);
|
||||||
u32 type = ELF_R_TYPE(rel->r_info);
|
uint32_t type = ELF_R_TYPE(rel->r_info);
|
||||||
u32 sym = ELF_R_SYM(rel->r_info);
|
uint32_t sym = ELF_R_SYM(rel->r_info);
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,9 +20,9 @@
|
|||||||
|
|
||||||
el_status el_applyrel(el_ctx *ctx, Elf_Rel *rel)
|
el_status el_applyrel(el_ctx *ctx, Elf_Rel *rel)
|
||||||
{
|
{
|
||||||
u32 sym = ELF_R_SYM(rel->r_info); // Symbol offset
|
uint32_t sym = ELF_R_SYM(rel->r_info); // Symbol offset
|
||||||
u32 type = ELF_R_TYPE(rel->r_info); // Relocation Type
|
uint32_t type = ELF_R_TYPE(rel->r_info); // Relocation Type
|
||||||
uptr *p = (uptr *)(rel->r_offset + ctx->base_load_paddr); // Target Addr
|
uintptr_t *p = (uintptr_t *)(rel->r_offset + ctx->base_load_paddr); // Target Addr
|
||||||
|
|
||||||
#if 0 // For later symbol usage
|
#if 0 // For later symbol usage
|
||||||
Elf32_Sym *elfSym;
|
Elf32_Sym *elfSym;
|
||||||
|
|||||||
@@ -21,8 +21,7 @@
|
|||||||
#include "elfload/elfload.h"
|
#include "elfload/elfload.h"
|
||||||
#include <module.h>
|
#include <module.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include <power/max7762x.h>
|
#include <storage/nx_sd.h>
|
||||||
#include <storage/sd.h>
|
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
#include <gfx_utils.h>
|
#include <gfx_utils.h>
|
||||||
@@ -44,10 +43,6 @@ static void _ianos_call_ep(moduleEntrypoint_t entrypoint, void *moduleConfig)
|
|||||||
bdkParameters->memset = (memset_t)&memset;
|
bdkParameters->memset = (memset_t)&memset;
|
||||||
bdkParameters->sharedHeap = &_heap;
|
bdkParameters->sharedHeap = &_heap;
|
||||||
|
|
||||||
// Extra functions.
|
|
||||||
bdkParameters->extension_magic = IANOS_EXT0;
|
|
||||||
bdkParameters->reg_voltage_set = (reg_voltage_set_t)&max7762x_regulator_set_voltage;
|
|
||||||
|
|
||||||
entrypoint(moduleConfig, bdkParameters);
|
entrypoint(moduleConfig, bdkParameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
144
bdk/input/als.c
144
bdk/input/als.c
@@ -23,117 +23,79 @@
|
|||||||
#include <soc/pinmux.h>
|
#include <soc/pinmux.h>
|
||||||
#include <utils/util.h>
|
#include <utils/util.h>
|
||||||
|
|
||||||
#define BH1730_DEFAULT_GAIN BH1730_GAIN_64X
|
#define HOS_GAIN BH1730_GAIN_64X
|
||||||
#define BH1730_DEFAULT_ICYCLE 38
|
#define HOS_ITIME 38
|
||||||
|
|
||||||
#define BH1730_INTERNAL_CLOCK_NS 2800
|
void set_als_cfg(als_table_t *als_val, u8 gain, u8 itime)
|
||||||
#define BH1730_ADC_CALC_DELAY_US 2000 /* BH1730_INTERNAL_CLOCK_MS * 714 */
|
|
||||||
#define BH1730_ITIME_CYCLE_TO_US 2700 /* BH1730_INTERNAL_CLOCK_MS * 964 */
|
|
||||||
|
|
||||||
#define BH1730_DEFAULT_ITIME_MS 100
|
|
||||||
|
|
||||||
#define BH1730_LUX_MULTIPLIER 3600
|
|
||||||
#define BH1730_LUX_MULTIPLIER_AULA 1410
|
|
||||||
|
|
||||||
#define BH1730_LUX_MAX 100000
|
|
||||||
|
|
||||||
typedef struct _opt_win_cal_t
|
|
||||||
{
|
{
|
||||||
u32 rc;
|
|
||||||
u32 cv;
|
|
||||||
u32 ci;
|
|
||||||
} opt_win_cal_t;
|
|
||||||
|
|
||||||
// Nintendo Switch Icosa/Iowa Optical Window calibration.
|
|
||||||
const opt_win_cal_t opt_win_cal_default[] = {
|
|
||||||
{ 500, 5002, 7502 },
|
|
||||||
{ 754, 2250, 2000 },
|
|
||||||
{ 1029, 1999, 1667 },
|
|
||||||
{ 1373, 884, 583 },
|
|
||||||
{ 1879, 309, 165 }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Nintendo Switch Aula Optical Window calibration.
|
|
||||||
const opt_win_cal_t opt_win_cal_aula[] = {
|
|
||||||
{ 231, 9697, 30300 },
|
|
||||||
{ 993, 3333, 2778 },
|
|
||||||
{ 1478, 1621, 1053 },
|
|
||||||
{ 7500, 81, 10 }
|
|
||||||
};
|
|
||||||
|
|
||||||
const u32 als_gain_idx_tbl[4] = { 1, 2, 64, 128 };
|
|
||||||
|
|
||||||
void set_als_cfg(als_ctxt_t *als_ctxt, u8 gain, u8 cycle)
|
|
||||||
{
|
|
||||||
if (gain > BH1730_GAIN_128X)
|
|
||||||
gain = BH1730_GAIN_128X;
|
|
||||||
|
|
||||||
if (!cycle)
|
|
||||||
cycle = 1;
|
|
||||||
else if (cycle > 255)
|
|
||||||
cycle = 255;
|
|
||||||
|
|
||||||
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_GAIN_REG), gain);
|
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_GAIN_REG), gain);
|
||||||
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_TIMING_REG), (256 - cycle));
|
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_TIMING_REG), (256 - itime));
|
||||||
|
|
||||||
als_ctxt->gain = gain;
|
als_val->gain = gain;
|
||||||
als_ctxt->cycle = cycle;
|
als_val->itime = itime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_als_lux(als_ctxt_t *als_ctxt)
|
void get_als_lux(als_table_t *als_val)
|
||||||
{
|
{
|
||||||
u32 data[2];
|
u32 data[2];
|
||||||
u32 visible_light;
|
float pre_gain_lux;
|
||||||
u32 ir_light;
|
float visible_light;
|
||||||
u64 lux = 0;
|
float ir_light;
|
||||||
u32 itime_us = BH1730_ITIME_CYCLE_TO_US * als_ctxt->cycle;
|
float light_ratio;
|
||||||
|
|
||||||
// Get visible and ir light raw data. Mode is continuous so waiting for new values doesn't matter.
|
u8 adc_ready = 0;
|
||||||
|
u8 retries = 100;
|
||||||
|
|
||||||
|
const float als_gain_idx_tbl[4] = { 1.0, 2.0, 64.0, 128.0 };
|
||||||
|
const float als_norm_res = 100.0;
|
||||||
|
const float als_multiplier = 3.6;
|
||||||
|
const float als_tint = 2.7;
|
||||||
|
|
||||||
|
// Wait for ADC to prepare new data.
|
||||||
|
while (!(adc_ready & BH1730_CTL_ADC_VALID) && retries)
|
||||||
|
{
|
||||||
|
retries--;
|
||||||
|
adc_ready = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_CONTROL_REG));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get visible and ir light raw data.
|
||||||
data[0] = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA0LOW_REG)) +
|
data[0] = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA0LOW_REG)) +
|
||||||
(i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA0HIGH_REG)) << 8);
|
(i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA0HIGH_REG)) << 8);
|
||||||
data[1] = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1LOW_REG)) +
|
data[1] = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1LOW_REG)) +
|
||||||
(i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1HIGH_REG)) << 8);
|
(i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1HIGH_REG)) << 8);
|
||||||
|
|
||||||
visible_light = data[0];
|
als_val->over_limit = data[0] > 65534 || data[1] > 65534;
|
||||||
ir_light = data[1];
|
als_val->vi_light = data[0];
|
||||||
|
als_val->ir_light = data[1];
|
||||||
|
|
||||||
als_ctxt->over_limit = visible_light > 65534 || ir_light > 65534;
|
if (!data[0] || !retries)
|
||||||
als_ctxt->vi_light = visible_light;
|
|
||||||
als_ctxt->ir_light = ir_light;
|
|
||||||
|
|
||||||
if (!visible_light)
|
|
||||||
{
|
{
|
||||||
als_ctxt->lux = 0;
|
als_val->lux = 0.0;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set calibration parameters.
|
visible_light = (float)data[0];
|
||||||
u32 lux_multiplier = BH1730_LUX_MULTIPLIER;
|
ir_light = (float)data[1];
|
||||||
u32 opt_win_cal_count = ARRAY_SIZE(opt_win_cal_default);
|
light_ratio = (float)data[1] / (float)data[0];
|
||||||
const opt_win_cal_t *opt_win_cal = opt_win_cal_default;
|
|
||||||
|
|
||||||
// Apply optical window calibration coefficients.
|
// The following are specific to the light filter Switch uses.
|
||||||
for (u32 i = 0; i < opt_win_cal_count; i++)
|
if (light_ratio < 0.5)
|
||||||
{
|
pre_gain_lux = visible_light * 5.002 - ir_light * 7.502;
|
||||||
if (1000 * ir_light / visible_light < opt_win_cal[i].rc)
|
else if (light_ratio < 0.754)
|
||||||
{
|
pre_gain_lux = visible_light * 2.250 - ir_light * 2.000;
|
||||||
lux = ((u64)opt_win_cal[i].cv * data[0]) - (opt_win_cal[i].ci * data[1]);
|
else if (light_ratio < 1.029)
|
||||||
break;
|
pre_gain_lux = visible_light * 1.999 - ir_light * 1.667;
|
||||||
}
|
else if (light_ratio < 1.373)
|
||||||
}
|
pre_gain_lux = visible_light * 0.884 - ir_light * 0.583;
|
||||||
|
else if (light_ratio < 1.879)
|
||||||
|
pre_gain_lux = visible_light * 0.309 - ir_light * 0.165;
|
||||||
|
else pre_gain_lux = 0.0;
|
||||||
|
|
||||||
lux *= BH1730_DEFAULT_ITIME_MS * lux_multiplier;
|
als_val->lux = (pre_gain_lux / als_gain_idx_tbl[als_val->gain]) * (als_norm_res / ((float)als_val->itime * als_tint)) * als_multiplier;
|
||||||
lux /= als_gain_idx_tbl[als_ctxt->gain] * itime_us;
|
|
||||||
lux /= 1000;
|
|
||||||
|
|
||||||
if (lux > BH1730_LUX_MAX)
|
|
||||||
lux = BH1730_LUX_MAX;
|
|
||||||
|
|
||||||
als_ctxt->lux = lux;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 als_power_on(als_ctxt_t *als_ctxt)
|
u8 als_init(als_table_t *als_val)
|
||||||
{
|
{
|
||||||
// Enable power to ALS IC.
|
// Enable power to ALS IC.
|
||||||
max7762x_regulator_set_voltage(REGULATOR_LDO6, 2900000);
|
max7762x_regulator_set_voltage(REGULATOR_LDO6, 2900000);
|
||||||
@@ -147,10 +109,12 @@ u8 als_power_on(als_ctxt_t *als_ctxt)
|
|||||||
// Initialize ALS.
|
// Initialize ALS.
|
||||||
u8 id = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(0x12));
|
u8 id = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(0x12));
|
||||||
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_SPEC(BH1730_SPECCMD_RESET), 0);
|
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_SPEC(BH1730_SPECCMD_RESET), 0);
|
||||||
|
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_GAIN_REG), HOS_GAIN);
|
||||||
set_als_cfg(als_ctxt, BH1730_DEFAULT_GAIN, BH1730_DEFAULT_ICYCLE);
|
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_TIMING_REG), (256 - HOS_ITIME));
|
||||||
|
|
||||||
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_CONTROL_REG), BH1730_CTL_POWER_ON | BH1730_CTL_ADC_EN);
|
i2c_send_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_CONTROL_REG), BH1730_CTL_POWER_ON | BH1730_CTL_ADC_EN);
|
||||||
|
|
||||||
|
als_val->gain = HOS_GAIN;
|
||||||
|
als_val->itime = HOS_ITIME;
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,18 +48,18 @@
|
|||||||
#define BH1730_ADDR(reg) (BH1730_CMD_MAGIC | BH1730_CMD_SETADDR | (reg))
|
#define BH1730_ADDR(reg) (BH1730_CMD_MAGIC | BH1730_CMD_SETADDR | (reg))
|
||||||
#define BH1730_SPEC(cmd) (BH1730_CMD_MAGIC | BH1730_CMD_SPECCMD | (cmd))
|
#define BH1730_SPEC(cmd) (BH1730_CMD_MAGIC | BH1730_CMD_SPECCMD | (cmd))
|
||||||
|
|
||||||
typedef struct _als_ctxt_t
|
typedef struct _als_table_t
|
||||||
{
|
{
|
||||||
u32 lux;
|
float lux;
|
||||||
bool over_limit;
|
bool over_limit;
|
||||||
u32 vi_light;
|
u32 vi_light;
|
||||||
u32 ir_light;
|
u32 ir_light;
|
||||||
u8 gain;
|
u8 gain;
|
||||||
u8 cycle;
|
u8 itime;
|
||||||
} als_ctxt_t;
|
} als_table_t;
|
||||||
|
|
||||||
void set_als_cfg(als_ctxt_t *als_ctxt, u8 gain, u8 cycle);
|
void set_als_cfg(als_table_t *als_val, u8 gain, u8 itime);
|
||||||
void get_als_lux(als_ctxt_t *als_ctxt);
|
void get_als_lux(als_table_t *als_val);
|
||||||
u8 als_power_on(als_ctxt_t *als_ctxt);
|
u8 als_init(als_table_t *als_val);
|
||||||
|
|
||||||
#endif /* __ALS_H_ */
|
#endif /* __ALS_H_ */
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Joy-Con UART driver for Nintendo Switch
|
* Joy-Con UART driver for Nintendo Switch
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -463,7 +463,7 @@ static void jc_rcv_pkt(joycon_ctxt_t *jc)
|
|||||||
|
|
||||||
// Check if device stopped sending data.
|
// Check if device stopped sending data.
|
||||||
u32 uart_irq = uart_get_IIR(jc->uart);
|
u32 uart_irq = uart_get_IIR(jc->uart);
|
||||||
if (uart_irq != UART_IIR_REDI)
|
if ((uart_irq & 0x8) != 0x8)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
u32 len = uart_recv(jc->uart, (u8 *)jc->buf, 0x100);
|
u32 len = uart_recv(jc->uart, (u8 *)jc->buf, 0x100);
|
||||||
@@ -694,15 +694,9 @@ retry:
|
|||||||
|
|
||||||
void jc_deinit()
|
void jc_deinit()
|
||||||
{
|
{
|
||||||
// Disable power.
|
|
||||||
jc_power_supply(UART_B, false);
|
|
||||||
jc_power_supply(UART_C, false);
|
|
||||||
|
|
||||||
// Turn off Joy-Con detect.
|
|
||||||
gpio_config(GPIO_PORT_G, GPIO_PIN_0, GPIO_MODE_SPIO);
|
gpio_config(GPIO_PORT_G, GPIO_PIN_0, GPIO_MODE_SPIO);
|
||||||
gpio_config(GPIO_PORT_D, GPIO_PIN_1, GPIO_MODE_SPIO);
|
gpio_config(GPIO_PORT_D, GPIO_PIN_1, GPIO_MODE_SPIO);
|
||||||
|
|
||||||
// Send sleep command.
|
|
||||||
u8 data = HCI_STATE_SLEEP;
|
u8 data = HCI_STATE_SLEEP;
|
||||||
|
|
||||||
if (jc_r.connected && !(jc_r.type & JC_ID_HORI))
|
if (jc_r.connected && !(jc_r.type & JC_ID_HORI))
|
||||||
@@ -716,9 +710,8 @@ void jc_deinit()
|
|||||||
jc_rcv_pkt(&jc_l);
|
jc_rcv_pkt(&jc_l);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable UART B and C clocks.
|
jc_power_supply(UART_B, false);
|
||||||
clock_disable_uart(UART_B);
|
jc_power_supply(UART_C, false);
|
||||||
clock_disable_uart(UART_C);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void jc_init_conn(joycon_ctxt_t *jc)
|
static void jc_init_conn(joycon_ctxt_t *jc)
|
||||||
@@ -885,14 +878,14 @@ void jc_init_hw()
|
|||||||
pinmux_config_uart(UART_C);
|
pinmux_config_uart(UART_C);
|
||||||
|
|
||||||
// Ease the stress to APB.
|
// Ease the stress to APB.
|
||||||
bpmp_freq_t prev_fid = bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
||||||
|
|
||||||
// Enable UART B and C clocks.
|
// Enable UART B and C clocks.
|
||||||
clock_enable_uart(UART_B);
|
clock_enable_uart(UART_B);
|
||||||
clock_enable_uart(UART_C);
|
clock_enable_uart(UART_C);
|
||||||
|
|
||||||
// Restore OC.
|
// Restore OC.
|
||||||
bpmp_clk_rate_set(prev_fid);
|
bpmp_clk_rate_set(BPMP_CLK_DEFAULT_BOOST);
|
||||||
|
|
||||||
// Turn Joy-Con detect on.
|
// Turn Joy-Con detect on.
|
||||||
gpio_config(GPIO_PORT_G, GPIO_PIN_0, GPIO_MODE_GPIO);
|
gpio_config(GPIO_PORT_G, GPIO_PIN_0, GPIO_MODE_GPIO);
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ static touch_panel_info_t _panels[] =
|
|||||||
{ 1, 0, 1, 1, "GiS GGM6 B2X" },
|
{ 1, 0, 1, 1, "GiS GGM6 B2X" },
|
||||||
{ 2, 0, 0, 0, "NISSHA NBF-K9A" },
|
{ 2, 0, 0, 0, "NISSHA NBF-K9A" },
|
||||||
{ 3, 1, 0, 0, "GiS 5.5\"" },
|
{ 3, 1, 0, 0, "GiS 5.5\"" },
|
||||||
{ 4, 0, 0, 1, "Samsung BH2109" },
|
{ 4, 0, 0, 1, "Unknown" },
|
||||||
{ -1, 1, 0, 1, "GiS VA 6.2\"" }
|
{ -1, 1, 0, 1, "GiS VA 6.2\"" }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -206,7 +206,6 @@ touch_panel_info_t *touch_get_panel_vendor()
|
|||||||
{
|
{
|
||||||
u8 buf[5] = {0};
|
u8 buf[5] = {0};
|
||||||
u8 cmd = STMFTS_VENDOR_GPIO_STATE;
|
u8 cmd = STMFTS_VENDOR_GPIO_STATE;
|
||||||
static touch_panel_info_t panel_info = { -2, 0, 0, 0, ""};
|
|
||||||
|
|
||||||
if (touch_command(STMFTS_VENDOR, &cmd, 1))
|
if (touch_command(STMFTS_VENDOR, &cmd, 1))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -221,20 +220,13 @@ touch_panel_info_t *touch_get_panel_vendor()
|
|||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Touch panel not found, return current gpios.
|
return NULL;
|
||||||
panel_info.gpio0 = buf[0];
|
|
||||||
panel_info.gpio1 = buf[1];
|
|
||||||
panel_info.gpio2 = buf[2];
|
|
||||||
|
|
||||||
return &panel_info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int touch_get_fw_info(touch_fw_info_t *fw)
|
int touch_get_fw_info(touch_fw_info_t *fw)
|
||||||
{
|
{
|
||||||
u8 buf[8] = {0};
|
u8 buf[8] = {0};
|
||||||
|
|
||||||
memset(fw, 0, sizeof(touch_fw_info_t));
|
|
||||||
|
|
||||||
// Get fw address info.
|
// Get fw address info.
|
||||||
u8 cmd[3] = { STMFTS_RW_FRAMEBUFFER_REG, 0, 0x60 };
|
u8 cmd[3] = { STMFTS_RW_FRAMEBUFFER_REG, 0, 0x60 };
|
||||||
int res = touch_read_reg(cmd, 3, buf, 3);
|
int res = touch_read_reg(cmd, 3, buf, 3);
|
||||||
@@ -326,7 +318,7 @@ int touch_get_fb_info(u8 *buf)
|
|||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
|
|
||||||
for (u32 i = 0; i < 0x10000; i += 4)
|
for (u32 i = 0; i < 0x10000; i+=4)
|
||||||
{
|
{
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
@@ -400,17 +392,17 @@ static int touch_init()
|
|||||||
|
|
||||||
int touch_power_on()
|
int touch_power_on()
|
||||||
{
|
{
|
||||||
// Enable LDO6 for touchscreen AVDD supply.
|
// Enable LDO6 for touchscreen VDD/AVDD supply.
|
||||||
max7762x_regulator_set_voltage(REGULATOR_LDO6, 2900000);
|
max7762x_regulator_set_voltage(REGULATOR_LDO6, 2900000);
|
||||||
max7762x_regulator_enable(REGULATOR_LDO6, true);
|
max7762x_regulator_enable(REGULATOR_LDO6, true);
|
||||||
|
|
||||||
// Configure touchscreen VDD GPIO.
|
// Configure touchscreen GPIO.
|
||||||
PINMUX_AUX(PINMUX_AUX_DAP4_SCLK) = PINMUX_PULL_DOWN | 1;
|
PINMUX_AUX(PINMUX_AUX_DAP4_SCLK) = PINMUX_PULL_DOWN | 1;
|
||||||
gpio_config(GPIO_PORT_J, GPIO_PIN_7, GPIO_MODE_GPIO);
|
gpio_config(GPIO_PORT_J, GPIO_PIN_7, GPIO_MODE_GPIO);
|
||||||
gpio_output_enable(GPIO_PORT_J, GPIO_PIN_7, GPIO_OUTPUT_ENABLE);
|
gpio_output_enable(GPIO_PORT_J, GPIO_PIN_7, GPIO_OUTPUT_ENABLE);
|
||||||
gpio_write(GPIO_PORT_J, GPIO_PIN_7, GPIO_HIGH);
|
gpio_write(GPIO_PORT_J, GPIO_PIN_7, GPIO_HIGH);
|
||||||
|
|
||||||
// Touscreen IRQ.
|
// IRQ and more.
|
||||||
// PINMUX_AUX(PINMUX_AUX_TOUCH_INT) = PINMUX_INPUT_ENABLE | PINMUX_TRISTATE | PINMUX_PULL_UP | 3;
|
// PINMUX_AUX(PINMUX_AUX_TOUCH_INT) = PINMUX_INPUT_ENABLE | PINMUX_TRISTATE | PINMUX_PULL_UP | 3;
|
||||||
// gpio_config(GPIO_PORT_X, GPIO_PIN_1, GPIO_MODE_GPIO);
|
// gpio_config(GPIO_PORT_X, GPIO_PIN_1, GPIO_MODE_GPIO);
|
||||||
// gpio_write(GPIO_PORT_X, GPIO_PIN_1, GPIO_LOW);
|
// gpio_write(GPIO_PORT_X, GPIO_PIN_1, GPIO_LOW);
|
||||||
@@ -418,7 +410,7 @@ int touch_power_on()
|
|||||||
// Configure Touscreen and GCAsic shared GPIO.
|
// Configure Touscreen and GCAsic shared GPIO.
|
||||||
PINMUX_AUX(PINMUX_AUX_CAM_I2C_SDA) = PINMUX_LPDR | PINMUX_INPUT_ENABLE | PINMUX_TRISTATE | PINMUX_PULL_UP | 2;
|
PINMUX_AUX(PINMUX_AUX_CAM_I2C_SDA) = PINMUX_LPDR | PINMUX_INPUT_ENABLE | PINMUX_TRISTATE | PINMUX_PULL_UP | 2;
|
||||||
PINMUX_AUX(PINMUX_AUX_CAM_I2C_SCL) = PINMUX_IO_HV | PINMUX_LPDR | PINMUX_TRISTATE | PINMUX_PULL_DOWN | 2;
|
PINMUX_AUX(PINMUX_AUX_CAM_I2C_SCL) = PINMUX_IO_HV | PINMUX_LPDR | PINMUX_TRISTATE | PINMUX_PULL_DOWN | 2;
|
||||||
gpio_config(GPIO_PORT_S, GPIO_PIN_3, GPIO_MODE_GPIO); // GC detect.
|
gpio_config(GPIO_PORT_S, GPIO_PIN_3, GPIO_MODE_GPIO);
|
||||||
|
|
||||||
// Initialize I2C3.
|
// Initialize I2C3.
|
||||||
pinmux_config_i2c(I2C_3);
|
pinmux_config_i2c(I2C_3);
|
||||||
|
|||||||
@@ -53,7 +53,6 @@
|
|||||||
#define STMFTS_RW_FRAMEBUFFER_REG 0xD0
|
#define STMFTS_RW_FRAMEBUFFER_REG 0xD0
|
||||||
#define STMFTS_SAVE_CX_TUNING 0xFC
|
#define STMFTS_SAVE_CX_TUNING 0xFC
|
||||||
|
|
||||||
#define STMFTS_DETECTION_CONFIG 0xB0
|
|
||||||
#define STMFTS_REQU_COMP_DATA 0xB8
|
#define STMFTS_REQU_COMP_DATA 0xB8
|
||||||
#define STMFTS_VENDOR 0xCF
|
#define STMFTS_VENDOR 0xCF
|
||||||
#define STMFTS_FLASH_UNLOCK 0xF7
|
#define STMFTS_FLASH_UNLOCK 0xF7
|
||||||
|
|||||||
@@ -839,12 +839,10 @@ int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst
|
|||||||
int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)
|
int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t));
|
LZ4_stream_t ctx;
|
||||||
LZ4_stream_t* const ctxPtr = ctx;
|
LZ4_stream_t* const ctxPtr = &ctx;
|
||||||
result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration);
|
result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration);
|
||||||
|
|
||||||
FREEMEM(ctx);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -859,18 +857,13 @@ int LZ4_compress_default(const char* source, char* dest, int inputSize, int maxO
|
|||||||
/* strangely enough, gcc generates faster code when this function is uncommented, even if unused */
|
/* strangely enough, gcc generates faster code when this function is uncommented, even if unused */
|
||||||
int LZ4_compress_fast_force(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)
|
int LZ4_compress_fast_force(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)
|
||||||
{
|
{
|
||||||
int result;
|
LZ4_stream_t ctx;
|
||||||
LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t));
|
LZ4_resetStream(&ctx);
|
||||||
LZ4_resetStream(ctx);
|
|
||||||
|
|
||||||
if (inputSize < LZ4_64Klimit)
|
if (inputSize < LZ4_64Klimit)
|
||||||
result = LZ4_compress_generic(&ctx->internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration);
|
return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration);
|
||||||
else
|
else
|
||||||
result = LZ4_compress_generic(&ctx->internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, sizeof(void*)==8 ? byU32 : byPtr, noDict, noDictIssue, acceleration);
|
return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, sizeof(void*)==8 ? byU32 : byPtr, noDict, noDictIssue, acceleration);
|
||||||
|
|
||||||
FREEMEM(ctx);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1052,13 +1045,11 @@ static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src,
|
|||||||
|
|
||||||
int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize)
|
int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize)
|
||||||
{
|
{
|
||||||
LZ4_stream_t* ctxBody = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t));;
|
LZ4_stream_t ctxBody;
|
||||||
LZ4_stream_t* ctx = ctxBody;
|
LZ4_stream_t* ctx = &ctxBody;
|
||||||
|
|
||||||
int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize);
|
int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize);
|
||||||
|
|
||||||
FREEMEM(ctxBody);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,8 +27,7 @@ typedef enum {
|
|||||||
DRIVE_SD = 0,
|
DRIVE_SD = 0,
|
||||||
DRIVE_RAM = 1,
|
DRIVE_RAM = 1,
|
||||||
DRIVE_EMMC = 2,
|
DRIVE_EMMC = 2,
|
||||||
DRIVE_BIS = 3,
|
DRIVE_BIS = 3
|
||||||
DRIVE_EMU = 4
|
|
||||||
} DDRIVE;
|
} DDRIVE;
|
||||||
|
|
||||||
|
|
||||||
@@ -60,7 +59,6 @@ DRESULT disk_set_info (BYTE pdrv, BYTE cmd, void *buff);
|
|||||||
#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */
|
#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */
|
||||||
#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */
|
#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */
|
||||||
#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */
|
#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */
|
||||||
#define SET_SECTOR_OFFSET 5 /* Set media logical offset */
|
|
||||||
|
|
||||||
/* Generic command (Not used by FatFs) */
|
/* Generic command (Not used by FatFs) */
|
||||||
#define CTRL_POWER 5 /* Get/Set power status */
|
#define CTRL_POWER 5 /* Get/Set power status */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -38,9 +38,8 @@
|
|||||||
|
|
||||||
#include "ff.h" /* Declarations of FatFs API */
|
#include "ff.h" /* Declarations of FatFs API */
|
||||||
#include "diskio.h" /* Declarations of device I/O functions */
|
#include "diskio.h" /* Declarations of device I/O functions */
|
||||||
#include <storage/mbr_gpt.h>
|
|
||||||
#include <gfx_utils.h>
|
#include <gfx_utils.h>
|
||||||
#include <storage/sdmmc.h>
|
#include "../../storage/nx_sd.h"
|
||||||
|
|
||||||
#define EFSPRINTF(text, ...) print_error(); gfx_printf("%k"text"%k\n", 0xFFFFFF00, 0xFFFFFFFF);
|
#define EFSPRINTF(text, ...) print_error(); gfx_printf("%k"text"%k\n", 0xFFFFFF00, 0xFFFFFFFF);
|
||||||
//#define EFSPRINTF(...)
|
//#define EFSPRINTF(...)
|
||||||
@@ -3275,6 +3274,7 @@ static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */
|
|||||||
stat = disk_status(fs->pdrv);
|
stat = disk_status(fs->pdrv);
|
||||||
if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */
|
if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */
|
||||||
if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */
|
if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */
|
||||||
|
EFSPRINTF("WPEN1");
|
||||||
return FR_WRITE_PROTECTED;
|
return FR_WRITE_PROTECTED;
|
||||||
}
|
}
|
||||||
return FR_OK; /* The filesystem object is valid */
|
return FR_OK; /* The filesystem object is valid */
|
||||||
@@ -3285,13 +3285,14 @@ static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */
|
|||||||
/* Following code attempts to mount the volume. (analyze BPB and initialize the filesystem object) */
|
/* Following code attempts to mount the volume. (analyze BPB and initialize the filesystem object) */
|
||||||
|
|
||||||
fs->fs_type = 0; /* Clear the filesystem object */
|
fs->fs_type = 0; /* Clear the filesystem object */
|
||||||
fs->part_type = 0; /* Clear the Partition object */
|
|
||||||
fs->pdrv = LD2PD(vol); /* Bind the logical drive and a physical drive */
|
fs->pdrv = LD2PD(vol); /* Bind the logical drive and a physical drive */
|
||||||
stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */
|
stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */
|
||||||
if (stat & STA_NOINIT) { /* Check if the initialization succeeded */
|
if (stat & STA_NOINIT) { /* Check if the initialization succeeded */
|
||||||
|
EFSPRINTF("MDNR");
|
||||||
return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */
|
return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */
|
||||||
}
|
}
|
||||||
if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */
|
if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */
|
||||||
|
EFSPRINTF("WPEN2");
|
||||||
return FR_WRITE_PROTECTED;
|
return FR_WRITE_PROTECTED;
|
||||||
}
|
}
|
||||||
#if FF_MAX_SS != FF_MIN_SS /* Get sector size (multiple sector size cfg only) */
|
#if FF_MAX_SS != FF_MIN_SS /* Get sector size (multiple sector size cfg only) */
|
||||||
@@ -3318,20 +3319,6 @@ static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */
|
|||||||
EFSPRINTF("BRNL");
|
EFSPRINTF("BRNL");
|
||||||
return FR_DISK_ERR; /* An error occured in the disk I/O layer */
|
return FR_DISK_ERR; /* An error occured in the disk I/O layer */
|
||||||
}
|
}
|
||||||
#if FF_SIMPLE_GPT
|
|
||||||
if (fmt >= 2) {
|
|
||||||
/* If GPT Check the first partition */
|
|
||||||
gpt_header_t *gpt_header = (gpt_header_t *)fs->win;
|
|
||||||
if (move_window(fs, 1) != FR_OK) return FR_DISK_ERR;
|
|
||||||
if (!mem_cmp(&gpt_header->signature, "EFI PART", 8)) {
|
|
||||||
if (move_window(fs, gpt_header->part_ent_lba) != FR_OK) return FR_DISK_ERR;
|
|
||||||
gpt_entry_t *gpt_entry = (gpt_entry_t *)fs->win;
|
|
||||||
fs->part_type = 1;
|
|
||||||
bsect = gpt_entry->lba_start;
|
|
||||||
fmt = bsect ? check_fs(fs, bsect) : 3; /* Check the partition */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (fmt >= 2) {
|
if (fmt >= 2) {
|
||||||
EFSPRINTF("NOFAT");
|
EFSPRINTF("NOFAT");
|
||||||
return FR_NO_FILESYSTEM; /* No FAT volume is found */
|
return FR_NO_FILESYSTEM; /* No FAT volume is found */
|
||||||
@@ -4062,7 +4049,8 @@ FRESULT f_write (
|
|||||||
}
|
}
|
||||||
if (clst == 0) {
|
if (clst == 0) {
|
||||||
EFSPRINTF("DSKFULL");
|
EFSPRINTF("DSKFULL");
|
||||||
break; /* Could not allocate a new cluster (disk full) */
|
fp->flag |= FA_MODIFIED;
|
||||||
|
ABORT(fs, FR_DISK_ERR); /* Could not allocate a new cluster (disk full) */
|
||||||
}
|
}
|
||||||
if (clst == 1) {
|
if (clst == 1) {
|
||||||
EFSPRINTF("CCHK");
|
EFSPRINTF("CCHK");
|
||||||
@@ -4710,9 +4698,9 @@ DWORD *f_expand_cltbl (
|
|||||||
}
|
}
|
||||||
if (f_lseek(fp, CREATE_LINKMAP)) { /* Create cluster link table */
|
if (f_lseek(fp, CREATE_LINKMAP)) { /* Create cluster link table */
|
||||||
ff_memfree(fp->cltbl);
|
ff_memfree(fp->cltbl);
|
||||||
fp->cltbl = (void *)0;
|
fp->cltbl = NULL;
|
||||||
EFSPRINTF("CLTBLSZ");
|
EFSPRINTF("CLTBLSZ");
|
||||||
return (void *)0;
|
return NULL;
|
||||||
}
|
}
|
||||||
f_lseek(fp, 0);
|
f_lseek(fp, 0);
|
||||||
|
|
||||||
@@ -5874,7 +5862,7 @@ FRESULT f_mkfs (
|
|||||||
if (vol < 0) return FR_INVALID_DRIVE;
|
if (vol < 0) return FR_INVALID_DRIVE;
|
||||||
if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear the volume if mounted */
|
if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear the volume if mounted */
|
||||||
pdrv = LD2PD(vol); /* Physical drive */
|
pdrv = LD2PD(vol); /* Physical drive */
|
||||||
part = LD2PT(vol); /* Partition (0:create as new, 1-4:get from partition table) */
|
part = 1; /* Partition (0:create as new, 1-4:get from partition table) */
|
||||||
|
|
||||||
/* Check physical drive status */
|
/* Check physical drive status */
|
||||||
stat = disk_initialize(pdrv);
|
stat = disk_initialize(pdrv);
|
||||||
@@ -5905,7 +5893,7 @@ FRESULT f_mkfs (
|
|||||||
if (!buf || sz_buf == 0) return FR_NOT_ENOUGH_CORE;
|
if (!buf || sz_buf == 0) return FR_NOT_ENOUGH_CORE;
|
||||||
|
|
||||||
/* Determine where the volume to be located (b_vol, sz_vol) */
|
/* Determine where the volume to be located (b_vol, sz_vol) */
|
||||||
if (FF_MULTI_PARTITION && part != 0) {
|
if (part > 0) {
|
||||||
/* Get partition information from partition table in the MBR */
|
/* Get partition information from partition table in the MBR */
|
||||||
if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Load MBR */
|
if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Load MBR */
|
||||||
if (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if MBR is valid */
|
if (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if MBR is valid */
|
||||||
@@ -6184,9 +6172,7 @@ FRESULT f_mkfs (
|
|||||||
#endif
|
#endif
|
||||||
/* Create FAT VBR */
|
/* Create FAT VBR */
|
||||||
mem_set(buf, 0, ss);
|
mem_set(buf, 0, ss);
|
||||||
/* Boot jump code (x86), OEM name */
|
mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */
|
||||||
if (!(opt & FM_PRF2)) mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "NYX1.0.0", 11);
|
|
||||||
else mem_cpy(buf + BS_JmpBoot, "\xEB\xE9\x90\x00\x00\x00\x00\x00\x00\x00\x00", 11);
|
|
||||||
st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */
|
st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */
|
||||||
buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */
|
buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */
|
||||||
st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */
|
st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */
|
||||||
@@ -6199,27 +6185,23 @@ FRESULT f_mkfs (
|
|||||||
}
|
}
|
||||||
buf[BPB_Media] = 0xF8; /* Media descriptor byte */
|
buf[BPB_Media] = 0xF8; /* Media descriptor byte */
|
||||||
st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */
|
st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */
|
||||||
st_word(buf + BPB_NumHeads, (opt & FM_PRF2) ? 16 : 255); /* Number of heads (for int13) */
|
st_word(buf + BPB_NumHeads, 255); /* Number of heads (for int13) */
|
||||||
st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */
|
st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */
|
||||||
if (fmt == FS_FAT32) {
|
if (fmt == FS_FAT32) {
|
||||||
st_dword(buf + BS_VolID32, (opt & FM_PRF2) ? 0 : GET_FATTIME()); /* VSN */
|
st_dword(buf + BS_VolID32, GET_FATTIME()); /* VSN */
|
||||||
st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */
|
st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */
|
||||||
st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */
|
st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */
|
||||||
st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */
|
st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */
|
||||||
st_word(buf + BPB_BkBootSec32, 6); /* Offset of backup VBR (VBR + 6) */
|
st_word(buf + BPB_BkBootSec32, 6); /* Offset of backup VBR (VBR + 6) */
|
||||||
buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */
|
buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */
|
||||||
buf[BS_BootSig32] = 0x29; /* Extended boot signature */
|
buf[BS_BootSig32] = 0x29; /* Extended boot signature */
|
||||||
/* Volume label, FAT signature */
|
mem_cpy(buf + BS_VolLab32, "SWITCH SD " "FAT32 ", 19); /* Volume label, FAT signature */
|
||||||
if (!(opt & FM_PRF2)) mem_cpy(buf + BS_VolLab32, FF_MKFS_LABEL "FAT32 ", 19);
|
|
||||||
else mem_cpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19);
|
|
||||||
} else {
|
} else {
|
||||||
st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */
|
st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */
|
||||||
st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */
|
st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */
|
||||||
buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */
|
buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */
|
||||||
buf[BS_BootSig] = 0x29; /* Extended boot signature */
|
buf[BS_BootSig] = 0x29; /* Extended boot signature */
|
||||||
/* Volume label, FAT signature */
|
mem_cpy(buf + BS_VolLab, "SWITCH SD " "FAT ", 19); /* Volume label, FAT signature */
|
||||||
if (!(opt & FM_PRF2)) mem_cpy(buf + BS_VolLab, FF_MKFS_LABEL "FAT ", 19);
|
|
||||||
else mem_cpy(buf + BS_VolLab, "NO NAME " "FAT ", 19);
|
|
||||||
}
|
}
|
||||||
st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */
|
st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */
|
||||||
if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */
|
if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */
|
||||||
@@ -6237,16 +6219,6 @@ FRESULT f_mkfs (
|
|||||||
disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */
|
disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create PRF2SAFE info */
|
|
||||||
if (fmt == FS_FAT32 && opt & FM_PRF2) {
|
|
||||||
mem_set(buf, 0, ss);
|
|
||||||
buf[16] = 0x64; /* Record type */
|
|
||||||
st_dword(buf + 32, 0x03); /* Unknown. SYSTEM: 0x3F00. USER: 0x03. Volatile. */
|
|
||||||
st_dword(buf + 36, 25); /* Entries. SYSTEM: 22. USER: 25.Static? */
|
|
||||||
st_dword(buf + 508, 0x517BBFE0); /* Custom CRC32. SYSTEM: 0x6B673904. USER: 0x517BBFE0. */
|
|
||||||
disk_write(pdrv, buf, b_vol + 3, 1); /* Write PRF2SAFE info (VBR + 3) */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize FAT area */
|
/* Initialize FAT area */
|
||||||
mem_set(buf, 0, (UINT)szb_buf);
|
mem_set(buf, 0, (UINT)szb_buf);
|
||||||
sect = b_fat; /* FAT start sector */
|
sect = b_fat; /* FAT start sector */
|
||||||
@@ -6292,7 +6264,7 @@ FRESULT f_mkfs (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Update partition information */
|
/* Update partition information */
|
||||||
if (FF_MULTI_PARTITION && part != 0) { /* Created in the existing partition */
|
if (part != 0) { /* Created in the existing partition */
|
||||||
/* Update system ID in the partition table */
|
/* Update system ID in the partition table */
|
||||||
if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Read the MBR */
|
if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Read the MBR */
|
||||||
buf[MBR_Table + (part - 1) * SZ_PTE + PTE_System] = sys; /* Set system ID */
|
buf[MBR_Table + (part - 1) * SZ_PTE + PTE_System] = sys; /* Set system ID */
|
||||||
@@ -6400,7 +6372,6 @@ FRESULT f_fdisk (
|
|||||||
|
|
||||||
#endif /* FF_MULTI_PARTITION */
|
#endif /* FF_MULTI_PARTITION */
|
||||||
#endif /* FF_USE_MKFS && !FF_FS_READONLY */
|
#endif /* FF_USE_MKFS && !FF_FS_READONLY */
|
||||||
// We don't need these where we're going...
|
|
||||||
|
|
||||||
extern sdmmc_storage_t sd_storage;
|
extern sdmmc_storage_t sd_storage;
|
||||||
|
|
||||||
@@ -6478,6 +6449,7 @@ FRESULT f_fdisk_mod (
|
|||||||
LEAVE_MKFS(res);
|
LEAVE_MKFS(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if FF_USE_STRFUNC
|
#if FF_USE_STRFUNC
|
||||||
#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3)
|
#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3)
|
||||||
#error Wrong FF_STRF_ENCODE setting
|
#error Wrong FF_STRF_ENCODE setting
|
||||||
@@ -6810,8 +6782,6 @@ int f_puts (
|
|||||||
putbuff pb;
|
putbuff pb;
|
||||||
|
|
||||||
|
|
||||||
if (str == (void *)0) return EOF; /* String is NULL */
|
|
||||||
|
|
||||||
putc_init(&pb, fp);
|
putc_init(&pb, fp);
|
||||||
while (*str) putc_bfd(&pb, *str++); /* Put the string */
|
while (*str) putc_bfd(&pb, *str++); /* Put the string */
|
||||||
return putc_flush(&pb);
|
return putc_flush(&pb);
|
||||||
@@ -6838,8 +6808,6 @@ int f_printf (
|
|||||||
TCHAR c, d, str[32], *p;
|
TCHAR c, d, str[32], *p;
|
||||||
|
|
||||||
|
|
||||||
if (fmt == (void *)0) return EOF; /* String is NULL */
|
|
||||||
|
|
||||||
putc_init(&pb, fp);
|
putc_init(&pb, fp);
|
||||||
|
|
||||||
va_start(arp, fmt);
|
va_start(arp, fmt);
|
||||||
|
|||||||
@@ -95,8 +95,8 @@ typedef DWORD FSIZE_t;
|
|||||||
/* Filesystem object structure (FATFS) */
|
/* Filesystem object structure (FATFS) */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */
|
||||||
BYTE fs_type; /* Filesystem type (0:not mounted) */
|
BYTE fs_type; /* Filesystem type (0:not mounted) */
|
||||||
BYTE part_type; /* Partition type (0:MBR, 1:GPT) */
|
|
||||||
BYTE pdrv; /* Associated physical drive */
|
BYTE pdrv; /* Associated physical drive */
|
||||||
BYTE n_fats; /* Number of FATs (1 or 2) */
|
BYTE n_fats; /* Number of FATs (1 or 2) */
|
||||||
BYTE wflag; /* win[] flag (b0:dirty) */
|
BYTE wflag; /* win[] flag (b0:dirty) */
|
||||||
@@ -138,7 +138,6 @@ typedef struct {
|
|||||||
DWORD bitbase; /* Allocation bitmap base sector */
|
DWORD bitbase; /* Allocation bitmap base sector */
|
||||||
#endif
|
#endif
|
||||||
DWORD winsect; /* Current sector appearing in the win[] */
|
DWORD winsect; /* Current sector appearing in the win[] */
|
||||||
BYTE win[FF_MAX_SS] __attribute__((aligned(8))); /* Disk access window for Directory, FAT (and file data at tiny cfg). DMA aligned. */
|
|
||||||
} FATFS;
|
} FATFS;
|
||||||
|
|
||||||
|
|
||||||
@@ -169,6 +168,9 @@ typedef struct {
|
|||||||
/* File object structure (FIL) */
|
/* File object structure (FIL) */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
#if !FF_FS_TINY
|
||||||
|
BYTE buf[FF_MAX_SS]; /* File private data read/write window */
|
||||||
|
#endif
|
||||||
FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */
|
FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */
|
||||||
BYTE flag; /* File status flags */
|
BYTE flag; /* File status flags */
|
||||||
BYTE err; /* Abort flag (error code) */
|
BYTE err; /* Abort flag (error code) */
|
||||||
@@ -182,9 +184,6 @@ typedef struct {
|
|||||||
#if FF_USE_FASTSEEK
|
#if FF_USE_FASTSEEK
|
||||||
DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */
|
DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */
|
||||||
#endif
|
#endif
|
||||||
#if !FF_FS_TINY
|
|
||||||
BYTE buf[FF_MAX_SS] __attribute__((aligned(8))); /* File private data read/write window. DMA aligned. */
|
|
||||||
#endif
|
|
||||||
} FIL;
|
} FIL;
|
||||||
|
|
||||||
|
|
||||||
@@ -292,7 +291,7 @@ FRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt); /* Allocate a contiguous
|
|||||||
FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */
|
FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */
|
||||||
FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */
|
FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */
|
||||||
FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */
|
FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */
|
||||||
FRESULT f_fdisk_mod (BYTE pdrv, const DWORD* szt, void* work);
|
FRESULT f_fdisk_mod (BYTE pdrv, const DWORD* szt, void* work); // Modded version of f_fdisk that works:tm:
|
||||||
FRESULT f_setcp (WORD cp); /* Set current code page */
|
FRESULT f_setcp (WORD cp); /* Set current code page */
|
||||||
int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */
|
int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */
|
||||||
int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */
|
int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */
|
||||||
@@ -367,7 +366,6 @@ int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */
|
|||||||
#define FM_EXFAT 0x04
|
#define FM_EXFAT 0x04
|
||||||
#define FM_ANY 0x07
|
#define FM_ANY 0x07
|
||||||
#define FM_SFD 0x08
|
#define FM_SFD 0x08
|
||||||
#define FM_PRF2 0x10
|
|
||||||
|
|
||||||
/* Filesystem type (FATFS.fs_type) */
|
/* Filesystem type (FATFS.fs_type) */
|
||||||
#define FS_FAT12 1
|
#define FS_FAT12 1
|
||||||
|
|||||||
@@ -155,7 +155,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/*Log settings*/
|
/*Log settings*/
|
||||||
#ifdef DEBUG_UART_LV_LOG
|
#ifdef DEBUG_UART_PORT
|
||||||
# define USE_LV_LOG 1 /*Enable/disable the log module*/
|
# define USE_LV_LOG 1 /*Enable/disable the log module*/
|
||||||
#else
|
#else
|
||||||
# define USE_LV_LOG 0 /*Enable/disable the log module*/
|
# define USE_LV_LOG 0 /*Enable/disable the log module*/
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ void lv_log_add(lv_log_level_t level, const char * file, int line, const char *
|
|||||||
|
|
||||||
if(level >= LV_LOG_LEVEL) {
|
if(level >= LV_LOG_LEVEL) {
|
||||||
|
|
||||||
#if LV_LOG_PRINTF && defined(DEBUG_UART_PORT)
|
#if LV_LOG_PRINTF
|
||||||
static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error"};
|
static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error"};
|
||||||
char *log = (char *)malloc(0x1000);
|
char *log = (char *)malloc(0x1000);
|
||||||
s_printf(log, "%s: %s \t(%s #%d)\r\n", lvl_prefix[level], dsc, file, line);
|
s_printf(log, "%s: %s \t(%s #%d)\r\n", lvl_prefix[level], dsc, file, line);
|
||||||
|
|||||||
@@ -34,7 +34,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||||||
|
|
||||||
#include "save.h"
|
#include "save.h"
|
||||||
|
|
||||||
#include <bdk.h>
|
#include <gfx_utils.h>
|
||||||
|
#include <mem/heap.h>
|
||||||
|
#include <rtc/max77620-rtc.h>
|
||||||
|
#include <sec/se.h>
|
||||||
|
#include <storage/nx_sd.h>
|
||||||
|
#include <utils/ini.h>
|
||||||
|
#include <utils/sprintf.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|||||||
@@ -99,9 +99,10 @@ bool save_data_file_write(save_data_file_ctx_t *ctx, uint64_t *out_bytes_written
|
|||||||
if (!save_data_file_validate_write_params(ctx, offset, count, ctx->mode, &is_resize_needed))
|
if (!save_data_file_validate_write_params(ctx, offset, count, ctx->mode, &is_resize_needed))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!save_data_file_set_size(ctx, offset + count))
|
if (is_resize_needed) {
|
||||||
return false;
|
if (!save_data_file_set_size(ctx, offset + count))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
*out_bytes_written = save_allocation_table_storage_write(&ctx->base_storage, buffer, offset, count);
|
*out_bytes_written = save_allocation_table_storage_write(&ctx->base_storage, buffer, offset, count);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -15,7 +15,6 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <memory_map.h>
|
|
||||||
#include <mem/mc.h>
|
#include <mem/mc.h>
|
||||||
#include <soc/t210.h>
|
#include <soc/t210.h>
|
||||||
#include <soc/clock.h>
|
#include <soc/clock.h>
|
||||||
@@ -125,13 +124,13 @@ void mc_config_carveout()
|
|||||||
MC(MC_SECURITY_CARVEOUT5_CFG0) = 0x8F;
|
MC(MC_SECURITY_CARVEOUT5_CFG0) = 0x8F;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mc_enable_ahb_redirect(bool full_aperture)
|
void mc_enable_ahb_redirect()
|
||||||
{
|
{
|
||||||
// Enable ARC_CLK_OVR_ON.
|
// Enable ARC_CLK_OVR_ON.
|
||||||
CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) = (CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) & 0xFFF7FFFF) | 0x80000;
|
CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) = (CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) & 0xFFF7FFFF) | 0x80000;
|
||||||
//MC(MC_IRAM_REG_CTRL) &= 0xFFFFFFFE;
|
//MC(MC_IRAM_REG_CTRL) &= 0xFFFFFFFE;
|
||||||
MC(MC_IRAM_BOM) = 0x40000000;
|
MC(MC_IRAM_BOM) = 0x40000000;
|
||||||
MC(MC_IRAM_TOM) = full_aperture ? DRAM_START : 0x4003F000;
|
MC(MC_IRAM_TOM) = 0x4003F000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mc_disable_ahb_redirect()
|
void mc_disable_ahb_redirect()
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
void mc_config_tsec_carveout(u32 bom, u32 size1mb, bool lock);
|
void mc_config_tsec_carveout(u32 bom, u32 size1mb, bool lock);
|
||||||
void mc_config_carveout();
|
void mc_config_carveout();
|
||||||
void mc_config_carveout_finalize();
|
void mc_config_carveout_finalize();
|
||||||
void mc_enable_ahb_redirect(bool full_aperture);
|
void mc_enable_ahb_redirect();
|
||||||
void mc_disable_ahb_redirect();
|
void mc_disable_ahb_redirect();
|
||||||
void mc_enable();
|
void mc_enable();
|
||||||
|
|
||||||
|
|||||||
@@ -464,19 +464,11 @@
|
|||||||
#define MC_UNTRANSLATED_REGION_CHECK 0x948
|
#define MC_UNTRANSLATED_REGION_CHECK 0x948
|
||||||
#define MC_DA_CONFIG0 0x9dc
|
#define MC_DA_CONFIG0 0x9dc
|
||||||
|
|
||||||
// MC_VIDEO_PROTECT_REG_CTRL
|
|
||||||
#define VPR_LOCK_MODE_SHIFT 0
|
|
||||||
#define VPR_CTRL_UNLOCKED (0 << VPR_LOCK_MODE_SHIFT)
|
|
||||||
#define VPR_CTRL_LOCKED (1 << VPR_LOCK_MODE_SHIFT)
|
|
||||||
#define VPR_PROTECT_MODE_SHIFT 1
|
|
||||||
#define SEC_CTRL_SECURE (0 << VPR_PROTECT_MODE_SHIFT)
|
|
||||||
#define VPR_CTRL_TZ_SECURE (1 << VPR_PROTECT_MODE_SHIFT)
|
|
||||||
|
|
||||||
// MC_SECURITY_CARVEOUTX_CFG0
|
// MC_SECURITY_CARVEOUTX_CFG0
|
||||||
// Mode of LOCK_MODE.
|
// Mode of LOCK_MODE.
|
||||||
#define PROTECT_MODE_SHIFT 0
|
#define PROTECT_MODE_SHIFT 0
|
||||||
#define SEC_CARVEOUT_CFG_SECURE (0 << PROTECT_MODE_SHIFT)
|
#define SEC_CARVEOUT_CFG_SECURE (0 << PROTECT_MODE_SHIFT0)
|
||||||
#define SEC_CARVEOUT_CFG_TZ_SECURE (1 << PROTECT_MODE_SHIFT)
|
#define SEC_CARVEOUT_CFG_TZ_SECURE (1 << PROTECT_MODE_SHIFT0)
|
||||||
// Enables PROTECT_MODE.
|
// Enables PROTECT_MODE.
|
||||||
#define LOCK_MODE_SHIFT 1
|
#define LOCK_MODE_SHIFT 1
|
||||||
#define SEC_CARVEOUT_CFG_UNLOCKED (0 << LOCK_MODE_SHIFT)
|
#define SEC_CARVEOUT_CFG_UNLOCKED (0 << LOCK_MODE_SHIFT)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2022 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
|
|
||||||
#include "minerva.h"
|
#include "minerva.h"
|
||||||
|
|
||||||
|
#include <soc/clock.h>
|
||||||
#include <ianos/ianos.h>
|
#include <ianos/ianos.h>
|
||||||
#include <mem/emc.h>
|
|
||||||
#include <soc/clock.h>
|
#include <soc/clock.h>
|
||||||
#include <soc/fuse.h>
|
#include <soc/fuse.h>
|
||||||
#include <soc/hw_init.h>
|
#include <soc/hw_init.h>
|
||||||
@@ -42,7 +42,7 @@ u32 minerva_init()
|
|||||||
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210B01)
|
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210B01)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifdef BDK_MINERVA_CFG_FROM_RAM
|
#ifdef NYX
|
||||||
// Set table to nyx storage.
|
// Set table to nyx storage.
|
||||||
mtc_cfg->mtc_table = (emc_table_t *)nyx_str->mtc_table;
|
mtc_cfg->mtc_table = (emc_table_t *)nyx_str->mtc_table;
|
||||||
|
|
||||||
@@ -97,29 +97,28 @@ u32 minerva_init()
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
// Get current frequency
|
// Get current frequency
|
||||||
u32 current_emc_clk_src = CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC);
|
|
||||||
for (curr_ram_idx = 0; curr_ram_idx < 10; curr_ram_idx++)
|
for (curr_ram_idx = 0; curr_ram_idx < 10; curr_ram_idx++)
|
||||||
{
|
{
|
||||||
if (current_emc_clk_src == mtc_cfg->mtc_table[curr_ram_idx].clk_src_emc)
|
if (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) == mtc_cfg->mtc_table[curr_ram_idx].clk_src_emc)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtc_cfg->rate_from = mtc_cfg->mtc_table[curr_ram_idx].rate_khz;
|
mtc_cfg->rate_from = mtc_cfg->mtc_table[curr_ram_idx].rate_khz;
|
||||||
mtc_cfg->rate_to = FREQ_204;
|
mtc_cfg->rate_to = 204000;
|
||||||
mtc_cfg->train_mode = OP_TRAIN;
|
mtc_cfg->train_mode = OP_TRAIN;
|
||||||
minerva_cfg(mtc_cfg, NULL);
|
minerva_cfg(mtc_cfg, NULL);
|
||||||
mtc_cfg->rate_to = FREQ_800;
|
mtc_cfg->rate_to = 800000;
|
||||||
minerva_cfg(mtc_cfg, NULL);
|
minerva_cfg(mtc_cfg, NULL);
|
||||||
mtc_cfg->rate_to = FREQ_1600;
|
mtc_cfg->rate_to = 1600000;
|
||||||
minerva_cfg(mtc_cfg, NULL);
|
minerva_cfg(mtc_cfg, NULL);
|
||||||
|
|
||||||
// FSP WAR.
|
// FSP WAR.
|
||||||
mtc_cfg->train_mode = OP_SWITCH;
|
mtc_cfg->train_mode = OP_SWITCH;
|
||||||
mtc_cfg->rate_to = FREQ_800;
|
mtc_cfg->rate_to = 800000;
|
||||||
minerva_cfg(mtc_cfg, NULL);
|
minerva_cfg(mtc_cfg, NULL);
|
||||||
|
|
||||||
// Switch to max.
|
// Switch to max.
|
||||||
mtc_cfg->rate_to = FREQ_1600;
|
mtc_cfg->rate_to = 1600000;
|
||||||
minerva_cfg(mtc_cfg, NULL);
|
minerva_cfg(mtc_cfg, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -140,56 +139,6 @@ void minerva_change_freq(minerva_freq_t freq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void minerva_prep_boot_freq()
|
|
||||||
{
|
|
||||||
if (!minerva_cfg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mtc_config_t *mtc_cfg = (mtc_config_t *)&nyx_str->mtc_cfg;
|
|
||||||
|
|
||||||
// Check if there's RAM OC. If not exit.
|
|
||||||
if (mtc_cfg->mtc_table[mtc_cfg->table_entries - 1].rate_khz == FREQ_1600)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// FSP WAR.
|
|
||||||
minerva_change_freq(FREQ_204);
|
|
||||||
// Scale down to 800 MHz boot freq.
|
|
||||||
minerva_change_freq(FREQ_800);
|
|
||||||
}
|
|
||||||
|
|
||||||
void minerva_prep_boot_l4t()
|
|
||||||
{
|
|
||||||
if (!minerva_cfg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mtc_config_t *mtc_cfg = (mtc_config_t *)&nyx_str->mtc_cfg;
|
|
||||||
|
|
||||||
// Set init frequency.
|
|
||||||
minerva_change_freq(FREQ_204);
|
|
||||||
|
|
||||||
// Train the rest of the frequencies.
|
|
||||||
mtc_cfg->train_mode = OP_TRAIN;
|
|
||||||
for (u32 i = 0; i < mtc_cfg->table_entries; i++)
|
|
||||||
{
|
|
||||||
mtc_cfg->rate_to = mtc_cfg->mtc_table[i].rate_khz;
|
|
||||||
// Skip already trained frequencies.
|
|
||||||
if (mtc_cfg->rate_to == FREQ_204 || mtc_cfg->rate_to == FREQ_800 || mtc_cfg->rate_to == FREQ_1600)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Train frequency.
|
|
||||||
minerva_cfg(mtc_cfg, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do FSP WAR and scale to 800 MHz as boot freq.
|
|
||||||
bool fsp_opwr_enabled = !!(EMC(EMC_MRW3) & 0xC0);
|
|
||||||
if (fsp_opwr_enabled)
|
|
||||||
minerva_change_freq(FREQ_666);
|
|
||||||
minerva_change_freq(FREQ_800);
|
|
||||||
|
|
||||||
// Do not let other mtc ops.
|
|
||||||
mtc_cfg->init_done = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void minerva_periodic_training()
|
void minerva_periodic_training()
|
||||||
{
|
{
|
||||||
if (!minerva_cfg)
|
if (!minerva_cfg)
|
||||||
@@ -201,13 +150,4 @@ void minerva_periodic_training()
|
|||||||
mtc_cfg->train_mode = OP_PERIODIC_TRAIN;
|
mtc_cfg->train_mode = OP_PERIODIC_TRAIN;
|
||||||
minerva_cfg(mtc_cfg, NULL);
|
minerva_cfg(mtc_cfg, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
emc_table_t *minerva_get_mtc_table()
|
|
||||||
{
|
|
||||||
if (!minerva_cfg)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
mtc_config_t *mtc_cfg = (mtc_config_t *)&nyx_str->mtc_cfg;
|
|
||||||
return mtc_cfg->mtc_table;
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2022 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -27,8 +27,8 @@
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 rate_to;
|
s32 rate_to;
|
||||||
u32 rate_from;
|
s32 rate_from;
|
||||||
emc_table_t *mtc_table;
|
emc_table_t *mtc_table;
|
||||||
u32 table_entries;
|
u32 table_entries;
|
||||||
emc_table_t *current_emc_table;
|
emc_table_t *current_emc_table;
|
||||||
@@ -53,7 +53,6 @@ enum train_mode_t
|
|||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
FREQ_204 = 204000,
|
FREQ_204 = 204000,
|
||||||
FREQ_666 = 665600,
|
|
||||||
FREQ_800 = 800000,
|
FREQ_800 = 800000,
|
||||||
FREQ_1600 = 1600000
|
FREQ_1600 = 1600000
|
||||||
} minerva_freq_t;
|
} minerva_freq_t;
|
||||||
@@ -61,9 +60,6 @@ typedef enum
|
|||||||
extern void (*minerva_cfg)(mtc_config_t *mtc_cfg, void *);
|
extern void (*minerva_cfg)(mtc_config_t *mtc_cfg, void *);
|
||||||
u32 minerva_init();
|
u32 minerva_init();
|
||||||
void minerva_change_freq(minerva_freq_t freq);
|
void minerva_change_freq(minerva_freq_t freq);
|
||||||
void minerva_prep_boot_freq();
|
|
||||||
void minerva_prep_boot_l4t();
|
|
||||||
void minerva_periodic_training();
|
void minerva_periodic_training();
|
||||||
emc_table_t *minerva_get_mtc_table();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
142
bdk/mem/sdram.c
142
bdk/mem/sdram.c
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 balika011
|
* Copyright (c) 2018 balika011
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -36,46 +36,22 @@
|
|||||||
|
|
||||||
#define CONFIG_SDRAM_KEEP_ALIVE
|
#define CONFIG_SDRAM_KEEP_ALIVE
|
||||||
|
|
||||||
|
//#define CONFIG_SDRAM_COMPRESS_CFG
|
||||||
|
|
||||||
typedef struct _sdram_vendor_patch_t
|
typedef struct _sdram_vendor_patch_t
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
u32 offset:16;
|
u32 addr:10;
|
||||||
u32 dramcf:16;
|
u32 dramid:22;
|
||||||
} sdram_vendor_patch_t;
|
} sdram_vendor_patch_t;
|
||||||
|
|
||||||
static const u8 dram_encoding_t210b01[] = {
|
#ifdef CONFIG_SDRAM_COMPRESS_CFG
|
||||||
LPDDR4X_UNUSED,
|
#include <libs/compr/lz.h>
|
||||||
LPDDR4X_UNUSED,
|
#include "sdram_config_lz.inl"
|
||||||
LPDDR4X_UNUSED,
|
#else
|
||||||
LPDDR4X_4GB_HYNIX_1Y_A,
|
#include "sdram_config.inl"
|
||||||
LPDDR4X_UNUSED,
|
#endif
|
||||||
LPDDR4X_4GB_HYNIX_1Y_A,
|
|
||||||
LPDDR4X_4GB_HYNIX_1Y_A,
|
|
||||||
LPDDR4X_4GB_SAMSUNG_X1X2,
|
|
||||||
LPDDR4X_NO_PATCH,
|
|
||||||
LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ,
|
|
||||||
LPDDR4X_NO_PATCH,
|
|
||||||
LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE,
|
|
||||||
LPDDR4X_NO_PATCH,
|
|
||||||
LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ,
|
|
||||||
LPDDR4X_NO_PATCH,
|
|
||||||
LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE,
|
|
||||||
LPDDR4X_4GB_SAMSUNG_Y,
|
|
||||||
LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL,
|
|
||||||
LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL,
|
|
||||||
LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL,
|
|
||||||
LPDDR4X_4GB_SAMSUNG_1Y_Y,
|
|
||||||
LPDDR4X_8GB_SAMSUNG_1Y_Y,
|
|
||||||
LPDDR4X_UNUSED, // Removed.
|
|
||||||
LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL,
|
|
||||||
LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL,
|
|
||||||
LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF,
|
|
||||||
LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF,
|
|
||||||
LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF,
|
|
||||||
LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL,
|
|
||||||
};
|
|
||||||
|
|
||||||
#include "sdram_config.inl"
|
|
||||||
#include "sdram_config_t210b01.inl"
|
#include "sdram_config_t210b01.inl"
|
||||||
|
|
||||||
static bool _sdram_wait_emc_status(u32 reg_offset, u32 bit_mask, bool updated_state, s32 emc_channel)
|
static bool _sdram_wait_emc_status(u32 reg_offset, u32 bit_mask, bool updated_state, s32 emc_channel)
|
||||||
@@ -1374,21 +1350,57 @@ static void _sdram_config_t210b01(const sdram_params_t210b01_t *params)
|
|||||||
SYSREG(AHB_ARBITRATION_XBAR_CTRL) = (SYSREG(AHB_ARBITRATION_XBAR_CTRL) & 0xFFFEFFFF) | (params->ahb_arbitration_xbar_ctrl_meminit_done << 16);
|
SYSREG(AHB_ARBITRATION_XBAR_CTRL) = (SYSREG(AHB_ARBITRATION_XBAR_CTRL) & 0xFFFEFFFF) | (params->ahb_arbitration_xbar_ctrl_meminit_done << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_SDRAM_COMPRESS_CFG
|
||||||
|
static void _sdram_patch_model_params_t210(u32 dramid, u32 *params)
|
||||||
|
{
|
||||||
|
for (u32 i = 0; i < ARRAY_SIZE(sdram_cfg_vendor_patches_t210); i++)
|
||||||
|
if (sdram_cfg_vendor_patches_t210[i].dramid & DRAM_ID(dramid))
|
||||||
|
params[sdram_cfg_vendor_patches_t210[i].addr] = sdram_cfg_vendor_patches_t210[i].val;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void _sdram_patch_model_params_t210b01(u32 dramid, u32 *params)
|
||||||
|
{
|
||||||
|
for (u32 i = 0; i < ARRAY_SIZE(sdram_cfg_vendor_patches_t210b01); i++)
|
||||||
|
if (sdram_cfg_vendor_patches_t210b01[i].dramid & DRAM_ID2(dramid))
|
||||||
|
params[sdram_cfg_vendor_patches_t210b01[i].addr] = sdram_cfg_vendor_patches_t210b01[i].val;
|
||||||
|
}
|
||||||
|
|
||||||
static void *_sdram_get_params_t210()
|
static void *_sdram_get_params_t210()
|
||||||
{
|
{
|
||||||
// Check if id is proper.
|
// Check if id is proper.
|
||||||
u32 dramid = fuse_read_dramid(false);
|
u32 dramid = fuse_read_dramid(false);
|
||||||
|
|
||||||
// Copy base parameters.
|
#ifdef CONFIG_SDRAM_COMPRESS_CFG
|
||||||
u32 *params = (u32 *)SDRAM_PARAMS_ADDR;
|
|
||||||
memcpy(params, &_dram_cfg_0_samsung_4gb, sizeof(sdram_params_t210_t));
|
|
||||||
|
|
||||||
// Patch parameters if needed.
|
u8 *buf = (u8 *)SDRAM_PARAMS_ADDR;
|
||||||
for (u32 i = 0; i < ARRAY_SIZE(sdram_cfg_vendor_patches_t210); i++)
|
LZ_Uncompress(_dram_cfg_lz, buf, sizeof(_dram_cfg_lz));
|
||||||
if (sdram_cfg_vendor_patches_t210[i].dramcf & DRAM_ID(dramid))
|
return (void *)&buf[sizeof(sdram_params_t210_t) * dramid];
|
||||||
params[sdram_cfg_vendor_patches_t210[i].offset] = sdram_cfg_vendor_patches_t210[i].val;
|
|
||||||
|
|
||||||
return (void *)params;
|
#else
|
||||||
|
|
||||||
|
u32 *buf = (u32 *)SDRAM_PARAMS_ADDR;
|
||||||
|
memcpy(buf, &_dram_cfg_0_samsung_4gb, sizeof(sdram_params_t210_t));
|
||||||
|
|
||||||
|
switch (dramid)
|
||||||
|
{
|
||||||
|
case LPDDR4_ICOSA_4GB_SAMSUNG_K4F6E304HB_MGCH:
|
||||||
|
case LPDDR4_ICOSA_4GB_MICRON_MT53B512M32D2NP_062_WT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LPDDR4_ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE:
|
||||||
|
case LPDDR4_ICOSA_6GB_SAMSUNG_K4FHE3D4HM_MGCH:
|
||||||
|
#ifdef CONFIG_SDRAM_COPPER_SUPPORT
|
||||||
|
case LPDDR4_COPPER_4GB_SAMSUNG_K4F6E304HB_MGCH:
|
||||||
|
case LPDDR4_COPPER_4GB_HYNIX_H9HCNNNBPUMLHR_NLE:
|
||||||
|
case LPDDR4_COPPER_4GB_MICRON_MT53B512M32D2NP_062_WT:
|
||||||
|
#endif
|
||||||
|
_sdram_patch_model_params_t210(dramid, (u32 *)buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (void *)buf;
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void *sdram_get_params_t210b01()
|
void *sdram_get_params_t210b01()
|
||||||
@@ -1396,20 +1408,38 @@ void *sdram_get_params_t210b01()
|
|||||||
// Check if id is proper.
|
// Check if id is proper.
|
||||||
u32 dramid = fuse_read_dramid(false);
|
u32 dramid = fuse_read_dramid(false);
|
||||||
|
|
||||||
// Copy base parameters.
|
u32 *buf = (u32 *)SDRAM_PARAMS_ADDR;
|
||||||
u32 *params = (u32 *)SDRAM_PARAMS_ADDR;
|
memcpy(buf, &_dram_cfg_08_10_12_14_samsung_hynix_4gb, sizeof(sdram_params_t210b01_t));
|
||||||
memcpy(params, &_dram_cfg_08_10_12_14_samsung_hynix_4gb, sizeof(sdram_params_t210b01_t));
|
|
||||||
|
|
||||||
// Patch parameters if needed.
|
switch (dramid)
|
||||||
u8 dram_code = dram_encoding_t210b01[dramid];
|
{
|
||||||
if (!dram_code)
|
case LPDDR4X_IOWA_4GB_SAMSUNG_K4U6E3S4AM_MGCJ:
|
||||||
return (void *)params;
|
case LPDDR4X_IOWA_4GB_HYNIX_H9HCNNNBKMMLHR_NME:
|
||||||
|
case LPDDR4X_HOAG_4GB_SAMSUNG_K4U6E3S4AM_MGCJ:
|
||||||
|
case LPDDR4X_HOAG_4GB_HYNIX_H9HCNNNBKMMLHR_NME:
|
||||||
|
break;
|
||||||
|
|
||||||
for (u32 i = 0; i < ARRAY_SIZE(sdram_cfg_vendor_patches_t210b01); i++)
|
case LPDDR4X_IOWA_4GB_SAMSUNG_X1X2:
|
||||||
if (sdram_cfg_vendor_patches_t210b01[i].dramcf == dram_code)
|
case LPDDR4X_IOWA_8GB_SAMSUNG_K4UBE3D4AM_MGCJ:
|
||||||
params[sdram_cfg_vendor_patches_t210b01[i].offset] = sdram_cfg_vendor_patches_t210b01[i].val;
|
case LPDDR4X_IOWA_4GB_MICRON_MT53E512M32D2NP_046_WT:
|
||||||
|
case LPDDR4X_HOAG_8GB_SAMSUNG_K4UBE3D4AM_MGCJ:
|
||||||
return (void *)params;
|
case LPDDR4X_HOAG_4GB_MICRON_MT53E512M32D2NP_046_WT:
|
||||||
|
case LPDDR4X_IOWA_4GB_SAMSUNG_Y:
|
||||||
|
case LPDDR4X_IOWA_4GB_SAMSUNG_1Y_X:
|
||||||
|
case LPDDR4X_IOWA_8GB_SAMSUNG_1Y_X:
|
||||||
|
case LPDDR4X_HOAG_4GB_SAMSUNG_1Y_X:
|
||||||
|
case LPDDR4X_IOWA_4GB_SAMSUNG_1Y_Y:
|
||||||
|
case LPDDR4X_IOWA_8GB_SAMSUNG_1Y_Y:
|
||||||
|
case LPDDR4X_AULA_4GB_SAMSUNG_1Y_A:
|
||||||
|
case LPDDR4X_AULA_8GB_SAMSUNG_1Y_X:
|
||||||
|
case LPDDR4X_AULA_4GB_SAMSUNG_1Y_X:
|
||||||
|
case LPDDR4X_IOWA_4GB_MICRON_1Y_A:
|
||||||
|
case LPDDR4X_HOAG_4GB_MICRON_1Y_A:
|
||||||
|
case LPDDR4X_AULA_4GB_MICRON_1Y_A:
|
||||||
|
_sdram_patch_model_params_t210b01(dramid, (u32 *)buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (void *)buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1455,7 +1485,7 @@ static void _sdram_init_t210()
|
|||||||
const sdram_params_t210_t *params = (const sdram_params_t210_t *)_sdram_get_params_t210();
|
const sdram_params_t210_t *params = (const sdram_params_t210_t *)_sdram_get_params_t210();
|
||||||
|
|
||||||
// Set DRAM voltage.
|
// Set DRAM voltage.
|
||||||
max7762x_regulator_set_voltage(REGULATOR_SD1, 1100000); // HOS uses 1.125V
|
max7762x_regulator_set_voltage(REGULATOR_SD1, 1100000);
|
||||||
|
|
||||||
// VDDP Select.
|
// VDDP Select.
|
||||||
PMC(APBDEV_PMC_VDDP_SEL) = params->pmc_vddp_sel;
|
PMC(APBDEV_PMC_VDDP_SEL) = params->pmc_vddp_sel;
|
||||||
|
|||||||
106
bdk/mem/sdram.h
106
bdk/mem/sdram.h
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2020-2021 CTCaer
|
* Copyright (c) 2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -23,26 +23,20 @@
|
|||||||
/*
|
/*
|
||||||
* Tegra X1/X1+ EMC/DRAM Bandwidth Chart:
|
* Tegra X1/X1+ EMC/DRAM Bandwidth Chart:
|
||||||
*
|
*
|
||||||
* Note: BWbits T210 = Hz x ddr x bus width x channels = Hz x 2 x 32 x 2.
|
* 40.8 MHz: 0.61 GiB/s
|
||||||
* BWbits T210B01 = Hz x ddr x bus width x channels = Hz x 2 x 64 x 2.
|
* 68.0 MHz: 1.01 GiB/s
|
||||||
* Both assume that both sub-partitions are used and thus reaching max
|
* 102.0 MHz: 1.52 GiB/s
|
||||||
* bandwidth per channel. (T210: 2x16-bit, T210B01: 2x32-bit).
|
* 204.0 MHz: 3.04 GiB/s <-- Tegra X1/X1+ Init/SC7 Frequency
|
||||||
* Retail Mariko use one sub-partition, in order to meet Erista perf.
|
* 408.0 MHz: 6.08 GiB/s
|
||||||
*
|
* 665.6 MHz: 9.92 GiB/s
|
||||||
* T210 T210B01
|
* 800.0 MHz: 11.92 GiB/s <-- Tegra X1/X1+ Nvidia OS Boot Frequency
|
||||||
* 40.8 MHz: 0.61 1.22 GiB/s
|
* 1065.6 MHz: 15.89 GiB/s
|
||||||
* 68.0 MHz: 1.01 2.02 GiB/s
|
* 1331.2 MHz: 19.84 GiB/s
|
||||||
* 102.0 MHz: 1.52 3.04 GiB/s
|
* 1600.0 MHz: 23.84 GiB/s <-- Tegra X1 Official Max Frequency
|
||||||
* 204.0 MHz: 3.04 6.08 GiB/s <-- Tegra X1/X1+ Init/SC7 Frequency
|
* 1862.4 MHz: 27.75 GiB/s <-- Tegra X1+ Official Max Frequency
|
||||||
* 408.0 MHz: 6.08 12.16 GiB/s
|
* 2131.2 MHz: 31.76 GiB/s
|
||||||
* 665.6 MHz: 9.92 19.84 GiB/s
|
|
||||||
* 800.0 MHz: 11.92 23.84 GiB/s <-- Tegra X1/X1+ Nvidia OS Boot Frequency
|
|
||||||
* 1065.6 MHz: 15.89 31.78 GiB/s
|
|
||||||
* 1331.2 MHz: 19.84 39.68 GiB/s
|
|
||||||
* 1600.0 MHz: 23.84 47.68 GiB/s <-- Tegra X1/X1+ HOS Max Frequency
|
|
||||||
* 1862.4 MHz: 27.75 55.50 GiB/s <-- Tegra X1 Official Max Frequency
|
|
||||||
* 2131.2 MHz: 31.76 63.52 GiB/s <-- Tegra X1+ Official Max Frequency
|
|
||||||
*
|
*
|
||||||
|
* Note: BWbits = Hz x bus width x channels = Hz x 64 x 2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum sdram_ids_erista
|
enum sdram_ids_erista
|
||||||
@@ -50,74 +44,46 @@ enum sdram_ids_erista
|
|||||||
// LPDDR4 3200Mbps.
|
// LPDDR4 3200Mbps.
|
||||||
LPDDR4_ICOSA_4GB_SAMSUNG_K4F6E304HB_MGCH = 0,
|
LPDDR4_ICOSA_4GB_SAMSUNG_K4F6E304HB_MGCH = 0,
|
||||||
LPDDR4_ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE = 1,
|
LPDDR4_ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE = 1,
|
||||||
LPDDR4_ICOSA_4GB_MICRON_MT53B512M32D2NP_062_WT = 2, // WT:C.
|
LPDDR4_ICOSA_4GB_MICRON_MT53B512M32D2NP_062_WT = 2,
|
||||||
LPDDR4_COPPER_4GB_SAMSUNG_K4F6E304HB_MGCH = 3, // Changed to Iowa Hynix 4GB 1Y-A.
|
LPDDR4_COPPER_4GB_SAMSUNG_K4F6E304HB_MGCH = 3, // Changed to AULA Hynix 4GB 1Y-A.
|
||||||
LPDDR4_ICOSA_6GB_SAMSUNG_K4FHE3D4HM_MGCH = 4,
|
LPDDR4_ICOSA_6GB_SAMSUNG_K4FHE3D4HM_MGCH = 4,
|
||||||
LPDDR4_COPPER_4GB_HYNIX_H9HCNNNBPUMLHR_NLE = 5, // Changed to Hoag Hynix 4GB 1Y-A.
|
LPDDR4_COPPER_4GB_HYNIX_H9HCNNNBPUMLHR_NLE = 5,
|
||||||
LPDDR4_COPPER_4GB_MICRON_MT53B512M32D2NP_062_WT = 6, // Changed to Aula Hynix 4GB 1Y-A.
|
LPDDR4_COPPER_4GB_MICRON_MT53B512M32D2NP_062_WT = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sdram_ids_mariko
|
enum sdram_ids_mariko
|
||||||
{
|
{
|
||||||
// LPDDR4X 4266Mbps.
|
|
||||||
LPDDR4X_IOWA_4GB_HYNIX_1Y_A = 3, // Replaced from Copper.
|
|
||||||
LPDDR4X_HOAG_4GB_HYNIX_1Y_A = 5, // Replaced from Copper.
|
|
||||||
LPDDR4X_AULA_4GB_HYNIX_1Y_A = 6, // Replaced from Copper.
|
|
||||||
|
|
||||||
// LPDDR4X 3733Mbps.
|
// LPDDR4X 3733Mbps.
|
||||||
LPDDR4X_IOWA_4GB_SAMSUNG_X1X2 = 7,
|
LPDDR4X_IOWA_4GB_SAMSUNG_X1X2 = 7,
|
||||||
|
|
||||||
LPDDR4X_IOWA_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 8, // Die-M.
|
LPDDR4X_IOWA_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 8,
|
||||||
LPDDR4X_IOWA_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 9, // Die-M.
|
LPDDR4X_IOWA_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 9,
|
||||||
LPDDR4X_IOWA_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 10, // Die-M.
|
LPDDR4X_IOWA_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 10,
|
||||||
LPDDR4X_IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE = 11, // 4266Mbps. Die-E.
|
LPDDR4X_IOWA_4GB_MICRON_MT53E512M32D2NP_046_WT = 11, // 4266Mbps.
|
||||||
|
|
||||||
LPDDR4X_HOAG_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 12, // Die-M.
|
LPDDR4X_HOAG_4GB_SAMSUNG_K4U6E3S4AM_MGCJ = 12,
|
||||||
LPDDR4X_HOAG_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 13, // Die-M.
|
LPDDR4X_HOAG_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 13,
|
||||||
LPDDR4X_HOAG_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 14, // Die-M.
|
LPDDR4X_HOAG_4GB_HYNIX_H9HCNNNBKMMLHR_NME = 14,
|
||||||
LPDDR4X_HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE = 15, // 4266Mbps. Die-E.
|
LPDDR4X_HOAG_4GB_MICRON_MT53E512M32D2NP_046_WT = 15, // 4266Mbps.
|
||||||
|
|
||||||
// LPDDR4X 4266Mbps.
|
// LPDDR4X 4266Mbps?
|
||||||
LPDDR4X_IOWA_4GB_SAMSUNG_Y = 16,
|
LPDDR4X_IOWA_4GB_SAMSUNG_Y = 16,
|
||||||
|
|
||||||
LPDDR4X_IOWA_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 17, // Die-A.
|
LPDDR4X_IOWA_4GB_SAMSUNG_1Y_X = 17,
|
||||||
LPDDR4X_IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 18, // Die-A.
|
LPDDR4X_IOWA_8GB_SAMSUNG_1Y_X = 18,
|
||||||
LPDDR4X_HOAG_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 19, // Die-A.
|
LPDDR4X_HOAG_4GB_SAMSUNG_1Y_X = 19,
|
||||||
|
|
||||||
LPDDR4X_IOWA_4GB_SAMSUNG_1Y_Y = 20,
|
LPDDR4X_IOWA_4GB_SAMSUNG_1Y_Y = 20,
|
||||||
LPDDR4X_IOWA_8GB_SAMSUNG_1Y_Y = 21,
|
LPDDR4X_IOWA_8GB_SAMSUNG_1Y_Y = 21,
|
||||||
|
|
||||||
// LPDDR4X_AULA_8GB_SAMSUNG_1Y_A = 22, // Unused.
|
LPDDR4X_AULA_4GB_SAMSUNG_1Y_A = 22,
|
||||||
|
|
||||||
LPDDR4X_HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 23, // Die-A.
|
LPDDR4X_AULA_8GB_SAMSUNG_1Y_X = 23,
|
||||||
LPDDR4X_AULA_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 24, // Die-A.
|
LPDDR4X_AULA_4GB_SAMSUNG_1Y_X = 24,
|
||||||
|
|
||||||
LPDDR4X_IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTF = 25, // 4266Mbps. Die-F.
|
LPDDR4X_IOWA_4GB_MICRON_1Y_A = 25,
|
||||||
LPDDR4X_HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTF = 26, // 4266Mbps. Die-F.
|
LPDDR4X_HOAG_4GB_MICRON_1Y_A = 26,
|
||||||
LPDDR4X_AULA_4GB_MICRON_MT53E512M32D2NP_046_WTF = 27, // 4266Mbps. Die-F.
|
LPDDR4X_AULA_4GB_MICRON_1Y_A = 27
|
||||||
|
|
||||||
LPDDR4X_AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 28, // Die-A.
|
|
||||||
};
|
|
||||||
|
|
||||||
enum sdram_codes_mariko
|
|
||||||
{
|
|
||||||
LPDDR4X_NO_PATCH = 0,
|
|
||||||
LPDDR4X_UNUSED = 0,
|
|
||||||
|
|
||||||
// LPDDR4X_4GB_SAMSUNG_K4U6E3S4AM_MGCJ DRAM IDs: 08, 12.
|
|
||||||
// LPDDR4X_4GB_HYNIX_H9HCNNNBKMMLHR_NME DRAM IDs: 10, 14.
|
|
||||||
|
|
||||||
LPDDR4X_4GB_SAMSUNG_X1X2 = 1, // DRAM IDs: 07.
|
|
||||||
LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ = 2, // DRAM IDs: 09, 13.
|
|
||||||
LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE = 3, // DRAM IDs: 11, 15.
|
|
||||||
LPDDR4X_4GB_SAMSUNG_Y = 4, // DRAM IDs: 16.
|
|
||||||
LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL = 5, // DRAM IDs: 17, 19, 24.
|
|
||||||
LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL = 6, // DRAM IDs: 18, 23, 28.
|
|
||||||
LPDDR4X_4GB_SAMSUNG_1Y_Y = 7, // DRAM IDs: 20.
|
|
||||||
LPDDR4X_8GB_SAMSUNG_1Y_Y = 8, // DRAM IDs: 21.
|
|
||||||
//LPDDR4X_8GB_SAMSUNG_1Y_A = 9, // DRAM IDs: 22. Unused.
|
|
||||||
LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF = 10, // DRAM IDs: 25, 26, 27.
|
|
||||||
LPDDR4X_4GB_HYNIX_1Y_A = 11, // DRAM IDs: 03, 05, 06.
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void sdram_init();
|
void sdram_init();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2020-2021 CTCaer
|
* Copyright (c) 2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -646,51 +646,46 @@ static const sdram_params_t210_t _dram_cfg_0_samsung_4gb = {
|
|||||||
|
|
||||||
static const sdram_vendor_patch_t sdram_cfg_vendor_patches_t210[] = {
|
static const sdram_vendor_patch_t sdram_cfg_vendor_patches_t210[] = {
|
||||||
// Hynix timing config.
|
// Hynix timing config.
|
||||||
{ 0x0000000D, 0x10C / 4, DRAM_ID(1) }, // emc_r2w.
|
{ 0x0000000D, 67, DRAM_ID(1) | DRAM_ID(5) }, // emc_r2w.
|
||||||
{ 0x00000001, 0x16C / 4, DRAM_ID(1) }, // emc_puterm_extra.
|
{ 0x00000001, 91, DRAM_ID(1) | DRAM_ID(5) }, // emc_puterm_extra.
|
||||||
{ 0x80000000, 0x170 / 4, DRAM_ID(1) }, // emc_puterm_width.
|
{ 0x80000000, 92, DRAM_ID(1) | DRAM_ID(5) }, // emc_puterm_width.
|
||||||
{ 0x00000210, 0x4F4 / 4, DRAM_ID(1) }, // emc_pmacro_data_rx_term_mode.
|
{ 0x00000210, 317, DRAM_ID(1) | DRAM_ID(5) }, // emc_pmacro_data_rx_term_mode.
|
||||||
{ 0x00000005, 0x5C0 / 4, DRAM_ID(1) }, // mc_emem_arb_timing_r2w.
|
{ 0x00000005, 368, DRAM_ID(1) | DRAM_ID(5) }, // mc_emem_arb_timing_r2w.
|
||||||
|
|
||||||
// Samsung 6GB density config.
|
// Samsung 6GB density config.
|
||||||
{ 0x000C0302, 0x56C / 4, DRAM_ID(4) }, // mc_emem_adr_cfg_dev0. 768MB Rank 0 density.
|
{ 0x000C0302, 347, DRAM_ID(4) }, // mc_emem_adr_cfg_dev0. 768MB Rank 0 density.
|
||||||
{ 0x000C0302, 0x570 / 4, DRAM_ID(4) }, // mc_emem_adr_cfg_dev1. 768MB Rank 1 density.
|
{ 0x000C0302, 348, DRAM_ID(4) }, // mc_emem_adr_cfg_dev1. 768MB Rank 1 density.
|
||||||
{ 0x00001800, 0x584 / 4, DRAM_ID(4) }, // mc_emem_cfg. 6GB total density.
|
{ 0x00001800, 353, DRAM_ID(4) }, // mc_emem_cfg. 6GB total density.
|
||||||
|
|
||||||
#ifdef CONFIG_SDRAM_COPPER_SUPPORT
|
#ifdef CONFIG_SDRAM_COPPER_SUPPORT
|
||||||
// Copper prototype Samsung/Hynix/Micron timing configs.
|
// Copper prototype Samsung/Hynix/Micron timing configs.
|
||||||
{ 0x0000003A, 0xEC / 4, DRAM_ID(6) }, // emc_rfc. Auto refresh.
|
{ 0x0000003A, 59, DRAM_ID(6) }, // emc_rfc. Auto refresh.
|
||||||
{ 0x0000001D, 0xF0 / 4, DRAM_ID(6) }, // emc_rfc_pb. Bank Auto refresh.
|
{ 0x0000001D, 60, DRAM_ID(6) }, // emc_rfc_pb. Bank Auto refresh.
|
||||||
{ 0x0000000D, 0x10C / 4, DRAM_ID(5) }, // emc_r2w.
|
{ 0x00000012, 108, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_rw2pden.
|
||||||
{ 0x00000001, 0x16C / 4, DRAM_ID(5) }, // emc_puterm_extra.
|
{ 0x0000003B, 112, DRAM_ID(6) }, // emc_txsr.
|
||||||
{ 0x80000000, 0x170 / 4, DRAM_ID(5) }, // emc_puterm_width.
|
{ 0x0000003B, 113, DRAM_ID(6) }, // emc_txsr_dll.
|
||||||
{ 0x00000012, 0x1B0 / 4, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_rw2pden.
|
{ 0x00000003, 119, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_tclkstable.
|
||||||
{ 0x0000003B, 0x1C0 / 4, DRAM_ID(6) }, // emc_txsr.
|
{ 0x00120015, 205, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
||||||
{ 0x0000003B, 0x1C4 / 4, DRAM_ID(6) }, // emc_txsr_dll.
|
{ 0x00160012, 206, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank0_5.
|
||||||
{ 0x00000003, 0x1DC / 4, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_tclkstable.
|
{ 0x00120015, 211, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
||||||
{ 0x00120015, 0x334 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
{ 0x00160012, 212, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank1_5.
|
||||||
{ 0x00160012, 0x338 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank0_5.
|
{ 0x002F0032, 213, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00120015, 0x34C / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
{ 0x00310032, 214, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00160012, 0x350 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dq_rank1_5.
|
{ 0x00360034, 215, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
||||||
{ 0x002F0032, 0x354 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
{ 0x0033002F, 216, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_3.
|
||||||
{ 0x00310032, 0x358 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
{ 0x00000006, 217, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
||||||
{ 0x00360034, 0x35C / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
{ 0x002F0032, 219, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
||||||
{ 0x0033002F, 0x360 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_3.
|
{ 0x00310032, 220, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00000006, 0x364 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
{ 0x00360034, 221, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
||||||
{ 0x002F0032, 0x36C / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
{ 0x0033002F, 222, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_3.
|
||||||
{ 0x00310032, 0x370 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
{ 0x00000006, 223, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
||||||
{ 0x00360034, 0x374 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
{ 0x00150015, 233, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_0.
|
||||||
{ 0x0033002F, 0x378 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_3.
|
{ 0x00120012, 235, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_2.
|
||||||
{ 0x00000006, 0x37C / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
{ 0x00160016, 236, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_3.
|
||||||
{ 0x00150015, 0x3A4 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_0.
|
{ 0x00000015, 237, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_4.
|
||||||
{ 0x00120012, 0x3AC / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_2.
|
{ 0x00000012, 295, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_cmd_brlshft2.
|
||||||
{ 0x00160016, 0x3B0 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_3.
|
{ 0x00000012, 296, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_cmd_brlshft3.
|
||||||
{ 0x00000015, 0x3B4 / 4, DRAM_ID(5) | DRAM_ID(6) }, // emc_pmacro_ddll_long_cmd_4.
|
{ 0x00000007, 370, DRAM_ID(6) }, // mc_emem_arb_timing_rfcpb. Bank refresh.
|
||||||
{ 0x00000012, 0x49C / 4, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_cmd_brlshft2.
|
{ 0x72A30504, 373, DRAM_ID(6) }, // mc_emem_arb_misc0.
|
||||||
{ 0x00000012, 0x4A0 / 4, DRAM_ID(3) | DRAM_ID(5) | DRAM_ID(6) }, // emc_cmd_brlshft3.
|
|
||||||
{ 0x00000210, 0x4F4 / 4, DRAM_ID(5) }, // emc_pmacro_data_rx_term_mode.
|
|
||||||
{ 0x00000005, 0x5C0 / 4, DRAM_ID(5) }, // mc_emem_arb_timing_r2w.
|
|
||||||
{ 0x00000007, 0x5C8 / 4, DRAM_ID(6) }, // mc_emem_arb_timing_rfcpb. Bank refresh.
|
|
||||||
{ 0x72A30504, 0x5D4 / 4, DRAM_ID(6) }, // mc_emem_arb_misc0.
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|||||||
124
bdk/mem/sdram_config_lz.inl
Normal file
124
bdk/mem/sdram_config_lz.inl
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 naehrwert
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const u8 _dram_cfg_lz[1262] = {
|
||||||
|
0x17, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00,
|
||||||
|
0x00, 0x2C, 0x17, 0x04, 0x09, 0x00, 0x17, 0x04, 0x04, 0x17, 0x08, 0x08,
|
||||||
|
0x17, 0x10, 0x10, 0x00, 0x00, 0x68, 0xBC, 0x01, 0x70, 0x0A, 0x00, 0x00,
|
||||||
|
0x00, 0x04, 0xB4, 0x01, 0x70, 0x01, 0x32, 0x54, 0x76, 0xC8, 0xE6, 0x00,
|
||||||
|
0x70, 0x17, 0x10, 0x24, 0x34, 0x00, 0x00, 0x00, 0x02, 0x80, 0x18, 0x40,
|
||||||
|
0x00, 0x00, 0x00, 0x17, 0x04, 0x04, 0x17, 0x09, 0x18, 0xFF, 0xFF, 0x1F,
|
||||||
|
0x00, 0xD8, 0x51, 0x1A, 0xA0, 0x00, 0x00, 0x50, 0x05, 0x00, 0x00, 0x77,
|
||||||
|
0x00, 0x17, 0x04, 0x04, 0x17, 0x08, 0x08, 0x17, 0x08, 0x08, 0xA6, 0xA6,
|
||||||
|
0xAF, 0xB3, 0x3C, 0x9E, 0x00, 0x00, 0x03, 0x03, 0xE0, 0xC1, 0x04, 0x04,
|
||||||
|
0x04, 0x04, 0x17, 0x04, 0x04, 0x17, 0x04, 0x3C, 0x1F, 0x1F, 0x1F, 0x1F,
|
||||||
|
0x17, 0x04, 0x04, 0x17, 0x06, 0x06, 0x00, 0x00, 0x04, 0x08, 0x17, 0x06,
|
||||||
|
0x46, 0xA1, 0x01, 0x00, 0x00, 0x32, 0x17, 0x0B, 0x64, 0x01, 0x17, 0x04,
|
||||||
|
0x7C, 0x17, 0x07, 0x0C, 0x03, 0x17, 0x04, 0x04, 0x00, 0x00, 0x00, 0x1E,
|
||||||
|
0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x13,
|
||||||
|
0x17, 0x0B, 0x2C, 0x09, 0x00, 0x00, 0x00, 0x17, 0x05, 0x5D, 0x17, 0x07,
|
||||||
|
0x10, 0x0B, 0x17, 0x07, 0x28, 0x08, 0x17, 0x07, 0x0C, 0x17, 0x04, 0x1C,
|
||||||
|
0x20, 0x00, 0x00, 0x00, 0x06, 0x17, 0x04, 0x04, 0x17, 0x07, 0x08, 0x17,
|
||||||
|
0x04, 0x50, 0x17, 0x04, 0x2C, 0x17, 0x04, 0x1C, 0x17, 0x04, 0x10, 0x17,
|
||||||
|
0x08, 0x6C, 0x17, 0x04, 0x10, 0x17, 0x04, 0x38, 0x17, 0x04, 0x40, 0x05,
|
||||||
|
0x17, 0x07, 0x1C, 0x17, 0x08, 0x58, 0x17, 0x04, 0x24, 0x17, 0x04, 0x18,
|
||||||
|
0x17, 0x08, 0x64, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14,
|
||||||
|
0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x17, 0x09, 0x0C, 0x17, 0x05, 0x82,
|
||||||
|
0x58, 0x17, 0x07, 0x61, 0xC1, 0x17, 0x07, 0x50, 0x17, 0x04, 0x04, 0x17,
|
||||||
|
0x08, 0x81, 0x48, 0x17, 0x04, 0x04, 0x17, 0x04, 0x28, 0x17, 0x04, 0x60,
|
||||||
|
0x17, 0x08, 0x54, 0x27, 0x17, 0x04, 0x04, 0x17, 0x07, 0x14, 0x17, 0x04,
|
||||||
|
0x04, 0x04, 0x17, 0x07, 0x81, 0x58, 0x17, 0x0C, 0x0C, 0x1C, 0x03, 0x00,
|
||||||
|
0x00, 0x0D, 0xA0, 0x60, 0x91, 0xBF, 0x3B, 0x17, 0x04, 0x5A, 0xF3, 0x0C,
|
||||||
|
0x04, 0x05, 0x1B, 0x06, 0x02, 0x03, 0x07, 0x1C, 0x23, 0x25, 0x25, 0x05,
|
||||||
|
0x08, 0x1D, 0x09, 0x0A, 0x24, 0x0B, 0x1E, 0x0D, 0x0C, 0x26, 0x26, 0x03,
|
||||||
|
0x02, 0x1B, 0x1C, 0x23, 0x03, 0x04, 0x07, 0x05, 0x06, 0x25, 0x25, 0x02,
|
||||||
|
0x0A, 0x0B, 0x1D, 0x0D, 0x08, 0x0C, 0x09, 0x1E, 0x24, 0x26, 0x26, 0x08,
|
||||||
|
0x24, 0x06, 0x07, 0x9A, 0x12, 0x17, 0x05, 0x83, 0x41, 0x00, 0xFF, 0x17,
|
||||||
|
0x10, 0x83, 0x6C, 0x04, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00,
|
||||||
|
0x00, 0x0D, 0x08, 0x00, 0x00, 0x00, 0xC0, 0x71, 0x71, 0x03, 0x08, 0x00,
|
||||||
|
0x00, 0x0B, 0x08, 0x72, 0x72, 0x0E, 0x0C, 0x17, 0x04, 0x20, 0x08, 0x08,
|
||||||
|
0x0D, 0x0C, 0x00, 0x00, 0x0D, 0x0C, 0x14, 0x14, 0x16, 0x08, 0x17, 0x06,
|
||||||
|
0x2C, 0x11, 0x08, 0x17, 0x10, 0x84, 0x67, 0x15, 0x00, 0xCC, 0x00, 0x0A,
|
||||||
|
0x00, 0x33, 0x00, 0x00, 0x00, 0x20, 0xF3, 0x05, 0x08, 0x11, 0x00, 0xFF,
|
||||||
|
0x0F, 0xFF, 0x0F, 0x17, 0x08, 0x83, 0x4C, 0x01, 0x03, 0x00, 0x70, 0x00,
|
||||||
|
0x0C, 0x00, 0x01, 0x17, 0x04, 0x0C, 0x08, 0x44, 0x00, 0x10, 0x04, 0x04,
|
||||||
|
0x00, 0x06, 0x13, 0x07, 0x00, 0x80, 0x17, 0x04, 0x10, 0xA0, 0x00, 0x2C,
|
||||||
|
0x00, 0x01, 0x37, 0x00, 0x00, 0x00, 0x80, 0x17, 0x06, 0x48, 0x08, 0x00,
|
||||||
|
0x04, 0x00, 0x1F, 0x22, 0x20, 0x80, 0x0F, 0xF4, 0x20, 0x02, 0x28, 0x28,
|
||||||
|
0x28, 0x28, 0x17, 0x04, 0x04, 0x11, 0x11, 0x11, 0x11, 0x17, 0x04, 0x04,
|
||||||
|
0xBE, 0x00, 0x00, 0x17, 0x05, 0x58, 0x17, 0x08, 0x5C, 0x17, 0x22, 0x85,
|
||||||
|
0x6A, 0x17, 0x1A, 0x1A, 0x14, 0x00, 0x12, 0x00, 0x10, 0x17, 0x05, 0x83,
|
||||||
|
0x0A, 0x17, 0x16, 0x18, 0x30, 0x00, 0x2E, 0x00, 0x33, 0x00, 0x30, 0x00,
|
||||||
|
0x33, 0x00, 0x35, 0x00, 0x30, 0x00, 0x32, 0x17, 0x05, 0x83, 0x0C, 0x17,
|
||||||
|
0x04, 0x20, 0x17, 0x18, 0x18, 0x28, 0x00, 0x28, 0x17, 0x04, 0x04, 0x17,
|
||||||
|
0x08, 0x08, 0x17, 0x10, 0x10, 0x00, 0x14, 0x17, 0x05, 0x5A, 0x17, 0x04,
|
||||||
|
0x5C, 0x17, 0x04, 0x5E, 0x17, 0x04, 0x0E, 0x17, 0x0E, 0x78, 0x17, 0x09,
|
||||||
|
0x82, 0x50, 0x40, 0x06, 0x00, 0xCC, 0x00, 0x09, 0x00, 0x4F, 0x00, 0x51,
|
||||||
|
0x17, 0x08, 0x18, 0x80, 0x01, 0x00, 0x00, 0x40, 0x17, 0x04, 0x20, 0x03,
|
||||||
|
0x00, 0x00, 0x00, 0xAB, 0x00, 0x0A, 0x04, 0x11, 0x17, 0x08, 0x82, 0x58,
|
||||||
|
0x17, 0x0C, 0x38, 0x17, 0x1B, 0x81, 0x6C, 0x17, 0x08, 0x85, 0x60, 0x17,
|
||||||
|
0x08, 0x86, 0x50, 0x17, 0x08, 0x86, 0x60, 0x17, 0x06, 0x83, 0x21, 0x22,
|
||||||
|
0x04, 0xFF, 0xFF, 0xAF, 0x4F, 0x17, 0x0C, 0x86, 0x74, 0x17, 0x08, 0x2C,
|
||||||
|
0x8B, 0xFF, 0x07, 0x17, 0x06, 0x81, 0x04, 0x32, 0x54, 0x76, 0x10, 0x47,
|
||||||
|
0x32, 0x65, 0x10, 0x34, 0x76, 0x25, 0x01, 0x34, 0x67, 0x25, 0x01, 0x75,
|
||||||
|
0x64, 0x32, 0x01, 0x72, 0x56, 0x34, 0x10, 0x23, 0x74, 0x56, 0x01, 0x45,
|
||||||
|
0x32, 0x67, 0x17, 0x04, 0x24, 0x49, 0x92, 0x24, 0x17, 0x04, 0x04, 0x17,
|
||||||
|
0x11, 0x7C, 0x1B, 0x17, 0x04, 0x04, 0x17, 0x13, 0x81, 0x14, 0x2F, 0x41,
|
||||||
|
0x13, 0x1F, 0x14, 0x00, 0x01, 0x00, 0x17, 0x04, 0x7C, 0xFF, 0xFF, 0xFF,
|
||||||
|
0x7F, 0x0B, 0xD7, 0x06, 0x40, 0x00, 0x00, 0x02, 0x00, 0x08, 0x08, 0x03,
|
||||||
|
0x00, 0x00, 0x5C, 0x01, 0x00, 0x10, 0x10, 0x10, 0x17, 0x06, 0x86, 0x59,
|
||||||
|
0x17, 0x0F, 0x89, 0x14, 0x37, 0x17, 0x07, 0x82, 0x72, 0x10, 0x17, 0x06,
|
||||||
|
0x83, 0x0D, 0x00, 0x11, 0x01, 0x17, 0x05, 0x85, 0x39, 0x17, 0x04, 0x0E,
|
||||||
|
0x0A, 0x17, 0x07, 0x89, 0x29, 0x17, 0x04, 0x1B, 0x17, 0x08, 0x86, 0x77,
|
||||||
|
0x17, 0x09, 0x12, 0x20, 0x00, 0x00, 0x00, 0x81, 0x10, 0x09, 0x28, 0x93,
|
||||||
|
0x32, 0xA5, 0x44, 0x5B, 0x8A, 0x67, 0x76, 0x17, 0x18, 0x82, 0x2C, 0xFF,
|
||||||
|
0xEF, 0xFF, 0xEF, 0xC0, 0xC0, 0xC0, 0xC0, 0x17, 0x04, 0x04, 0xDC, 0xDC,
|
||||||
|
0xDC, 0xDC, 0x0A, 0x0A, 0x0A, 0x0A, 0x17, 0x04, 0x04, 0x17, 0x04, 0x04,
|
||||||
|
0x17, 0x05, 0x82, 0x24, 0x03, 0x07, 0x17, 0x04, 0x04, 0x00, 0x00, 0x24,
|
||||||
|
0xFF, 0xFF, 0x00, 0x44, 0x57, 0x6E, 0x00, 0x28, 0x72, 0x39, 0x00, 0x10,
|
||||||
|
0x9C, 0x4B, 0x17, 0x04, 0x64, 0x01, 0x00, 0x00, 0x08, 0x4C, 0x00, 0x00,
|
||||||
|
0x80, 0x20, 0x10, 0x0A, 0x00, 0x28, 0x10, 0x17, 0x06, 0x85, 0x60, 0x17,
|
||||||
|
0x10, 0x82, 0x74, 0x17, 0x08, 0x08, 0x17, 0x08, 0x88, 0x00, 0x17, 0x04,
|
||||||
|
0x10, 0x04, 0x17, 0x0B, 0x87, 0x6C, 0x01, 0x00, 0x02, 0x02, 0x01, 0x02,
|
||||||
|
0x03, 0x00, 0x04, 0x05, 0xC3, 0x71, 0x0F, 0x0F, 0x17, 0x08, 0x8B, 0x18,
|
||||||
|
0x1F, 0x17, 0x09, 0x81, 0x73, 0x00, 0xFF, 0x00, 0xFF, 0x17, 0x05, 0x86,
|
||||||
|
0x48, 0x17, 0x04, 0x0C, 0x17, 0x07, 0x86, 0x34, 0x00, 0x00, 0xF0, 0x17,
|
||||||
|
0x09, 0x87, 0x54, 0x43, 0xC3, 0xBA, 0xE4, 0xD3, 0x1E, 0x17, 0x0C, 0x81,
|
||||||
|
0x52, 0x17, 0x0A, 0x1C, 0x17, 0x10, 0x81, 0x6C, 0x17, 0x0A, 0x82, 0x21,
|
||||||
|
0x17, 0x07, 0x82, 0x4D, 0x17, 0x0A, 0x8A, 0x1B, 0x17, 0x11, 0x2C, 0x76,
|
||||||
|
0x0C, 0x17, 0x0A, 0x8A, 0x67, 0x17, 0x0F, 0x84, 0x28, 0x17, 0x06, 0x34,
|
||||||
|
0x17, 0x17, 0x3A, 0x7E, 0x16, 0x40, 0x17, 0x0C, 0x8B, 0x1F, 0x17, 0x2A,
|
||||||
|
0x38, 0x1E, 0x17, 0x0A, 0x38, 0x17, 0x13, 0x81, 0x28, 0x00, 0xC0, 0x17,
|
||||||
|
0x17, 0x55, 0x46, 0x24, 0x17, 0x0A, 0x81, 0x28, 0x17, 0x14, 0x38, 0x17,
|
||||||
|
0x18, 0x81, 0x60, 0x46, 0x2C, 0x17, 0x06, 0x38, 0xEC, 0x17, 0x0D, 0x16,
|
||||||
|
0x17, 0x0E, 0x82, 0x3C, 0x17, 0x82, 0x0C, 0x8E, 0x68, 0x17, 0x04, 0x24,
|
||||||
|
0x17, 0x5C, 0x8E, 0x68, 0x17, 0x07, 0x82, 0x5F, 0x80, 0x17, 0x87, 0x01,
|
||||||
|
0x8E, 0x68, 0x02, 0x17, 0x81, 0x4A, 0x8E, 0x68, 0x17, 0x0C, 0x87, 0x78,
|
||||||
|
0x17, 0x85, 0x28, 0x8E, 0x68, 0x17, 0x8E, 0x68, 0x9D, 0x50, 0x17, 0x81,
|
||||||
|
0x24, 0x8E, 0x68, 0x17, 0x04, 0x2C, 0x17, 0x28, 0x8E, 0x68, 0x17, 0x04,
|
||||||
|
0x30, 0x17, 0x85, 0x3C, 0x8E, 0x68, 0x12, 0x17, 0x07, 0x85, 0x70, 0x17,
|
||||||
|
0x88, 0x74, 0x8E, 0x68, 0x17, 0x87, 0x3E, 0x9D, 0x50, 0x0C, 0x17, 0x04,
|
||||||
|
0x04, 0x17, 0x12, 0x8E, 0x68, 0x18, 0x17, 0x87, 0x12, 0xBB, 0x20, 0x17,
|
||||||
|
0x83, 0x04, 0x9D, 0x50, 0x15, 0x17, 0x05, 0x8D, 0x76, 0x17, 0x0F, 0x8B,
|
||||||
|
0x49, 0x17, 0x0B, 0x18, 0x32, 0x00, 0x2F, 0x00, 0x32, 0x00, 0x31, 0x00,
|
||||||
|
0x34, 0x00, 0x36, 0x00, 0x2F, 0x00, 0x33, 0x17, 0x09, 0x84, 0x0C, 0x17,
|
||||||
|
0x18, 0x18, 0x17, 0x20, 0x8E, 0x68, 0x15, 0x17, 0x07, 0x5A, 0x17, 0x06,
|
||||||
|
0x5E, 0x16, 0x00, 0x15, 0x17, 0x82, 0x40, 0x9D, 0x50, 0x17, 0x86, 0x5F,
|
||||||
|
0xBB, 0x20, 0x3A, 0x00, 0x00, 0x00, 0x1D, 0x17, 0x81, 0x4F, 0xAC, 0x38,
|
||||||
|
0x3B, 0x17, 0x04, 0x04, 0x17, 0x86, 0x30, 0x8E, 0x68, 0x17, 0x81, 0x53,
|
||||||
|
0xAC, 0x38, 0x07, 0x17, 0x0D, 0x8E, 0x68, 0xA3, 0x72, 0x17, 0x83, 0x10,
|
||||||
|
0x8E, 0x68
|
||||||
|
};
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2021 CTCaer
|
* Copyright (c) 2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
#define DRAM_CFG_T210B01_SIZE 2104
|
#define DRAM_CFG_T210B01_SIZE 2104
|
||||||
|
|
||||||
|
#define DRAM_ID2(x) BIT((x) - 7)
|
||||||
|
|
||||||
static const sdram_params_t210b01_t _dram_cfg_08_10_12_14_samsung_hynix_4gb = {
|
static const sdram_params_t210b01_t _dram_cfg_08_10_12_14_samsung_hynix_4gb = {
|
||||||
/* Specifies the type of memory device */
|
/* Specifies the type of memory device */
|
||||||
.memory_type = MEMORY_TYPE_LPDDR4,
|
.memory_type = MEMORY_TYPE_LPDDR4,
|
||||||
@@ -107,7 +109,7 @@ static const sdram_params_t210b01_t _dram_cfg_08_10_12_14_samsung_hynix_4gb = {
|
|||||||
.emc_pmacro_ca_tx_drive = 0x3F3F3F3F,
|
.emc_pmacro_ca_tx_drive = 0x3F3F3F3F,
|
||||||
.emc_pmacro_cmd_tx_drive = 0x00001220,
|
.emc_pmacro_cmd_tx_drive = 0x00001220,
|
||||||
.emc_pmacro_auto_cal_common = 0x00000804,
|
.emc_pmacro_auto_cal_common = 0x00000804,
|
||||||
.emc_pmacro_zcrtl = 0x00505050,
|
.emc_pmacro_zcrtl = 0x505050,
|
||||||
|
|
||||||
/* Specifies the time for the calibration to stabilize (in microseconds) */
|
/* Specifies the time for the calibration to stabilize (in microseconds) */
|
||||||
.emc_auto_cal_wait = 0x000001A1,
|
.emc_auto_cal_wait = 0x000001A1,
|
||||||
@@ -706,287 +708,295 @@ static const sdram_params_t210b01_t _dram_cfg_08_10_12_14_samsung_hynix_4gb = {
|
|||||||
static const sdram_vendor_patch_t sdram_cfg_vendor_patches_t210b01[] = {
|
static const sdram_vendor_patch_t sdram_cfg_vendor_patches_t210b01[] = {
|
||||||
|
|
||||||
// Samsung LPDDR4X 4GB X1X2 for prototype Iowa.
|
// Samsung LPDDR4X 4GB X1X2 for prototype Iowa.
|
||||||
{ 0x000E0022, 0x3AC / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
{ 0x000E0022, 0x3AC / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
||||||
{ 0x001B0010, 0x3B0 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dq_rank0_5.
|
{ 0x001B0010, 0x3B0 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dq_rank0_5.
|
||||||
{ 0x000E0022, 0x3C4 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
{ 0x000E0022, 0x3C4 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
||||||
{ 0x001B0010, 0x3C8 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dq_rank1_5.
|
{ 0x001B0010, 0x3C8 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dq_rank1_5.
|
||||||
{ 0x00490043, 0x3CC / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
{ 0x00490043, 0x3CC / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00420045, 0x3D0 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
{ 0x00420045, 0x3D0 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00490047, 0x3D4 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
{ 0x00490047, 0x3D4 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
||||||
{ 0x00460047, 0x3D8 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank0_3.
|
{ 0x00460047, 0x3D8 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank0_3.
|
||||||
{ 0x00000016, 0x3DC / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
{ 0x00000016, 0x3DC / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
||||||
{ 0x00100000, 0x3E0 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank0_5.
|
{ 0x00100000, 0x3E0 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank0_5.
|
||||||
{ 0x00490043, 0x3E4 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
{ 0x00490043, 0x3E4 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
||||||
{ 0x00420045, 0x3E8 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
{ 0x00420045, 0x3E8 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00490047, 0x3EC / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
{ 0x00490047, 0x3EC / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
||||||
{ 0x00460047, 0x3F0 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank1_3.
|
{ 0x00460047, 0x3F0 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank1_3.
|
||||||
{ 0x00000016, 0x3F4 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
{ 0x00000016, 0x3F4 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
||||||
{ 0x00100000, 0x3F8 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ob_ddll_long_dqs_rank1_5.
|
{ 0x00100000, 0x3F8 / 4, DRAM_ID2(7) }, // emc_pmacro_ob_ddll_long_dqs_rank1_5.
|
||||||
{ 0x00220022, 0x41C / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ddll_long_cmd_0.
|
{ 0x00220022, 0x41C / 4, DRAM_ID2(7) }, // emc_pmacro_ddll_long_cmd_0.
|
||||||
{ 0x000E000E, 0x420 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ddll_long_cmd_1.
|
{ 0x000E000E, 0x420 / 4, DRAM_ID2(7) }, // emc_pmacro_ddll_long_cmd_1.
|
||||||
{ 0x00100010, 0x424 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ddll_long_cmd_2.
|
{ 0x00100010, 0x424 / 4, DRAM_ID2(7) }, // emc_pmacro_ddll_long_cmd_2.
|
||||||
{ 0x001B001B, 0x428 / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ddll_long_cmd_3.
|
{ 0x001B001B, 0x428 / 4, DRAM_ID2(7) }, // emc_pmacro_ddll_long_cmd_3.
|
||||||
{ 0x00000022, 0x42C / 4, LPDDR4X_4GB_SAMSUNG_X1X2 }, // emc_pmacro_ddll_long_cmd_4.
|
{ 0x00000022, 0x42C / 4, DRAM_ID2(7) }, // emc_pmacro_ddll_long_cmd_4.
|
||||||
|
|
||||||
// Samsung LPDDR4X 8GB K4UBE3D4AM-MGCJ Die-M for SDEV Iowa and Hoag.
|
// Samsung LPDDR4X 8GB K4UBE3D4AM-MGCJ for SDEV Iowa and Hoag.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x00000001, 0x134 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_adr_cfg. 2 Ranks.
|
{ 0x00000001, 0x134 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_adr_cfg. 2 Ranks.
|
||||||
{ 0x00000006, 0x1CC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_quse.
|
{ 0x00000006, 0x1CC / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_quse.
|
||||||
{ 0x00000005, 0x1D0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_quse_width.
|
{ 0x00000005, 0x1D0 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_quse_width.
|
||||||
{ 0x00000003, 0x1DC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_einput.
|
{ 0x00000003, 0x1DC / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_einput.
|
||||||
{ 0x0000000C, 0x1E0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_einput_duration.
|
{ 0x0000000C, 0x1E0 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_einput_duration.
|
||||||
{ 0x08010004, 0x2B8 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw1.
|
{ 0x08010004, 0x2B8 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw1.
|
||||||
{ 0x08020000, 0x2BC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw2.
|
{ 0x08020000, 0x2BC / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw2.
|
||||||
{ 0x080D0000, 0x2C0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw3.
|
{ 0x080D0000, 0x2C0 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw3.
|
||||||
{ 0x08033131, 0x2C8 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw6.
|
{ 0x08033131, 0x2C8 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw6.
|
||||||
{ 0x080B0000, 0x2CC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw8.
|
{ 0x080B0000, 0x2CC / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw8.
|
||||||
{ 0x0C0E5D5D, 0x2D0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw9.
|
{ 0x0C0E5D5D, 0x2D0 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw9.
|
||||||
{ 0x080C5D5D, 0x2D4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw10.
|
{ 0x080C5D5D, 0x2D4 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw10.
|
||||||
{ 0x0C0D0808, 0x2D8 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw12.
|
{ 0x0C0D0808, 0x2D8 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw12.
|
||||||
{ 0x0C0D0000, 0x2DC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw13.
|
{ 0x0C0D0000, 0x2DC / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw13.
|
||||||
{ 0x08161414, 0x2E0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw14.
|
{ 0x08161414, 0x2E0 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw14.
|
||||||
{ 0x08010004, 0x2E4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_mrw_extra.
|
{ 0x08010004, 0x2E4 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_mrw_extra.
|
||||||
{ 0x00000000, 0x340 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_dev_select. Both devices.
|
{ 0x00000000, 0x340 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_dev_select. Both devices.
|
||||||
{ 0x35353535, 0x350 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_vref_dq_0.
|
{ 0x35353535, 0x350 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_vref_dq_0.
|
||||||
{ 0x35353535, 0x354 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_vref_dq_1.
|
{ 0x35353535, 0x354 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_vref_dq_1.
|
||||||
{ 0x00100010, 0x3FC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank0_0.
|
{ 0x00100010, 0x3FC / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00100010, 0x400 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank0_1.
|
{ 0x00100010, 0x400 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00100010, 0x404 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank0_2.
|
{ 0x00100010, 0x404 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank0_2.
|
||||||
{ 0x00100010, 0x408 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank0_3.
|
{ 0x00100010, 0x408 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank0_3.
|
||||||
{ 0x00100010, 0x40C / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank1_0.
|
{ 0x00100010, 0x40C / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank1_0.
|
||||||
{ 0x00100010, 0x410 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank1_1.
|
{ 0x00100010, 0x410 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00100010, 0x414 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank1_2.
|
{ 0x00100010, 0x414 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank1_2.
|
||||||
{ 0x00100010, 0x418 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_ib_ddll_long_dqs_rank1_3.
|
{ 0x00100010, 0x418 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_ib_ddll_long_dqs_rank1_3.
|
||||||
{ 0x0051004F, 0x450 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_zcal_mrw_cmd.
|
{ 0x0051004F, 0x450 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_zcal_mrw_cmd.
|
||||||
{ 0x40000001, 0x45C / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_zcal_init_dev1.
|
{ 0x40000001, 0x45C / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_zcal_init_dev1.
|
||||||
{ 0x00000000, 0x594 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_tx_pwrd4.
|
{ 0x00000000, 0x594 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_tx_pwrd4.
|
||||||
{ 0x00001000, 0x598 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // emc_pmacro_tx_pwrd5.
|
{ 0x00001000, 0x598 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // emc_pmacro_tx_pwrd5.
|
||||||
{ 0x00000001, 0x630 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // mc_emem_adr_cfg. 2 Ranks.
|
{ 0x00000001, 0x630 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // mc_emem_adr_cfg. 2 Ranks.
|
||||||
{ 0x00002000, 0x64C / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // mc_emem_cfg. 8GB total density.
|
{ 0x00002000, 0x64C / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // mc_emem_cfg. 8GB total density.
|
||||||
{ 0x00000002, 0x680 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // mc_emem_arb_timing_r2r.
|
{ 0x00000002, 0x680 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // mc_emem_arb_timing_r2r.
|
||||||
{ 0x02020001, 0x694 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // mc_emem_arb_da_turns.
|
{ 0x02020001, 0x694 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // mc_emem_arb_da_turns.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(9) | DRAM_ID2(13) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
// Micron LPDDR4X 4GB MT53D1024M32D1NP-053-WT:E Die-E for retail Iowa and Hoag.
|
// Micron LPDDR4X 4GB MT53D1024M32D1NP-053-WT for Iowa and Hoag.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(11) | DRAM_ID2(15) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(11) | DRAM_ID2(15) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x88161414, 0x2E0 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE }, // emc_mrw14.
|
{ 0x88161414, 0x2E0 / 4, DRAM_ID2(11) | DRAM_ID2(15) }, // emc_mrw14.
|
||||||
{ 0x80000713, 0x32C / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE }, // emc_dyn_self_ref_control.
|
{ 0x80000713, 0x32C / 4, DRAM_ID2(11) | DRAM_ID2(15) }, // emc_dyn_self_ref_control.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(11) | DRAM_ID2(15) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(11) | DRAM_ID2(15) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
// Samsung LPDDR4X 4GB (Y01) Die-? for Iowa.
|
// Samsung LPDDR4X 4GB Die-Y for Iowa.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(16) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(16) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x88161414, 0x2E0 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_mrw14.
|
{ 0x88161414, 0x2E0 / 4, DRAM_ID2(16) }, // emc_mrw14.
|
||||||
{ 0x80000713, 0x32C / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_dyn_self_ref_control.
|
{ 0x80000713, 0x32C / 4, DRAM_ID2(16) }, // emc_dyn_self_ref_control.
|
||||||
{ 0x32323232, 0x350 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_vref_dq_0.
|
{ 0x32323232, 0x350 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_vref_dq_0.
|
||||||
{ 0x32323232, 0x354 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_vref_dq_1.
|
{ 0x32323232, 0x354 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_vref_dq_1.
|
||||||
{ 0x000F0018, 0x3AC / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
{ 0x000F0018, 0x3AC / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
||||||
{ 0x000F0018, 0x3C4 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
{ 0x000F0018, 0x3C4 / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
||||||
{ 0x00440048, 0x3CC / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
{ 0x00440048, 0x3CC / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00440045, 0x3D0 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
{ 0x00440045, 0x3D0 / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00470047, 0x3D4 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
{ 0x00470047, 0x3D4 / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
||||||
{ 0x0005000D, 0x3DC / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
{ 0x0005000D, 0x3DC / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
||||||
{ 0x00440048, 0x3E4 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
{ 0x00440048, 0x3E4 / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
||||||
{ 0x00440045, 0x3E8 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
{ 0x00440045, 0x3E8 / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00470047, 0x3EC / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
{ 0x00470047, 0x3EC / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
||||||
{ 0x0005000D, 0x3F4 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
{ 0x0005000D, 0x3F4 / 4, DRAM_ID2(16) }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
||||||
{ 0x00780078, 0x3FC / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank0_0.
|
{ 0x00780078, 0x3FC / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00780078, 0x400 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank0_1.
|
{ 0x00780078, 0x400 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00780078, 0x404 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank0_2.
|
{ 0x00780078, 0x404 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank0_2.
|
||||||
{ 0x00780078, 0x408 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank0_3.
|
{ 0x00780078, 0x408 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank0_3.
|
||||||
{ 0x00780078, 0x40C / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank1_0.
|
{ 0x00780078, 0x40C / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank1_0.
|
||||||
{ 0x00780078, 0x410 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank1_1.
|
{ 0x00780078, 0x410 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00780078, 0x414 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank1_2.
|
{ 0x00780078, 0x414 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank1_2.
|
||||||
{ 0x00780078, 0x418 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ib_ddll_long_dqs_rank1_3.
|
{ 0x00780078, 0x418 / 4, DRAM_ID2(16) }, // emc_pmacro_ib_ddll_long_dqs_rank1_3.
|
||||||
{ 0x00180018, 0x41C / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ddll_long_cmd_0.
|
{ 0x00180018, 0x41C / 4, DRAM_ID2(16) }, // emc_pmacro_ddll_long_cmd_0.
|
||||||
{ 0x000F000F, 0x420 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ddll_long_cmd_1.
|
{ 0x000F000F, 0x420 / 4, DRAM_ID2(16) }, // emc_pmacro_ddll_long_cmd_1.
|
||||||
{ 0x00000018, 0x42C / 4, LPDDR4X_4GB_SAMSUNG_Y }, // emc_pmacro_ddll_long_cmd_4.
|
{ 0x00000018, 0x42C / 4, DRAM_ID2(16) }, // emc_pmacro_ddll_long_cmd_4.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_4GB_SAMSUNG_Y }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(16) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_4GB_SAMSUNG_Y }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(16) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
// Samsung LPDDR4X 4GB K4U6E3S4AA-MGCL 10nm-class (1y-X03) Die-A for retail Iowa, Hoag and Aula.
|
// Samsung LPDDR4X 4GB 10nm-class (1y) Die-X for Iowa, Hoag and Aula.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x00000006, 0x1CC / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_quse.
|
{ 0x00000006, 0x1CC / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_quse.
|
||||||
{ 0x00000005, 0x1D0 / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_quse_width.
|
{ 0x00000005, 0x1D0 / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_quse_width.
|
||||||
{ 0x00000003, 0x1DC / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_einput.
|
{ 0x00000003, 0x1DC / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_einput.
|
||||||
{ 0x0000000C, 0x1E0 / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_einput_duration.
|
{ 0x0000000C, 0x1E0 / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_einput_duration.
|
||||||
{ 0x88161414, 0x2E0 / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_mrw14.
|
{ 0x88161414, 0x2E0 / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_mrw14.
|
||||||
{ 0x80000713, 0x32C / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // emc_dyn_self_ref_control.
|
{ 0x80000713, 0x32C / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // emc_dyn_self_ref_control.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(17) | DRAM_ID2(19) | DRAM_ID2(24) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
// Samsung LPDDR4X 8GB K4UBE3D4AA-MGCL 10nm-class (1y-X03) Die-A for SDEV Iowa, Hoag and Aula.
|
// Samsung LPDDR4X 8GB 10nm-class (1y) Die-X for SDEV Iowa and Aula.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x00000001, 0x134 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_adr_cfg. 2 Ranks.
|
{ 0x00000001, 0x134 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_adr_cfg. 2 Ranks.
|
||||||
{ 0x00000006, 0x1CC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_quse.
|
{ 0x00000006, 0x1CC / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_quse.
|
||||||
{ 0x00000005, 0x1D0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_quse_width.
|
{ 0x00000005, 0x1D0 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_quse_width.
|
||||||
{ 0x00000003, 0x1DC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_einput.
|
{ 0x00000003, 0x1DC / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_einput.
|
||||||
{ 0x0000000C, 0x1E0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_einput_duration.
|
{ 0x0000000C, 0x1E0 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_einput_duration.
|
||||||
{ 0x00000008, 0x24C / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_tfaw.
|
{ 0x00000008, 0x24C / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_tfaw.
|
||||||
{ 0x08010004, 0x2B8 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw1.
|
{ 0x08010004, 0x2B8 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw1.
|
||||||
{ 0x08020000, 0x2BC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw2.
|
{ 0x08020000, 0x2BC / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw2.
|
||||||
{ 0x080D0000, 0x2C0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw3.
|
{ 0x080D0000, 0x2C0 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw3.
|
||||||
{ 0x08033131, 0x2C8 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw6.
|
{ 0x08033131, 0x2C8 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw6.
|
||||||
{ 0x080B0000, 0x2CC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw8.
|
{ 0x080B0000, 0x2CC / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw8.
|
||||||
{ 0x0C0E5D5D, 0x2D0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw9.
|
{ 0x0C0E5D5D, 0x2D0 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw9.
|
||||||
{ 0x080C5D5D, 0x2D4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw10.
|
{ 0x080C5D5D, 0x2D4 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw10.
|
||||||
{ 0x0C0D0808, 0x2D8 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw12.
|
{ 0x0C0D0808, 0x2D8 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw12.
|
||||||
{ 0x0C0D0000, 0x2DC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw13.
|
{ 0x0C0D0000, 0x2DC / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw13.
|
||||||
{ 0x08161414, 0x2E0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw14.
|
{ 0x08161414, 0x2E0 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw14.
|
||||||
{ 0x08010004, 0x2E4 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_mrw_extra.
|
{ 0x08010004, 0x2E4 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_mrw_extra.
|
||||||
{ 0x00000000, 0x340 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_dev_select. Both devices.
|
{ 0x00000000, 0x340 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_dev_select. Both devices.
|
||||||
{ 0x0051004F, 0x450 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_zcal_mrw_cmd.
|
{ 0x0051004F, 0x450 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_zcal_mrw_cmd.
|
||||||
{ 0x40000001, 0x45C / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_zcal_init_dev1.
|
{ 0x40000001, 0x45C / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_zcal_init_dev1.
|
||||||
{ 0x00000000, 0x594 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_pmacro_tx_pwrd4.
|
{ 0x00000000, 0x594 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_pmacro_tx_pwrd4.
|
||||||
{ 0x00001000, 0x598 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // emc_pmacro_tx_pwrd5.
|
{ 0x00001000, 0x598 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // emc_pmacro_tx_pwrd5.
|
||||||
{ 0x00000001, 0x630 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // mc_emem_adr_cfg. 2 Ranks.
|
{ 0x00000001, 0x630 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // mc_emem_adr_cfg. 2 Ranks.
|
||||||
{ 0x00002000, 0x64C / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // mc_emem_cfg. 8GB total density.
|
{ 0x00002000, 0x64C / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // mc_emem_cfg. 8GB total density.
|
||||||
{ 0x00000001, 0x670 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // mc_emem_arb_timing_faw.
|
{ 0x00000001, 0x670 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // mc_emem_arb_timing_faw.
|
||||||
{ 0x00000002, 0x680 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // mc_emem_arb_timing_r2r.
|
{ 0x00000002, 0x680 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // mc_emem_arb_timing_r2r.
|
||||||
{ 0x02020001, 0x694 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // mc_emem_arb_da_turns.
|
{ 0x02020001, 0x694 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // mc_emem_arb_da_turns.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(18) | DRAM_ID2(23) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
// Samsung LPDDR4X 4GB 10nm-class (1y-Y01) Die-? for Iowa.
|
// Samsung LPDDR4X 4GB 10nm-class (1y) Die-Y for Iowa.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(20) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(20) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x00000008, 0x24C / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_tfaw.
|
{ 0x00000008, 0x24C / 4, DRAM_ID2(20) }, // emc_tfaw.
|
||||||
{ 0x88161414, 0x2E0 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_mrw14.
|
{ 0x88161414, 0x2E0 / 4, DRAM_ID2(20) }, // emc_mrw14.
|
||||||
{ 0x80000713, 0x32C / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_dyn_self_ref_control.
|
{ 0x80000713, 0x32C / 4, DRAM_ID2(20) }, // emc_dyn_self_ref_control.
|
||||||
{ 0x000F0018, 0x3AC / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
{ 0x000F0018, 0x3AC / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
||||||
{ 0x000F0018, 0x3C4 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
{ 0x000F0018, 0x3C4 / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
||||||
{ 0x00440048, 0x3CC / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
{ 0x00440048, 0x3CC / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00440045, 0x3D0 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
{ 0x00440045, 0x3D0 / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00470047, 0x3D4 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
{ 0x00470047, 0x3D4 / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
||||||
{ 0x0005000D, 0x3DC / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
{ 0x0005000D, 0x3DC / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
||||||
{ 0x00440048, 0x3E4 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
{ 0x00440048, 0x3E4 / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
||||||
{ 0x00440045, 0x3E8 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
{ 0x00440045, 0x3E8 / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00470047, 0x3EC / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
{ 0x00470047, 0x3EC / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
||||||
{ 0x0005000D, 0x3F4 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
{ 0x0005000D, 0x3F4 / 4, DRAM_ID2(20) }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
||||||
{ 0x00180018, 0x41C / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ddll_long_cmd_0.
|
{ 0x00180018, 0x41C / 4, DRAM_ID2(20) }, // emc_pmacro_ddll_long_cmd_0.
|
||||||
{ 0x000F000F, 0x420 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ddll_long_cmd_1.
|
{ 0x000F000F, 0x420 / 4, DRAM_ID2(20) }, // emc_pmacro_ddll_long_cmd_1.
|
||||||
{ 0x00000018, 0x42C / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // emc_pmacro_ddll_long_cmd_4.
|
{ 0x00000018, 0x42C / 4, DRAM_ID2(20) }, // emc_pmacro_ddll_long_cmd_4.
|
||||||
{ 0x00000001, 0x670 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // mc_emem_arb_timing_faw.
|
{ 0x00000001, 0x670 / 4, DRAM_ID2(20) }, // mc_emem_arb_timing_faw.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(20) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_4GB_SAMSUNG_1Y_Y }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(20) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
// Samsung LPDDR4X 8GB 10nm-class (1y-Y01) Die-? for SDEV Iowa.
|
// Samsung LPDDR4X 8GB 10nm-class (1y) Die-Y for SDEV Iowa.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(21) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(21) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x00000001, 0x134 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_adr_cfg. 2 Ranks.
|
{ 0x00000001, 0x134 / 4, DRAM_ID2(21) }, // emc_adr_cfg. 2 Ranks.
|
||||||
{ 0x00000008, 0x24C / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_tfaw.
|
{ 0x00000008, 0x24C / 4, DRAM_ID2(21) }, // emc_tfaw.
|
||||||
{ 0x08010004, 0x2B8 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw1.
|
{ 0x08010004, 0x2B8 / 4, DRAM_ID2(21) }, // emc_mrw1.
|
||||||
{ 0x08020000, 0x2BC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw2.
|
{ 0x08020000, 0x2BC / 4, DRAM_ID2(21) }, // emc_mrw2.
|
||||||
{ 0x080D0000, 0x2C0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw3.
|
{ 0x080D0000, 0x2C0 / 4, DRAM_ID2(21) }, // emc_mrw3.
|
||||||
{ 0x08033131, 0x2C8 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw6.
|
{ 0x08033131, 0x2C8 / 4, DRAM_ID2(21) }, // emc_mrw6.
|
||||||
{ 0x080B0000, 0x2CC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw8.
|
{ 0x080B0000, 0x2CC / 4, DRAM_ID2(21) }, // emc_mrw8.
|
||||||
{ 0x0C0E5D5D, 0x2D0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw9.
|
{ 0x0C0E5D5D, 0x2D0 / 4, DRAM_ID2(21) }, // emc_mrw9.
|
||||||
{ 0x080C5D5D, 0x2D4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw10.
|
{ 0x080C5D5D, 0x2D4 / 4, DRAM_ID2(21) }, // emc_mrw10.
|
||||||
{ 0x0C0D0808, 0x2D8 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw12.
|
{ 0x0C0D0808, 0x2D8 / 4, DRAM_ID2(21) }, // emc_mrw12.
|
||||||
{ 0x0C0D0000, 0x2DC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw13.
|
{ 0x0C0D0000, 0x2DC / 4, DRAM_ID2(21) }, // emc_mrw13.
|
||||||
{ 0x08161414, 0x2E0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw14.
|
{ 0x08161414, 0x2E0 / 4, DRAM_ID2(21) }, // emc_mrw14.
|
||||||
{ 0x08010004, 0x2E4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_mrw_extra.
|
{ 0x08010004, 0x2E4 / 4, DRAM_ID2(21) }, // emc_mrw_extra.
|
||||||
{ 0x00000000, 0x340 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_dev_select. Both devices.
|
{ 0x00000000, 0x340 / 4, DRAM_ID2(21) }, // emc_dev_select. Both devices.
|
||||||
{ 0x32323232, 0x350 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ib_vref_dq_0.
|
{ 0x32323232, 0x350 / 4, DRAM_ID2(21) }, // emc_pmacro_ib_vref_dq_0.
|
||||||
{ 0x32323232, 0x354 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ib_vref_dq_1.
|
{ 0x32323232, 0x354 / 4, DRAM_ID2(21) }, // emc_pmacro_ib_vref_dq_1.
|
||||||
{ 0x000F0018, 0x3AC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
{ 0x000F0018, 0x3AC / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
||||||
{ 0x000F0018, 0x3C4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
{ 0x000F0018, 0x3C4 / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
||||||
{ 0x00440048, 0x3CC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
{ 0x00440048, 0x3CC / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00440045, 0x3D0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
{ 0x00440045, 0x3D0 / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00470047, 0x3D4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
{ 0x00470047, 0x3D4 / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
||||||
{ 0x0005000D, 0x3DC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
{ 0x0005000D, 0x3DC / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
||||||
{ 0x00440048, 0x3E4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
{ 0x00440048, 0x3E4 / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
||||||
{ 0x00440045, 0x3E8 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
{ 0x00440045, 0x3E8 / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00470047, 0x3EC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
{ 0x00470047, 0x3EC / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
||||||
{ 0x0005000D, 0x3F4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
{ 0x0005000D, 0x3F4 / 4, DRAM_ID2(21) }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
||||||
{ 0x00180018, 0x41C / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ddll_long_cmd_0.
|
{ 0x00180018, 0x41C / 4, DRAM_ID2(21) }, // emc_pmacro_ddll_long_cmd_0.
|
||||||
{ 0x000F000F, 0x420 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ddll_long_cmd_1.
|
{ 0x000F000F, 0x420 / 4, DRAM_ID2(21) }, // emc_pmacro_ddll_long_cmd_1.
|
||||||
{ 0x00000018, 0x42C / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_ddll_long_cmd_4.
|
{ 0x00000018, 0x42C / 4, DRAM_ID2(21) }, // emc_pmacro_ddll_long_cmd_4.
|
||||||
{ 0x0051004F, 0x450 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_zcal_mrw_cmd.
|
{ 0x0051004F, 0x450 / 4, DRAM_ID2(21) }, // emc_zcal_mrw_cmd.
|
||||||
{ 0x40000001, 0x45C / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_zcal_init_dev1.
|
{ 0x40000001, 0x45C / 4, DRAM_ID2(21) }, // emc_zcal_init_dev1.
|
||||||
{ 0x00000000, 0x594 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_tx_pwrd4.
|
{ 0x00000000, 0x594 / 4, DRAM_ID2(21) }, // emc_pmacro_tx_pwrd4.
|
||||||
{ 0x00001000, 0x598 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // emc_pmacro_tx_pwrd5.
|
{ 0x00001000, 0x598 / 4, DRAM_ID2(21) }, // emc_pmacro_tx_pwrd5.
|
||||||
{ 0x00000001, 0x630 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // mc_emem_adr_cfg. 2 Ranks.
|
{ 0x00000001, 0x630 / 4, DRAM_ID2(21) }, // mc_emem_adr_cfg. 2 Ranks.
|
||||||
{ 0x00002000, 0x64C / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // mc_emem_cfg. 8GB total density.
|
{ 0x00002000, 0x64C / 4, DRAM_ID2(21) }, // mc_emem_cfg. 8GB total density.
|
||||||
{ 0x00000001, 0x670 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // mc_emem_arb_timing_faw.
|
{ 0x00000001, 0x670 / 4, DRAM_ID2(21) }, // mc_emem_arb_timing_faw.
|
||||||
{ 0x00000002, 0x680 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // mc_emem_arb_timing_r2r.
|
{ 0x00000002, 0x680 / 4, DRAM_ID2(21) }, // mc_emem_arb_timing_r2r.
|
||||||
{ 0x02020001, 0x694 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // mc_emem_arb_da_turns.
|
{ 0x02020001, 0x694 / 4, DRAM_ID2(21) }, // mc_emem_arb_da_turns.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(21) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_Y }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(21) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
/*
|
// Samsung LPDDR4X 4GB 10nm-class (1y) Die-A for Unknown Aula.
|
||||||
// Samsung LPDDR4X 8GB 10nm-class (1y-A01) Die-? for SDEV Aula?
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(22) }, // emc_auto_cal_config2.
|
||||||
{ 0x00000001, 0x134 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_adr_cfg. 2 Ranks.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(22) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x08010004, 0x2B8 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw1.
|
{ 0x00000008, 0x24C / 4, DRAM_ID2(22) }, // emc_tfaw.
|
||||||
{ 0x08020000, 0x2BC / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw2.
|
{ 0x1C041B06, 0x26C / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd0_0.
|
||||||
{ 0x080D0000, 0x2C0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw3.
|
{ 0x02050307, 0x270 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd0_1.
|
||||||
{ 0x08033131, 0x2C8 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw6.
|
{ 0x03252500, 0x274 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd0_2.
|
||||||
{ 0x080B0000, 0x2CC / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw8.
|
{ 0x081D1E00, 0x278 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd1_0.
|
||||||
{ 0x0C0E5D5D, 0x2D0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw9.
|
{ 0x090C0A0D, 0x27C / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd1_1.
|
||||||
{ 0x080C5D5D, 0x2D4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw10.
|
{ 0x0526260B, 0x280 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd1_2.
|
||||||
{ 0x0C0D0808, 0x2D8 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw12.
|
{ 0x05030402, 0x284 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd2_0.
|
||||||
{ 0x0C0D0000, 0x2DC / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw13.
|
{ 0x1B1C0600, 0x288 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd2_1.
|
||||||
{ 0x08161414, 0x2E0 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw14.
|
{ 0x07252507, 0x28C / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd2_2.
|
||||||
{ 0x08010004, 0x2E4 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_mrw_extra.
|
{ 0x0C1D0B0A, 0x290 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd3_0.
|
||||||
{ 0x00000000, 0x340 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_dev_select. Both devices.
|
{ 0x0800090D, 0x294 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd3_1.
|
||||||
{ 0x35353535, 0x350 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_vref_dq_0.
|
{ 0x0926261E, 0x298 / 4, DRAM_ID2(22) }, // emc_cmd_mapping_cmd3_2.
|
||||||
{ 0x35353535, 0x354 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_vref_dq_1.
|
{ 0x2A080624, 0x29C / 4, DRAM_ID2(22) }, // emc_cmd_mapping_byte.
|
||||||
{ 0x35353535, 0x358 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_vref_dqs_0.
|
{ 0x88161414, 0x2E0 / 4, DRAM_ID2(22) }, // emc_mrw14.
|
||||||
{ 0x35353535, 0x35C / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_vref_dqs_1.
|
{ 0x80000713, 0x32C / 4, DRAM_ID2(22) }, // emc_dyn_self_ref_control.
|
||||||
{ 0x00480048, 0x3FC / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank0_0.
|
{ 0x00140010, 0x3AC / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dq_rank0_4.
|
||||||
{ 0x00480048, 0x400 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank0_1.
|
{ 0x0013000B, 0x3B0 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dq_rank0_5.
|
||||||
{ 0x00480048, 0x404 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank0_2.
|
{ 0x00140010, 0x3C4 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dq_rank1_4.
|
||||||
{ 0x00480048, 0x408 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank0_3.
|
{ 0x0013000B, 0x3C8 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dq_rank1_5.
|
||||||
{ 0x00480048, 0x40C / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank1_0.
|
{ 0x00450047, 0x3CC / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank0_0.
|
||||||
{ 0x00480048, 0x410 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank1_1.
|
{ 0x004D004F, 0x3D0 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank0_1.
|
||||||
{ 0x00480048, 0x414 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank1_2.
|
{ 0x00460046, 0x3D4 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank0_2.
|
||||||
{ 0x00480048, 0x418 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_ib_ddll_long_dqs_rank1_3.
|
{ 0x00480048, 0x3D8 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank0_3.
|
||||||
{ 0x0051004F, 0x450 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_zcal_mrw_cmd.
|
{ 0x000C0008, 0x3DC / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank0_4.
|
||||||
{ 0x40000001, 0x45C / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_zcal_init_dev1.
|
{ 0x000B000C, 0x3E0 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank0_5.
|
||||||
{ 0x00010100, 0x594 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_tx_pwrd4.
|
{ 0x00450047, 0x3E4 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank1_0.
|
||||||
{ 0x00400010, 0x598 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // emc_pmacro_tx_pwrd5.
|
{ 0x004D004F, 0x3E8 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank1_1.
|
||||||
{ 0x00000001, 0x630 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // mc_emem_adr_cfg. 2 Ranks.
|
{ 0x00460046, 0x3EC / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank1_2.
|
||||||
{ 0x00002000, 0x64C / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // mc_emem_cfg. 8GB total density.
|
{ 0x00480048, 0x3F0 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank1_3.
|
||||||
{ 0x00000002, 0x670 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // mc_emem_arb_timing_faw.
|
{ 0x000C0008, 0x3F4 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank1_4.
|
||||||
{ 0x00000002, 0x680 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // mc_emem_arb_timing_r2r.
|
{ 0x000B000C, 0x3F8 / 4, DRAM_ID2(22) }, // emc_pmacro_ob_ddll_long_dqs_rank1_5.
|
||||||
{ 0x02020001, 0x694 / 4, LPDDR4X_8GB_SAMSUNG_1Y_A }, // mc_emem_arb_da_turns.
|
{ 0x00100010, 0x41C / 4, DRAM_ID2(22) }, // emc_pmacro_ddll_long_cmd_0.
|
||||||
*/
|
{ 0x00140014, 0x420 / 4, DRAM_ID2(22) }, // emc_pmacro_ddll_long_cmd_1.
|
||||||
|
{ 0x00130013, 0x428 / 4, DRAM_ID2(22) }, // emc_pmacro_ddll_long_cmd_3.
|
||||||
|
{ 0x00000010, 0x42C / 4, DRAM_ID2(22) }, // emc_pmacro_ddll_long_cmd_4.
|
||||||
|
{ 0x40280100, 0x4B4 / 4, DRAM_ID2(22) }, // pmc_ddr_cfg.
|
||||||
|
{ 0x4F9F9FFF, 0x4B8 / 4, DRAM_ID2(22) }, // pmc_io_dpd3_req.
|
||||||
|
{ 0x64032157, 0x4D8 / 4, DRAM_ID2(22) }, // emc_swizzle_rank0_byte0.
|
||||||
|
{ 0x51320467, 0x4DC / 4, DRAM_ID2(22) }, // emc_swizzle_rank0_byte1.
|
||||||
|
{ 0x04735621, 0x4E0 / 4, DRAM_ID2(22) }, // emc_swizzle_rank0_byte2.
|
||||||
|
{ 0x47356012, 0x4E4 / 4, DRAM_ID2(22) }, // emc_swizzle_rank0_byte3.
|
||||||
|
{ 0x12045673, 0x4E8 / 4, DRAM_ID2(22) }, // emc_swizzle_rank1_byte0.
|
||||||
|
{ 0x43657210, 0x4EC / 4, DRAM_ID2(22) }, // emc_swizzle_rank1_byte1.
|
||||||
|
{ 0x65402137, 0x4F0 / 4, DRAM_ID2(22) }, // emc_swizzle_rank1_byte2.
|
||||||
|
{ 0x57302164, 0x4F4 / 4, DRAM_ID2(22) }, // emc_swizzle_rank1_byte3.
|
||||||
|
{ 0x4F9F9FFF, 0x534 / 4, DRAM_ID2(22) }, // emc_pmc_scratch1.
|
||||||
|
{ 0x4033CF1F, 0x53C / 4, DRAM_ID2(22) }, // emc_pmc_scratch3.
|
||||||
|
{ 0x10000000, 0x590 / 4, DRAM_ID2(22) }, // emc_pmacro_tx_pwrd3.
|
||||||
|
{ 0x00030108, 0x594 / 4, DRAM_ID2(22) }, // emc_pmacro_tx_pwrd4.
|
||||||
|
{ 0x01400050, 0x598 / 4, DRAM_ID2(22) }, // emc_pmacro_tx_pwrd5.
|
||||||
|
{ 0x29081081, 0x5A0 / 4, DRAM_ID2(22) }, // emc_pmacro_brick_mapping0.
|
||||||
|
{ 0x54A59332, 0x5A4 / 4, DRAM_ID2(22) }, // emc_pmacro_brick_mapping1.
|
||||||
|
{ 0x87766B4A, 0x5A8 / 4, DRAM_ID2(22) }, // emc_pmacro_brick_mapping2.
|
||||||
|
{ 0x00000001, 0x670 / 4, DRAM_ID2(22) }, // mc_emem_arb_timing_faw.
|
||||||
|
{ 0xE4FACB43, 0x6D4 / 4, DRAM_ID2(22) }, // mc_video_protect_vpr_override. + TSEC, NVENC.
|
||||||
|
{ 0x0600FED3, 0x6D8 / 4, DRAM_ID2(22) }, // mc_video_protect_vpr_override1. + TSECB, TSEC1, TSECB1.
|
||||||
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(22) }, // mc_video_protect_gpu_override0.
|
||||||
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(22) }, // mc_video_protect_gpu_override1.
|
||||||
|
{ 0x0000009C, 0x814 / 4, DRAM_ID2(22) }, // swizzle_rank_byte_encode.
|
||||||
|
|
||||||
// Micron LPDDR4X 4GB MT53D1024M32D1NP-053-WT:F 10nm-class (1y-01) Die-F for Newer Iowa/Hoag/Aula.
|
// Micron LPDDR4X 4GB 10nm-class (1y) Die-A for Unknown Iowa/Hoag/Aula.
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_auto_cal_config2.
|
{ 0x05500000, 0x0D4 / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_auto_cal_config2.
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_auto_cal_vref_sel0.
|
{ 0xC9AFBCBC, 0x0F4 / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_auto_cal_vref_sel0.
|
||||||
{ 0x00000006, 0x1CC / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_quse.
|
{ 0x00000006, 0x1CC / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_quse.
|
||||||
{ 0x00000005, 0x1D0 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_quse_width.
|
{ 0x00000005, 0x1D0 / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_quse_width.
|
||||||
{ 0x00000003, 0x1DC / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_einput.
|
{ 0x00000003, 0x1DC / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_einput.
|
||||||
{ 0x0000000C, 0x1E0 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_einput_duration.
|
{ 0x0000000C, 0x1E0 / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_einput_duration.
|
||||||
{ 0x00000008, 0x24C / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_tfaw.
|
{ 0x00000008, 0x24C / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_tfaw.
|
||||||
{ 0x88161414, 0x2E0 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_mrw14.
|
{ 0x88161414, 0x2E0 / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_mrw14.
|
||||||
{ 0x80000713, 0x32C / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // emc_dyn_self_ref_control.
|
{ 0x80000713, 0x32C / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // emc_dyn_self_ref_control.
|
||||||
{ 0x00000001, 0x670 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // mc_emem_arb_timing_faw.
|
{ 0x00000001, 0x670 / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // mc_emem_arb_timing_faw.
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // mc_video_protect_gpu_override0.
|
{ 0x2A800000, 0x6DC / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // mc_video_protect_gpu_override0.
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF }, // mc_video_protect_gpu_override1.
|
{ 0x00000002, 0x6E0 / 4, DRAM_ID2(25) | DRAM_ID2(26) | DRAM_ID2(27) }, // mc_video_protect_gpu_override1.
|
||||||
|
|
||||||
// Hynix LPDDR4X 4GB 10nm-class (1y-01) Die-A for Unknown Iowa/Hoag/Aula.
|
|
||||||
{ 0x05500000, 0x0D4 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_auto_cal_config2.
|
|
||||||
{ 0xC9AFBCBC, 0x0F4 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_auto_cal_vref_sel0.
|
|
||||||
{ 0x00000006, 0x1CC / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_quse.
|
|
||||||
{ 0x00000005, 0x1D0 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_quse_width.
|
|
||||||
{ 0x00000003, 0x1DC / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_einput.
|
|
||||||
{ 0x0000000C, 0x1E0 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_einput_duration.
|
|
||||||
{ 0x00000008, 0x24C / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_tfaw.
|
|
||||||
{ 0x88161414, 0x2E0 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_mrw14.
|
|
||||||
{ 0x80000713, 0x32C / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // emc_dyn_self_ref_control.
|
|
||||||
{ 0x00000001, 0x670 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // mc_emem_arb_timing_faw.
|
|
||||||
{ 0xE4FACB43, 0x6D4 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // mc_video_protect_vpr_override. + TSEC, NVENC.
|
|
||||||
{ 0x0600FED3, 0x6D8 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // mc_video_protect_vpr_override1. + TSECB, TSEC1, TSECB1.
|
|
||||||
{ 0x2A800000, 0x6DC / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // mc_video_protect_gpu_override0.
|
|
||||||
{ 0x00000002, 0x6E0 / 4, LPDDR4X_4GB_HYNIX_1Y_A }, // mc_video_protect_gpu_override1.
|
|
||||||
|
|
||||||
//!TODO: Too many duplicates.
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1126,413 +1126,413 @@ static void _sdram_lp0_save_params_t210(const void *params)
|
|||||||
s(PllMStableTime, 9:0, scratch4, 9:0);
|
s(PllMStableTime, 9:0, scratch4, 9:0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma GCC diagnostic ignored "-Wparentheses"
|
// #pragma GCC diagnostic ignored "-Wparentheses"
|
||||||
|
|
||||||
static void _sdram_lp0_save_params_t210b01(const void *params)
|
// static void _sdram_lp0_save_params_t210b01(const void *params)
|
||||||
{
|
// {
|
||||||
struct sdram_params_t210b01 *sdram = (struct sdram_params_t210b01 *)params;
|
// struct sdram_params_t210b01 *sdram = (struct sdram_params_t210b01 *)params;
|
||||||
struct tegra_pmc_regs *pmc = (struct tegra_pmc_regs *)PMC_BASE;
|
// struct tegra_pmc_regs *pmc = (struct tegra_pmc_regs *)PMC_BASE;
|
||||||
|
|
||||||
u32 tmp = 0;
|
// u32 tmp = 0;
|
||||||
|
|
||||||
sdram->mc_generalized_carveout1_cfg0 = 0;
|
// sdram->mc_generalized_carveout1_cfg0 = 0;
|
||||||
sdram->mc_generalized_carveout2_cfg0 = 0;
|
// sdram->mc_generalized_carveout2_cfg0 = 0;
|
||||||
sdram->mc_generalized_carveout3_cfg0 = 0;
|
// sdram->mc_generalized_carveout3_cfg0 = 0;
|
||||||
sdram->mc_generalized_carveout4_cfg0 = 0;
|
// sdram->mc_generalized_carveout4_cfg0 = 0;
|
||||||
sdram->mc_generalized_carveout5_cfg0 = 0;
|
// sdram->mc_generalized_carveout5_cfg0 = 0;
|
||||||
|
|
||||||
// Patch SDRAM parameters.
|
// // Patch SDRAM parameters.
|
||||||
u32 t0 = sdram->emc_swizzle_rank0_byte0 << 5 >> 29 > sdram->emc_swizzle_rank0_byte0 << 1 >> 29;
|
// u32 t0 = sdram->emc_swizzle_rank0_byte0 << 5 >> 29 > sdram->emc_swizzle_rank0_byte0 << 1 >> 29;
|
||||||
u32 t1 = (t0 & 0xFFFFFFEF) | ((sdram->emc_swizzle_rank1_byte0 << 5 >> 29 > sdram->emc_swizzle_rank1_byte0 << 1 >> 29) << 4);
|
// u32 t1 = (t0 & 0xFFFFFFEF) | ((sdram->emc_swizzle_rank1_byte0 << 5 >> 29 > sdram->emc_swizzle_rank1_byte0 << 1 >> 29) << 4);
|
||||||
u32 t2 = (t1 & 0xFFFFFFFD) | ((sdram->emc_swizzle_rank0_byte1 << 5 >> 29 > sdram->emc_swizzle_rank0_byte1 << 1 >> 29) << 1);
|
// u32 t2 = (t1 & 0xFFFFFFFD) | ((sdram->emc_swizzle_rank0_byte1 << 5 >> 29 > sdram->emc_swizzle_rank0_byte1 << 1 >> 29) << 1);
|
||||||
u32 t3 = (t2 & 0xFFFFFFDF) | ((sdram->emc_swizzle_rank1_byte1 << 5 >> 29 > sdram->emc_swizzle_rank1_byte1 << 1 >> 29) << 5);
|
// u32 t3 = (t2 & 0xFFFFFFDF) | ((sdram->emc_swizzle_rank1_byte1 << 5 >> 29 > sdram->emc_swizzle_rank1_byte1 << 1 >> 29) << 5);
|
||||||
u32 t4 = (t3 & 0xFFFFFFFB) | ((sdram->emc_swizzle_rank0_byte2 << 5 >> 29 > sdram->emc_swizzle_rank0_byte2 << 1 >> 29) << 2);
|
// u32 t4 = (t3 & 0xFFFFFFFB) | ((sdram->emc_swizzle_rank0_byte2 << 5 >> 29 > sdram->emc_swizzle_rank0_byte2 << 1 >> 29) << 2);
|
||||||
u32 t5 = (t4 & 0xFFFFFFBF) | ((sdram->emc_swizzle_rank1_byte2 << 5 >> 29 > sdram->emc_swizzle_rank1_byte2 << 1 >> 29) << 6);
|
// u32 t5 = (t4 & 0xFFFFFFBF) | ((sdram->emc_swizzle_rank1_byte2 << 5 >> 29 > sdram->emc_swizzle_rank1_byte2 << 1 >> 29) << 6);
|
||||||
u32 t6 = (t5 & 0xFFFFFFF7) | ((sdram->emc_swizzle_rank0_byte3 << 5 >> 29 > sdram->emc_swizzle_rank0_byte3 << 1 >> 29) << 3);
|
// u32 t6 = (t5 & 0xFFFFFFF7) | ((sdram->emc_swizzle_rank0_byte3 << 5 >> 29 > sdram->emc_swizzle_rank0_byte3 << 1 >> 29) << 3);
|
||||||
u32 t7 = (t6 & 0xFFFFFF7F) | ((sdram->emc_swizzle_rank1_byte3 << 5 >> 29 > sdram->emc_swizzle_rank1_byte3 << 1 >> 29) << 7);
|
// u32 t7 = (t6 & 0xFFFFFF7F) | ((sdram->emc_swizzle_rank1_byte3 << 5 >> 29 > sdram->emc_swizzle_rank1_byte3 << 1 >> 29) << 7);
|
||||||
sdram->swizzle_rank_byte_encode = t7;
|
// sdram->swizzle_rank_byte_encode = t7;
|
||||||
sdram->emc_bct_spare2 = 0x40000DD8;
|
// sdram->emc_bct_spare2 = 0x40000DD8;
|
||||||
sdram->emc_bct_spare3 = t7;
|
// sdram->emc_bct_spare3 = t7;
|
||||||
|
|
||||||
s(emc_clock_source, 7:0, scratch6, 15:8);
|
// s(emc_clock_source, 7:0, scratch6, 15:8);
|
||||||
s(emc_clock_source_dll, 7:0, scratch6, 23:16);
|
// s(emc_clock_source_dll, 7:0, scratch6, 23:16);
|
||||||
s(emc_clock_source, 31:29, scratch6, 26:24);
|
// s(emc_clock_source, 31:29, scratch6, 26:24);
|
||||||
s(emc_clock_source_dll, 31:29, scratch6, 29:27);
|
// s(emc_clock_source_dll, 31:29, scratch6, 29:27);
|
||||||
s(emc_clock_source_dll, 11:10, scratch6, 31:30);
|
// s(emc_clock_source_dll, 11:10, scratch6, 31:30);
|
||||||
pmc->scratch7 = (sdram->emc_rc << 24) | ((sdram->emc_zqcal_lpddr4_warm_boot << 27 >> 31 << 23) | ((sdram->emc_zqcal_lpddr4_warm_boot << 30 >> 31 << 22) | ((sdram->emc_zqcal_lpddr4_warm_boot << 21) & 0x3FFFFF | ((sdram->clk_rst_pllm_misc20_override << 20) & 0x1FFFFF | ((sdram->clk_rst_pllm_misc20_override << 28 >> 31 << 19) | ((sdram->clk_rst_pllm_misc20_override << 27 >> 31 << 18) | ((sdram->clk_rst_pllm_misc20_override << 26 >> 31 << 17) | ((sdram->clk_rst_pllm_misc20_override << 21 >> 31 << 16) | ((sdram->clk_rst_pllm_misc20_override << 20 >> 31 << 15) | ((sdram->clk_rst_pllm_misc20_override << 19 >> 31 << 14) | ((sdram->clk_rst_pllm_misc20_override << 18 >> 31 << 13) | ((sdram->emc_clock_source << 15 >> 31 << 12) | ((sdram->emc_clock_source << 11 >> 31 << 11) | ((sdram->emc_clock_source << 12 >> 31 << 10) | ((sdram->emc_clock_source << 6 >> 31 << 9) | ((sdram->emc_clock_source << 16 >> 31 << 8) | ((32 * sdram->emc_clock_source >> 31 << 7) | ((16 * sdram->emc_clock_source >> 31 << 6) | (16 * (sdram->emc_zqcal_lpddr4_warm_boot >> 30) | (4 * (sdram->clk_rst_pllm_misc20_override << 29 >> 30) | ((sdram->clk_rst_pllm_misc20_override << 22 >> 30) | 4 * (pmc->scratch7 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFFFFFF;
|
// pmc->scratch7 = (sdram->emc_rc << 24) | ((sdram->emc_zqcal_lpddr4_warm_boot << 27 >> 31 << 23) | ((sdram->emc_zqcal_lpddr4_warm_boot << 30 >> 31 << 22) | ((sdram->emc_zqcal_lpddr4_warm_boot << 21) & 0x3FFFFF | ((sdram->clk_rst_pllm_misc20_override << 20) & 0x1FFFFF | ((sdram->clk_rst_pllm_misc20_override << 28 >> 31 << 19) | ((sdram->clk_rst_pllm_misc20_override << 27 >> 31 << 18) | ((sdram->clk_rst_pllm_misc20_override << 26 >> 31 << 17) | ((sdram->clk_rst_pllm_misc20_override << 21 >> 31 << 16) | ((sdram->clk_rst_pllm_misc20_override << 20 >> 31 << 15) | ((sdram->clk_rst_pllm_misc20_override << 19 >> 31 << 14) | ((sdram->clk_rst_pllm_misc20_override << 18 >> 31 << 13) | ((sdram->emc_clock_source << 15 >> 31 << 12) | ((sdram->emc_clock_source << 11 >> 31 << 11) | ((sdram->emc_clock_source << 12 >> 31 << 10) | ((sdram->emc_clock_source << 6 >> 31 << 9) | ((sdram->emc_clock_source << 16 >> 31 << 8) | ((32 * sdram->emc_clock_source >> 31 << 7) | ((16 * sdram->emc_clock_source >> 31 << 6) | (16 * (sdram->emc_zqcal_lpddr4_warm_boot >> 30) | (4 * (sdram->clk_rst_pllm_misc20_override << 29 >> 30) | ((sdram->clk_rst_pllm_misc20_override << 22 >> 30) | 4 * (pmc->scratch7 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFFFFFF;
|
||||||
pmc->scratch8 = (sdram->emc_pmacro_bg_bias_ctrl0 << 18 >> 30 << 30) | ((4 * pmc->scratch8) >> 2);
|
// pmc->scratch8 = (sdram->emc_pmacro_bg_bias_ctrl0 << 18 >> 30 << 30) | ((4 * pmc->scratch8) >> 2);
|
||||||
pmc->scratch14 = ((u8)(sdram->emc_cfg_pipe_clk) << 31) | (2 * (((u8)(sdram->emc_fdpd_ctrl_cmd_no_ramp) << 30) | pmc->scratch14 & 0xBFFFFFFF) >> 1);
|
// pmc->scratch14 = ((u8)(sdram->emc_cfg_pipe_clk) << 31) | (2 * (((u8)(sdram->emc_fdpd_ctrl_cmd_no_ramp) << 30) | pmc->scratch14 & 0xBFFFFFFF) >> 1);
|
||||||
s(emc_qrst, 6:0, scratch15, 26:20);
|
// s(emc_qrst, 6:0, scratch15, 26:20);
|
||||||
s(emc_qrst, 20:16, scratch15, 31:27);
|
// s(emc_qrst, 20:16, scratch15, 31:27);
|
||||||
s(emc_pmacro_cmd_tx_drive, 5:0, scratch16, 25:20);
|
// s(emc_pmacro_cmd_tx_drive, 5:0, scratch16, 25:20);
|
||||||
s(emc_pmacro_cmd_tx_drive, 13:8, scratch16, 31:26);
|
// s(emc_pmacro_cmd_tx_drive, 13:8, scratch16, 31:26);
|
||||||
pmc->scratch17 = (16 * sdram->emc_fbio_cfg8 >> 31 << 31) | (2 * ((32 * sdram->emc_fbio_cfg8 >> 31 << 30) | ((sdram->emc_fbio_cfg8 << 6 >> 31 << 29) | ((sdram->emc_fbio_cfg8 << 7 >> 31 << 28) | ((sdram->emc_fbio_cfg8 << 8 >> 31 << 27) | ((sdram->emc_fbio_cfg8 << 9 >> 31 << 26) | ((sdram->emc_fbio_cfg8 << 10 >> 31 << 25) | ((sdram->emc_fbio_cfg8 << 11 >> 31 << 24) | ((sdram->emc_fbio_cfg8 << 12 >> 31 << 23) | ((sdram->emc_fbio_cfg8 << 13 >> 31 << 22) | ((sdram->emc_fbio_cfg8 << 14 >> 31 << 21) | ((sdram->emc_fbio_cfg8 << 15 >> 31 << 20) | pmc->scratch17 & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch17 = (16 * sdram->emc_fbio_cfg8 >> 31 << 31) | (2 * ((32 * sdram->emc_fbio_cfg8 >> 31 << 30) | ((sdram->emc_fbio_cfg8 << 6 >> 31 << 29) | ((sdram->emc_fbio_cfg8 << 7 >> 31 << 28) | ((sdram->emc_fbio_cfg8 << 8 >> 31 << 27) | ((sdram->emc_fbio_cfg8 << 9 >> 31 << 26) | ((sdram->emc_fbio_cfg8 << 10 >> 31 << 25) | ((sdram->emc_fbio_cfg8 << 11 >> 31 << 24) | ((sdram->emc_fbio_cfg8 << 12 >> 31 << 23) | ((sdram->emc_fbio_cfg8 << 13 >> 31 << 22) | ((sdram->emc_fbio_cfg8 << 14 >> 31 << 21) | ((sdram->emc_fbio_cfg8 << 15 >> 31 << 20) | pmc->scratch17 & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch18 = ((u16)(sdram->emc_txsr_dll) << 20) | pmc->scratch18 & 0xFFFFF;
|
// pmc->scratch18 = ((u16)(sdram->emc_txsr_dll) << 20) | pmc->scratch18 & 0xFFFFF;
|
||||||
pmc->scratch19 = (sdram->emc_txdsrvttgen << 20) | pmc->scratch19 & 0xFFFFF;
|
// pmc->scratch19 = (sdram->emc_txdsrvttgen << 20) | pmc->scratch19 & 0xFFFFF;
|
||||||
s32(emc_cfg_rsv, scratch22);
|
// s32(emc_cfg_rsv, scratch22);
|
||||||
s32(emc_auto_cal_config, scratch23);
|
// s32(emc_auto_cal_config, scratch23);
|
||||||
s32(emc_auto_cal_vref_sel0, scratch24);
|
// s32(emc_auto_cal_vref_sel0, scratch24);
|
||||||
s32(emc_pmacro_brick_ctrl_rfu1, scratch25);
|
// s32(emc_pmacro_brick_ctrl_rfu1, scratch25);
|
||||||
s32(emc_pmacro_brick_ctrl_rfu2, scratch26);
|
// s32(emc_pmacro_brick_ctrl_rfu2, scratch26);
|
||||||
s32(emc_pmc_scratch1, scratch27);
|
// s32(emc_pmc_scratch1, scratch27);
|
||||||
s32(emc_pmc_scratch2, scratch28);
|
// s32(emc_pmc_scratch2, scratch28);
|
||||||
s32(emc_pmc_scratch3, scratch29);
|
// s32(emc_pmc_scratch3, scratch29);
|
||||||
pmc->scratch30 = (sdram->emc_pmacro_perbit_rfu_ctrl0 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl0 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl0 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl0 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl0 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl0 & 3 | 4 * (pmc->scratch30 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch30 = (sdram->emc_pmacro_perbit_rfu_ctrl0 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl0 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl0 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl0 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl0 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl0 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl0 & 3 | 4 * (pmc->scratch30 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch31 = (sdram->emc_pmacro_perbit_rfu_ctrl1 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl1 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl1 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl1 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl1 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl1 & 3 | 4 * (pmc->scratch31 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch31 = (sdram->emc_pmacro_perbit_rfu_ctrl1 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl1 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl1 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl1 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl1 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl1 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl1 & 3 | 4 * (pmc->scratch31 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch32 = (sdram->emc_pmacro_perbit_rfu_ctrl2 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl2 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl2 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl2 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl2 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl2 & 3 | 4 * (pmc->scratch32 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch32 = (sdram->emc_pmacro_perbit_rfu_ctrl2 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl2 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl2 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl2 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl2 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl2 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl2 & 3 | 4 * (pmc->scratch32 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch33 = (sdram->emc_pmacro_perbit_rfu_ctrl3 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl3 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl3 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl3 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl3 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl3 & 3 | 4 * (pmc->scratch33 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch33 = (sdram->emc_pmacro_perbit_rfu_ctrl3 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl3 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl3 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl3 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl3 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl3 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl3 & 3 | 4 * (pmc->scratch33 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch40 = (sdram->emc_pmacro_perbit_rfu_ctrl4 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl4 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl4 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl4 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl4 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl4 & 3 | 4 * (pmc->scratch40 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch40 = (sdram->emc_pmacro_perbit_rfu_ctrl4 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl4 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl4 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl4 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl4 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl4 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl4 & 3 | 4 * (pmc->scratch40 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch42 = (sdram->emc_pmacro_perbit_rfu_ctrl5 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl5 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl5 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl5 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl5 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl5 & 3 | 4 * (pmc->scratch42 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch42 = (sdram->emc_pmacro_perbit_rfu_ctrl5 >> 30 << 30) | (4 * ((4 * sdram->emc_pmacro_perbit_rfu_ctrl5 >> 30 << 28) | ((16 * sdram->emc_pmacro_perbit_rfu_ctrl5 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 6 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 8 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 10 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 12 >> 30 << 18) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 14 >> 30 << 16) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 16 >> 30 << 14) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 18 >> 30 << 12) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 20 >> 30 << 10) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 22 >> 30 << 8) | ((sdram->emc_pmacro_perbit_rfu_ctrl5 << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_perbit_rfu_ctrl5 << 26 >> 30) | (4 * (sdram->emc_pmacro_perbit_rfu_ctrl5 << 28 >> 30) | (sdram->emc_pmacro_perbit_rfu_ctrl5 & 3 | 4 * (pmc->scratch42 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch44 = (sdram->mc_emem_arb_da_turns >> 24 << 24) | ((sdram->mc_emem_arb_da_turns >> 16 << 16) | ((sdram->mc_emem_arb_da_turns << 16 >> 24 << 8) | (sdram->mc_emem_arb_da_turns & 0xFF | (pmc->scratch44 >> 8 << 8)) & 0xFFFF00FF) & 0xFF00FFFF) & 0xFFFFFF;
|
// pmc->scratch44 = (sdram->mc_emem_arb_da_turns >> 24 << 24) | ((sdram->mc_emem_arb_da_turns >> 16 << 16) | ((sdram->mc_emem_arb_da_turns << 16 >> 24 << 8) | (sdram->mc_emem_arb_da_turns & 0xFF | (pmc->scratch44 >> 8 << 8)) & 0xFFFF00FF) & 0xFF00FFFF) & 0xFFFFFF;
|
||||||
pmc->scratch64 = ((u16)(sdram->mc_emem_arb_misc2) << 31) | (2 * ((sdram->emc_fbio_spare << 30) | ((sdram->emc_fbio_spare << 24 >> 26 << 24) | ((sdram->emc_fbio_spare << 16 >> 24 << 16) | ((sdram->emc_fbio_spare << 8 >> 24 << 8) | ((sdram->emc_fbio_spare >> 24) | (pmc->scratch64 >> 8 << 8)) & 0xFFFF00FF) & 0xFF00FFFF) & 0xC0FFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch64 = ((u16)(sdram->mc_emem_arb_misc2) << 31) | (2 * ((sdram->emc_fbio_spare << 30) | ((sdram->emc_fbio_spare << 24 >> 26 << 24) | ((sdram->emc_fbio_spare << 16 >> 24 << 16) | ((sdram->emc_fbio_spare << 8 >> 24 << 8) | ((sdram->emc_fbio_spare >> 24) | (pmc->scratch64 >> 8 << 8)) & 0xFFFF00FF) & 0xFF00FFFF) & 0xC0FFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch65 = ((u16)(sdram->mc_da_cfg0) << 31 >> 1) | ((2 * sdram->mc_emem_arb_misc0 >> 29 << 27) | ((16 * sdram->mc_emem_arb_misc0 >> 31 << 26) | ((32 * sdram->mc_emem_arb_misc0 >> 26 << 20) | ((sdram->mc_emem_arb_misc0 << 11 >> 27 << 15) | ((sdram->mc_emem_arb_misc0 << 17 >> 25 << 8) | ((u8)sdram->mc_emem_arb_misc0 | (pmc->scratch65 >> 8 << 8)) & 0xFFFF80FF) & 0xFFF07FFF) & 0xFC0FFFFF) & 0xFBFFFFFF) & 0xC7FFFFFF) & 0xBFFFFFFF;
|
// pmc->scratch65 = ((u16)(sdram->mc_da_cfg0) << 31 >> 1) | ((2 * sdram->mc_emem_arb_misc0 >> 29 << 27) | ((16 * sdram->mc_emem_arb_misc0 >> 31 << 26) | ((32 * sdram->mc_emem_arb_misc0 >> 26 << 20) | ((sdram->mc_emem_arb_misc0 << 11 >> 27 << 15) | ((sdram->mc_emem_arb_misc0 << 17 >> 25 << 8) | ((u8)sdram->mc_emem_arb_misc0 | (pmc->scratch65 >> 8 << 8)) & 0xFFFF80FF) & 0xFFF07FFF) & 0xFC0FFFFF) & 0xFBFFFFFF) & 0xC7FFFFFF) & 0xBFFFFFFF;
|
||||||
pmc->scratch66 = (sdram->emc_fdpd_ctrl_cmd >> 30 << 27) | ((4 * sdram->emc_fdpd_ctrl_cmd >> 31 << 26) | ((8 * sdram->emc_fdpd_ctrl_cmd >> 27 << 21) | ((sdram->emc_fdpd_ctrl_cmd << 8 >> 28 << 17) | ((sdram->emc_fdpd_ctrl_cmd << 15 >> 27 << 12) | ((sdram->emc_fdpd_ctrl_cmd << 20 >> 28 << 8) | ((u8)sdram->emc_fdpd_ctrl_cmd | (pmc->scratch66 >> 8 << 8)) & 0xFFFFF0FF) & 0xFFFE0FFF) & 0xFFE1FFFF) & 0xFC1FFFFF) & 0xFBFFFFFF) & 0xE7FFFFFF;
|
// pmc->scratch66 = (sdram->emc_fdpd_ctrl_cmd >> 30 << 27) | ((4 * sdram->emc_fdpd_ctrl_cmd >> 31 << 26) | ((8 * sdram->emc_fdpd_ctrl_cmd >> 27 << 21) | ((sdram->emc_fdpd_ctrl_cmd << 8 >> 28 << 17) | ((sdram->emc_fdpd_ctrl_cmd << 15 >> 27 << 12) | ((sdram->emc_fdpd_ctrl_cmd << 20 >> 28 << 8) | ((u8)sdram->emc_fdpd_ctrl_cmd | (pmc->scratch66 >> 8 << 8)) & 0xFFFFF0FF) & 0xFFFE0FFF) & 0xFFE1FFFF) & 0xFC1FFFFF) & 0xFBFFFFFF) & 0xE7FFFFFF;
|
||||||
pmc->scratch67 = ((u8)(sdram->emc_burst_refresh_num) << 28) | ((16 * sdram->emc_auto_cal_config2 >> 30 << 26) | ((sdram->emc_auto_cal_config2 << 6 >> 30 << 24) | ((sdram->emc_auto_cal_config2 << 8 >> 30 << 22) | ((sdram->emc_auto_cal_config2 << 10 >> 30 << 20) | ((sdram->emc_auto_cal_config2 << 12 >> 30 << 18) | ((sdram->emc_auto_cal_config2 << 14 >> 30 << 16) | ((sdram->emc_auto_cal_config2 << 16 >> 30 << 14) | ((sdram->emc_auto_cal_config2 << 18 >> 30 << 12) | ((sdram->emc_auto_cal_config2 << 20 >> 30 << 10) | ((sdram->emc_auto_cal_config2 << 22 >> 30 << 8) | ((sdram->emc_auto_cal_config2 << 24 >> 30 << 6) | (16 * (sdram->emc_auto_cal_config2 << 26 >> 30) | (4 * (sdram->emc_auto_cal_config2 << 28 >> 30) | (sdram->emc_auto_cal_config2 & 3 | 4 * (pmc->scratch67 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xFFFFFFF;
|
// pmc->scratch67 = ((u8)(sdram->emc_burst_refresh_num) << 28) | ((16 * sdram->emc_auto_cal_config2 >> 30 << 26) | ((sdram->emc_auto_cal_config2 << 6 >> 30 << 24) | ((sdram->emc_auto_cal_config2 << 8 >> 30 << 22) | ((sdram->emc_auto_cal_config2 << 10 >> 30 << 20) | ((sdram->emc_auto_cal_config2 << 12 >> 30 << 18) | ((sdram->emc_auto_cal_config2 << 14 >> 30 << 16) | ((sdram->emc_auto_cal_config2 << 16 >> 30 << 14) | ((sdram->emc_auto_cal_config2 << 18 >> 30 << 12) | ((sdram->emc_auto_cal_config2 << 20 >> 30 << 10) | ((sdram->emc_auto_cal_config2 << 22 >> 30 << 8) | ((sdram->emc_auto_cal_config2 << 24 >> 30 << 6) | (16 * (sdram->emc_auto_cal_config2 << 26 >> 30) | (4 * (sdram->emc_auto_cal_config2 << 28 >> 30) | (sdram->emc_auto_cal_config2 & 3 | 4 * (pmc->scratch67 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch68 = ((u8)(sdram->emc_tppd) << 28) | ((sdram->emc_cfg_dig_dll >> 31 << 27) | ((2 * sdram->emc_cfg_dig_dll >> 31 << 26) | ((16 * sdram->emc_cfg_dig_dll >> 31 << 25) | ((sdram->emc_cfg_dig_dll << 6 >> 22 << 15) | ((sdram->emc_cfg_dig_dll << 16 >> 31 << 14) | ((sdram->emc_cfg_dig_dll << 17 >> 31 << 13) | ((sdram->emc_cfg_dig_dll << 18 >> 30 << 11) | ((sdram->emc_cfg_dig_dll << 21 >> 29 << 8) | ((sdram->emc_cfg_dig_dll << 24 >> 30 << 6) | (32 * (sdram->emc_cfg_dig_dll << 26 >> 31) | (16 * (sdram->emc_cfg_dig_dll << 27 >> 31) | (8 * (sdram->emc_cfg_dig_dll << 28 >> 31) | (4 * (sdram->emc_cfg_dig_dll << 29 >> 31) | (2 * (sdram->emc_cfg_dig_dll << 30 >> 31) | (sdram->emc_cfg_dig_dll & 1 | 2 * (pmc->scratch68 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFF3F) & 0xFFFFF8FF) & 0xFFFFE7FF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFE007FFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xFFFFFFF;
|
// pmc->scratch68 = ((u8)(sdram->emc_tppd) << 28) | ((sdram->emc_cfg_dig_dll >> 31 << 27) | ((2 * sdram->emc_cfg_dig_dll >> 31 << 26) | ((16 * sdram->emc_cfg_dig_dll >> 31 << 25) | ((sdram->emc_cfg_dig_dll << 6 >> 22 << 15) | ((sdram->emc_cfg_dig_dll << 16 >> 31 << 14) | ((sdram->emc_cfg_dig_dll << 17 >> 31 << 13) | ((sdram->emc_cfg_dig_dll << 18 >> 30 << 11) | ((sdram->emc_cfg_dig_dll << 21 >> 29 << 8) | ((sdram->emc_cfg_dig_dll << 24 >> 30 << 6) | (32 * (sdram->emc_cfg_dig_dll << 26 >> 31) | (16 * (sdram->emc_cfg_dig_dll << 27 >> 31) | (8 * (sdram->emc_cfg_dig_dll << 28 >> 31) | (4 * (sdram->emc_cfg_dig_dll << 29 >> 31) | (2 * (sdram->emc_cfg_dig_dll << 30 >> 31) | (sdram->emc_cfg_dig_dll & 1 | 2 * (pmc->scratch68 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFF3F) & 0xFFFFF8FF) & 0xFFFFE7FF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFE007FFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch69 = (sdram->emc_r2r << 28) | ((sdram->emc_fdpd_ctrl_dq >> 30 << 26) | ((8 * sdram->emc_fdpd_ctrl_dq >> 27 << 21) | ((sdram->emc_fdpd_ctrl_dq << 8 >> 28 << 17) | ((sdram->emc_fdpd_ctrl_dq << 15 >> 27 << 12) | ((sdram->emc_fdpd_ctrl_dq << 20 >> 28 << 8) | ((u8)sdram->emc_fdpd_ctrl_dq | (pmc->scratch69 >> 8 << 8)) & 0xFFFFF0FF) & 0xFFFE0FFF) & 0xFFE1FFFF) & 0xFC1FFFFF) & 0xF3FFFFFF) & 0xFFFFFFF;
|
// pmc->scratch69 = (sdram->emc_r2r << 28) | ((sdram->emc_fdpd_ctrl_dq >> 30 << 26) | ((8 * sdram->emc_fdpd_ctrl_dq >> 27 << 21) | ((sdram->emc_fdpd_ctrl_dq << 8 >> 28 << 17) | ((sdram->emc_fdpd_ctrl_dq << 15 >> 27 << 12) | ((sdram->emc_fdpd_ctrl_dq << 20 >> 28 << 8) | ((u8)sdram->emc_fdpd_ctrl_dq | (pmc->scratch69 >> 8 << 8)) & 0xFFFFF0FF) & 0xFFFE0FFF) & 0xFFE1FFFF) & 0xFC1FFFFF) & 0xF3FFFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch70 = (sdram->emc_w2w << 28) | ((2 * sdram->emc_pmacro_ib_vref_dq_0 >> 25 << 21) | ((sdram->emc_pmacro_ib_vref_dq_0 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ib_vref_dq_0 << 17 >> 25 << 7) | (sdram->emc_pmacro_ib_vref_dq_0 & 0x7F | (pmc->scratch70 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xFFFFFFF;
|
// pmc->scratch70 = (sdram->emc_w2w << 28) | ((2 * sdram->emc_pmacro_ib_vref_dq_0 >> 25 << 21) | ((sdram->emc_pmacro_ib_vref_dq_0 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ib_vref_dq_0 << 17 >> 25 << 7) | (sdram->emc_pmacro_ib_vref_dq_0 & 0x7F | (pmc->scratch70 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch71 = (sdram->emc_pmacro_vttgen_ctrl0 << 12 >> 28 << 28) | ((2 * sdram->emc_pmacro_ib_vref_dq_1 >> 25 << 21) | ((sdram->emc_pmacro_ib_vref_dq_1 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ib_vref_dq_1 << 17 >> 25 << 7) | ((pmc->scratch71 >> 7 << 7) | sdram->emc_pmacro_ib_vref_dq_1 & 0x7F) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xFFFFFFF;
|
// pmc->scratch71 = (sdram->emc_pmacro_vttgen_ctrl0 << 12 >> 28 << 28) | ((2 * sdram->emc_pmacro_ib_vref_dq_1 >> 25 << 21) | ((sdram->emc_pmacro_ib_vref_dq_1 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ib_vref_dq_1 << 17 >> 25 << 7) | ((pmc->scratch71 >> 7 << 7) | sdram->emc_pmacro_ib_vref_dq_1 & 0x7F) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch72 = (((sdram->emc_pmacro_ib_vref_dqs_0 << 17 >> 25 << 7) | ((pmc->scratch72 >> 7 << 7) | sdram->emc_pmacro_ib_vref_dqs_0 & 0x7F) & 0xFFFFC07F) & 0xFFE03FFF | (sdram->emc_pmacro_ib_vref_dqs_0 << 9 >> 25 << 14)) & 0xF01FFFFF | (2 * sdram->emc_pmacro_ib_vref_dqs_0 >> 25 << 21);
|
// pmc->scratch72 = (((sdram->emc_pmacro_ib_vref_dqs_0 << 17 >> 25 << 7) | ((pmc->scratch72 >> 7 << 7) | sdram->emc_pmacro_ib_vref_dqs_0 & 0x7F) & 0xFFFFC07F) & 0xFFE03FFF | (sdram->emc_pmacro_ib_vref_dqs_0 << 9 >> 25 << 14)) & 0xF01FFFFF | (2 * sdram->emc_pmacro_ib_vref_dqs_0 >> 25 << 21);
|
||||||
pmc->scratch73 = (2 * sdram->emc_pmacro_ib_vref_dqs_1 >> 25 << 21) | ((sdram->emc_pmacro_ib_vref_dqs_1 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ib_vref_dqs_1 << 17 >> 25 << 7) | ((pmc->scratch73 >> 7 << 7) | sdram->emc_pmacro_ib_vref_dqs_1 & 0x7F) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF;
|
// pmc->scratch73 = (2 * sdram->emc_pmacro_ib_vref_dqs_1 >> 25 << 21) | ((sdram->emc_pmacro_ib_vref_dqs_1 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ib_vref_dqs_1 << 17 >> 25 << 7) | ((pmc->scratch73 >> 7 << 7) | sdram->emc_pmacro_ib_vref_dqs_1 & 0x7F) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF;
|
||||||
pmc->scratch74 = (2 * sdram->emc_pmacro_ddll_short_cmd_0 >> 25 << 21) | ((sdram->emc_pmacro_ddll_short_cmd_0 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ddll_short_cmd_0 << 17 >> 25 << 7) | (sdram->emc_pmacro_ddll_short_cmd_0 & 0x7F | (pmc->scratch74 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF;
|
// pmc->scratch74 = (2 * sdram->emc_pmacro_ddll_short_cmd_0 >> 25 << 21) | ((sdram->emc_pmacro_ddll_short_cmd_0 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ddll_short_cmd_0 << 17 >> 25 << 7) | (sdram->emc_pmacro_ddll_short_cmd_0 & 0x7F | (pmc->scratch74 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF;
|
||||||
pmc->scratch75 = (2 * sdram->emc_pmacro_ddll_short_cmd_1 >> 25 << 21) | ((sdram->emc_pmacro_ddll_short_cmd_1 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ddll_short_cmd_1 << 17 >> 25 << 7) | (sdram->emc_pmacro_ddll_short_cmd_1 & 0x7F | (pmc->scratch75 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF;
|
// pmc->scratch75 = (2 * sdram->emc_pmacro_ddll_short_cmd_1 >> 25 << 21) | ((sdram->emc_pmacro_ddll_short_cmd_1 << 9 >> 25 << 14) | ((sdram->emc_pmacro_ddll_short_cmd_1 << 17 >> 25 << 7) | (sdram->emc_pmacro_ddll_short_cmd_1 & 0x7F | (pmc->scratch75 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF;
|
||||||
pmc->scratch76 = (sdram->emc_rp << 26) | ((4 * sdram->emc_dll_cfg0 >> 31 << 25) | ((8 * sdram->emc_dll_cfg0 >> 31 << 24) | ((16 * sdram->emc_dll_cfg0 >> 28 << 20) | ((sdram->emc_dll_cfg0 << 8 >> 28 << 16) | ((sdram->emc_dll_cfg0 << 12 >> 28 << 12) | ((sdram->emc_dll_cfg0 << 16 >> 28 << 8) | ((sdram->emc_dll_cfg0 << 20 >> 24) | (pmc->scratch76 >> 8 << 8)) & 0xFFFFF0FF) & 0xFFFF0FFF) & 0xFFF0FFFF) & 0xFF0FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
// pmc->scratch76 = (sdram->emc_rp << 26) | ((4 * sdram->emc_dll_cfg0 >> 31 << 25) | ((8 * sdram->emc_dll_cfg0 >> 31 << 24) | ((16 * sdram->emc_dll_cfg0 >> 28 << 20) | ((sdram->emc_dll_cfg0 << 8 >> 28 << 16) | ((sdram->emc_dll_cfg0 << 12 >> 28 << 12) | ((sdram->emc_dll_cfg0 << 16 >> 28 << 8) | ((sdram->emc_dll_cfg0 << 20 >> 24) | (pmc->scratch76 >> 8 << 8)) & 0xFFFFF0FF) & 0xFFFF0FFF) & 0xFFF0FFFF) & 0xFF0FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
||||||
tmp = (sdram->emc_pmacro_tx_pwrd0 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd0 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd0 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd0 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd0 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd0 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd0 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd0 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd0 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd0 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd0 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd0 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd0 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd0 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd0 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd0 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd0 & 1 | 2 * (pmc->scratch77 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF;
|
// tmp = (sdram->emc_pmacro_tx_pwrd0 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd0 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd0 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd0 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd0 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd0 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd0 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd0 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd0 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd0 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd0 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd0 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd0 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd0 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd0 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd0 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd0 & 1 | 2 * (pmc->scratch77 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF;
|
||||||
pmc->scratch77 = (sdram->emc_r2w << 26) | ((4 * sdram->emc_pmacro_tx_pwrd0 >> 31 << 25) | ((8 * sdram->emc_pmacro_tx_pwrd0 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd0 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd0 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd0 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd0 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd0 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd0 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd0 << 11 >> 31 << 17) | tmp & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
// pmc->scratch77 = (sdram->emc_r2w << 26) | ((4 * sdram->emc_pmacro_tx_pwrd0 >> 31 << 25) | ((8 * sdram->emc_pmacro_tx_pwrd0 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd0 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd0 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd0 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd0 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd0 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd0 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd0 << 11 >> 31 << 17) | tmp & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
||||||
tmp = ((8 * sdram->emc_pmacro_tx_pwrd1 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd1 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd1 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd1 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd1 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd1 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd1 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd1 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd1 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd1 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd1 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd1 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd1 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd1 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd1 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd1 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd1 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd1 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd1 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd1 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd1 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd1 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd1 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd1 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd1 & 1 | 2 * (pmc->scratch78 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
// tmp = ((8 * sdram->emc_pmacro_tx_pwrd1 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd1 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd1 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd1 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd1 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd1 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd1 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd1 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd1 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd1 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd1 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd1 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd1 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd1 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd1 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd1 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd1 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd1 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd1 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd1 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd1 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd1 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd1 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd1 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd1 & 1 | 2 * (pmc->scratch78 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
||||||
pmc->scratch78 = (sdram->emc_w2r << 26) | ((4 * sdram->emc_pmacro_tx_pwrd1 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
// pmc->scratch78 = (sdram->emc_w2r << 26) | ((4 * sdram->emc_pmacro_tx_pwrd1 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
||||||
tmp = ((8 * sdram->emc_pmacro_tx_pwrd2 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd2 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd2 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd2 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd2 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd2 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd2 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd2 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd2 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd2 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd2 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd2 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd2 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd2 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd2 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd2 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd2 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd2 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd2 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd2 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd2 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd2 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd2 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd2 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd2 & 1 | 2 * (pmc->scratch79 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
// tmp = ((8 * sdram->emc_pmacro_tx_pwrd2 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd2 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd2 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd2 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd2 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd2 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd2 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd2 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd2 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd2 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd2 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd2 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd2 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd2 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd2 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd2 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd2 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd2 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd2 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd2 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd2 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd2 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd2 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd2 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd2 & 1 | 2 * (pmc->scratch79 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
||||||
pmc->scratch79 = (sdram->emc_r2p << 26) | ((4 * sdram->emc_pmacro_tx_pwrd2 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
// pmc->scratch79 = (sdram->emc_r2p << 26) | ((4 * sdram->emc_pmacro_tx_pwrd2 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
||||||
tmp = (sdram->emc_pmacro_tx_pwrd3 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd3 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd3 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd3 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd3 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd3 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd3 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd3 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd3 & 1 | 2 * (pmc->scratch80 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF;
|
// tmp = (sdram->emc_pmacro_tx_pwrd3 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd3 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd3 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd3 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd3 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd3 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd3 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd3 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd3 & 1 | 2 * (pmc->scratch80 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF;
|
||||||
pmc->scratch80 = ((u8)(sdram->emc_ccdmw) << 26) | ((4 * sdram->emc_pmacro_tx_pwrd3 >> 31 << 25) | ((8 * sdram->emc_pmacro_tx_pwrd3 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd3 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd3 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd3 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd3 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd3 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd3 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd3 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd3 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd3 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd3 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd3 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd3 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd3 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd3 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd3 << 22 >> 31 << 9) | tmp & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
// pmc->scratch80 = ((u8)(sdram->emc_ccdmw) << 26) | ((4 * sdram->emc_pmacro_tx_pwrd3 >> 31 << 25) | ((8 * sdram->emc_pmacro_tx_pwrd3 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd3 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd3 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd3 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd3 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd3 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd3 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd3 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd3 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd3 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd3 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd3 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd3 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd3 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd3 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd3 << 22 >> 31 << 9) | tmp & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
||||||
tmp = ((8 * sdram->emc_pmacro_tx_pwrd4 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd4 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd4 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd4 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd4 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd4 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd4 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd4 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd4 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd4 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd4 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd4 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd4 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd4 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd4 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd4 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd4 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd4 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd4 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd4 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd4 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd4 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd4 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd4 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd4 & 1 | 2 * (pmc->scratch81 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
// tmp = ((8 * sdram->emc_pmacro_tx_pwrd4 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd4 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd4 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd4 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd4 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd4 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd4 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd4 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd4 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd4 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd4 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd4 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd4 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd4 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd4 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd4 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd4 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd4 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd4 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd4 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd4 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd4 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd4 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd4 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd4 & 1 | 2 * (pmc->scratch81 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
||||||
pmc->scratch81 = ((u8)(sdram->emc_rd_rcd) << 26) | ((4 * sdram->emc_pmacro_tx_pwrd4 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
// pmc->scratch81 = ((u8)(sdram->emc_rd_rcd) << 26) | ((4 * sdram->emc_pmacro_tx_pwrd4 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
||||||
tmp = ((8 * sdram->emc_pmacro_tx_pwrd5 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd5 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd5 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd5 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd5 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd5 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd5 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd5 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd5 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd5 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd5 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd5 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd5 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd5 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd5 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd5 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd5 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd5 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd5 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd5 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd5 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd5 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd5 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd5 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd5 & 1 | 2 * (pmc->scratch82 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
// tmp = ((8 * sdram->emc_pmacro_tx_pwrd5 >> 31 << 24) | ((32 * sdram->emc_pmacro_tx_pwrd5 >> 31 << 23) | ((sdram->emc_pmacro_tx_pwrd5 << 6 >> 31 << 22) | ((sdram->emc_pmacro_tx_pwrd5 << 7 >> 31 << 21) | ((sdram->emc_pmacro_tx_pwrd5 << 8 >> 31 << 20) | ((sdram->emc_pmacro_tx_pwrd5 << 9 >> 31 << 19) | ((sdram->emc_pmacro_tx_pwrd5 << 10 >> 31 << 18) | ((sdram->emc_pmacro_tx_pwrd5 << 11 >> 31 << 17) | ((sdram->emc_pmacro_tx_pwrd5 << 12 >> 31 << 16) | ((sdram->emc_pmacro_tx_pwrd5 << 13 >> 31 << 15) | ((sdram->emc_pmacro_tx_pwrd5 << 14 >> 31 << 14) | ((sdram->emc_pmacro_tx_pwrd5 << 15 >> 31 << 13) | ((sdram->emc_pmacro_tx_pwrd5 << 18 >> 31 << 12) | ((sdram->emc_pmacro_tx_pwrd5 << 19 >> 31 << 11) | ((sdram->emc_pmacro_tx_pwrd5 << 21 >> 31 << 10) | ((sdram->emc_pmacro_tx_pwrd5 << 22 >> 31 << 9) | ((sdram->emc_pmacro_tx_pwrd5 << 23 >> 31 << 8) | ((sdram->emc_pmacro_tx_pwrd5 << 24 >> 31 << 7) | ((sdram->emc_pmacro_tx_pwrd5 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_tx_pwrd5 << 26 >> 31) | (16 * (sdram->emc_pmacro_tx_pwrd5 << 27 >> 31) | (8 * (sdram->emc_pmacro_tx_pwrd5 << 28 >> 31) | (4 * (sdram->emc_pmacro_tx_pwrd5 << 29 >> 31) | (2 * (sdram->emc_pmacro_tx_pwrd5 << 30 >> 31) | (sdram->emc_pmacro_tx_pwrd5 & 1 | 2 * (pmc->scratch82 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF;
|
||||||
pmc->scratch82 = ((u16)(sdram->emc_wr_rcd) << 26) | ((4 * sdram->emc_pmacro_tx_pwrd5 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
// pmc->scratch82 = ((u16)(sdram->emc_wr_rcd) << 26) | ((4 * sdram->emc_pmacro_tx_pwrd5 >> 31 << 25) | tmp) & 0x3FFFFFF;
|
||||||
pmc->scratch83 = ((u8)(sdram->emc_config_sample_delay) << 25) | ((sdram->emc_auto_cal_channel >> 31 << 24) | ((2 * sdram->emc_auto_cal_channel >> 31 << 23) | ((4 * sdram->emc_auto_cal_channel >> 31 << 22) | ((16 * sdram->emc_auto_cal_channel >> 25 << 15) | ((sdram->emc_auto_cal_channel << 11 >> 27 << 10) | ((sdram->emc_auto_cal_channel << 20 >> 28 << 6) | (sdram->emc_auto_cal_channel & 0x3F | (pmc->scratch83 >> 6 << 6)) & 0xFFFFFC3F) & 0xFFFF83FF) & 0xFFC07FFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0x1FFFFFF;
|
// pmc->scratch83 = ((u8)(sdram->emc_config_sample_delay) << 25) | ((sdram->emc_auto_cal_channel >> 31 << 24) | ((2 * sdram->emc_auto_cal_channel >> 31 << 23) | ((4 * sdram->emc_auto_cal_channel >> 31 << 22) | ((16 * sdram->emc_auto_cal_channel >> 25 << 15) | ((sdram->emc_auto_cal_channel << 11 >> 27 << 10) | ((sdram->emc_auto_cal_channel << 20 >> 28 << 6) | (sdram->emc_auto_cal_channel & 0x3F | (pmc->scratch83 >> 6 << 6)) & 0xFFFFFC3F) & 0xFFFF83FF) & 0xFFC07FFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0x1FFFFFF;
|
||||||
pmc->scratch84 = (sdram->emc_sel_dpd_ctrl << 13 >> 29 << 29) | ((sdram->emc_sel_dpd_ctrl << 23 >> 31 << 28) | ((sdram->emc_sel_dpd_ctrl << 26 >> 31 << 27) | ((sdram->emc_sel_dpd_ctrl << 27 >> 31 << 26) | ((sdram->emc_sel_dpd_ctrl << 28 >> 31 << 25) | ((sdram->emc_sel_dpd_ctrl << 29 >> 31 << 24) | ((4 * sdram->emc_pmacro_rx_term >> 26 << 18) | ((sdram->emc_pmacro_rx_term << 10 >> 26 << 12) | ((sdram->emc_pmacro_rx_term << 18 >> 26 << 6) | (sdram->emc_pmacro_rx_term & 0x3F | (pmc->scratch84 >> 6 << 6)) & 0xFFFFF03F) & 0xFFFC0FFF) & 0xFF03FFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
// pmc->scratch84 = (sdram->emc_sel_dpd_ctrl << 13 >> 29 << 29) | ((sdram->emc_sel_dpd_ctrl << 23 >> 31 << 28) | ((sdram->emc_sel_dpd_ctrl << 26 >> 31 << 27) | ((sdram->emc_sel_dpd_ctrl << 27 >> 31 << 26) | ((sdram->emc_sel_dpd_ctrl << 28 >> 31 << 25) | ((sdram->emc_sel_dpd_ctrl << 29 >> 31 << 24) | ((4 * sdram->emc_pmacro_rx_term >> 26 << 18) | ((sdram->emc_pmacro_rx_term << 10 >> 26 << 12) | ((sdram->emc_pmacro_rx_term << 18 >> 26 << 6) | (sdram->emc_pmacro_rx_term & 0x3F | (pmc->scratch84 >> 6 << 6)) & 0xFFFFF03F) & 0xFFFC0FFF) & 0xFF03FFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch85 = (4 * sdram->emc_obdly >> 30 << 30) | (4 * ((sdram->emc_obdly << 24) | ((4 * sdram->emc_pmacro_dq_tx_drive >> 26 << 18) | ((sdram->emc_pmacro_dq_tx_drive << 10 >> 26 << 12) | ((sdram->emc_pmacro_dq_tx_drive << 18 >> 26 << 6) | (sdram->emc_pmacro_dq_tx_drive & 0x3F | (pmc->scratch85 >> 6 << 6)) & 0xFFFFF03F) & 0xFFFC0FFF) & 0xFF03FFFF) & 0xC0FFFFFF) >> 2);
|
// pmc->scratch85 = (4 * sdram->emc_obdly >> 30 << 30) | (4 * ((sdram->emc_obdly << 24) | ((4 * sdram->emc_pmacro_dq_tx_drive >> 26 << 18) | ((sdram->emc_pmacro_dq_tx_drive << 10 >> 26 << 12) | ((sdram->emc_pmacro_dq_tx_drive << 18 >> 26 << 6) | (sdram->emc_pmacro_dq_tx_drive & 0x3F | (pmc->scratch85 >> 6 << 6)) & 0xFFFFF03F) & 0xFFFC0FFF) & 0xFF03FFFF) & 0xC0FFFFFF) >> 2);
|
||||||
pmc->scratch86 = (sdram->emc_pmacro_vttgen_ctrl1 << 10 >> 30 << 30) | (4 * ((sdram->emc_pmacro_vttgen_ctrl1 << 16 >> 26 << 24) | ((4 * sdram->emc_pmacro_ca_tx_drive >> 26 << 18) | ((sdram->emc_pmacro_ca_tx_drive << 10 >> 26 << 12) | ((sdram->emc_pmacro_ca_tx_drive << 18 >> 26 << 6) | (sdram->emc_pmacro_ca_tx_drive & 0x3F | (pmc->scratch86 >> 6 << 6)) & 0xFFFFF03F) & 0xFFFC0FFF) & 0xFF03FFFF) & 0xC0FFFFFF) >> 2);
|
// pmc->scratch86 = (sdram->emc_pmacro_vttgen_ctrl1 << 10 >> 30 << 30) | (4 * ((sdram->emc_pmacro_vttgen_ctrl1 << 16 >> 26 << 24) | ((4 * sdram->emc_pmacro_ca_tx_drive >> 26 << 18) | ((sdram->emc_pmacro_ca_tx_drive << 10 >> 26 << 12) | ((sdram->emc_pmacro_ca_tx_drive << 18 >> 26 << 6) | (sdram->emc_pmacro_ca_tx_drive & 0x3F | (pmc->scratch86 >> 6 << 6)) & 0xFFFFF03F) & 0xFFFC0FFF) & 0xFF03FFFF) & 0xC0FFFFFF) >> 2);
|
||||||
pmc->scratch87 = (sdram->emc_pmacro_vttgen_ctrl2 >> 16 << 24) | ((16 * sdram->emc_pmacro_zcrtl >> 30 << 22) | ((sdram->emc_pmacro_zcrtl << 6 >> 30 << 20) | ((sdram->emc_pmacro_zcrtl << 8 >> 30 << 18) | ((sdram->emc_pmacro_zcrtl << 10 >> 30 << 16) | ((sdram->emc_pmacro_zcrtl << 12 >> 30 << 14) | ((sdram->emc_pmacro_zcrtl << 14 >> 30 << 12) | ((sdram->emc_pmacro_zcrtl << 16 >> 30 << 10) | ((sdram->emc_pmacro_zcrtl << 18 >> 30 << 8) | ((sdram->emc_pmacro_zcrtl << 20 >> 30 << 6) | (16 * (sdram->emc_pmacro_zcrtl << 22 >> 30) | (4 * (sdram->emc_pmacro_zcrtl << 24 >> 30) | ((sdram->emc_pmacro_zcrtl << 26 >> 30) | 4 * (pmc->scratch87 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFFFFFF;
|
// pmc->scratch87 = (sdram->emc_pmacro_vttgen_ctrl2 >> 16 << 24) | ((16 * sdram->emc_pmacro_zcrtl >> 30 << 22) | ((sdram->emc_pmacro_zcrtl << 6 >> 30 << 20) | ((sdram->emc_pmacro_zcrtl << 8 >> 30 << 18) | ((sdram->emc_pmacro_zcrtl << 10 >> 30 << 16) | ((sdram->emc_pmacro_zcrtl << 12 >> 30 << 14) | ((sdram->emc_pmacro_zcrtl << 14 >> 30 << 12) | ((sdram->emc_pmacro_zcrtl << 16 >> 30 << 10) | ((sdram->emc_pmacro_zcrtl << 18 >> 30 << 8) | ((sdram->emc_pmacro_zcrtl << 20 >> 30 << 6) | (16 * (sdram->emc_pmacro_zcrtl << 22 >> 30) | (4 * (sdram->emc_pmacro_zcrtl << 24 >> 30) | ((sdram->emc_pmacro_zcrtl << 26 >> 30) | 4 * (pmc->scratch87 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFFFFFF;
|
||||||
pmc->scratch88 = (sdram->mc_emem_arb_timing_rc << 24) | ((sdram->emc_zcal_interval << 14) | ((sdram->emc_zcal_interval << 8 >> 18) | (pmc->scratch88 >> 14 << 14)) & 0xFF003FFF) & 0xFFFFFF;
|
// pmc->scratch88 = (sdram->mc_emem_arb_timing_rc << 24) | ((sdram->emc_zcal_interval << 14) | ((sdram->emc_zcal_interval << 8 >> 18) | (pmc->scratch88 >> 14 << 14)) & 0xFF003FFF) & 0xFFFFFF;
|
||||||
pmc->scratch89 = ((u16)(sdram->mc_emem_arb_rsv) << 24) | ((sdram->emc_data_brlshft0 << 8 >> 29 << 21) | ((sdram->emc_data_brlshft0 << 11 >> 29 << 18) | ((sdram->emc_data_brlshft0 << 14 >> 29 << 15) | ((sdram->emc_data_brlshft0 << 17 >> 29 << 12) | ((sdram->emc_data_brlshft0 << 20 >> 29 << 9) | ((sdram->emc_data_brlshft0 << 23 >> 29 << 6) | (8 * (sdram->emc_data_brlshft0 << 26 >> 29) | (sdram->emc_data_brlshft0 & 7 | 8 * (pmc->scratch89 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0xFFFFFF;
|
// pmc->scratch89 = ((u16)(sdram->mc_emem_arb_rsv) << 24) | ((sdram->emc_data_brlshft0 << 8 >> 29 << 21) | ((sdram->emc_data_brlshft0 << 11 >> 29 << 18) | ((sdram->emc_data_brlshft0 << 14 >> 29 << 15) | ((sdram->emc_data_brlshft0 << 17 >> 29 << 12) | ((sdram->emc_data_brlshft0 << 20 >> 29 << 9) | ((sdram->emc_data_brlshft0 << 23 >> 29 << 6) | (8 * (sdram->emc_data_brlshft0 << 26 >> 29) | (sdram->emc_data_brlshft0 & 7 | 8 * (pmc->scratch89 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0xFFFFFF;
|
||||||
pmc->scratch90 = (sdram->emc_data_brlshft1 << 8 >> 29 << 21) | ((sdram->emc_data_brlshft1 << 11 >> 29 << 18) | ((sdram->emc_data_brlshft1 << 14 >> 29 << 15) | ((sdram->emc_data_brlshft1 << 17 >> 29 << 12) | ((sdram->emc_data_brlshft1 << 20 >> 29 << 9) | ((sdram->emc_data_brlshft1 << 23 >> 29 << 6) | (8 * (sdram->emc_data_brlshft1 << 26 >> 29) | (sdram->emc_data_brlshft1 & 7 | 8 * (pmc->scratch90 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
// pmc->scratch90 = (sdram->emc_data_brlshft1 << 8 >> 29 << 21) | ((sdram->emc_data_brlshft1 << 11 >> 29 << 18) | ((sdram->emc_data_brlshft1 << 14 >> 29 << 15) | ((sdram->emc_data_brlshft1 << 17 >> 29 << 12) | ((sdram->emc_data_brlshft1 << 20 >> 29 << 9) | ((sdram->emc_data_brlshft1 << 23 >> 29 << 6) | (8 * (sdram->emc_data_brlshft1 << 26 >> 29) | (sdram->emc_data_brlshft1 & 7 | 8 * (pmc->scratch90 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
||||||
pmc->scratch91 = (sdram->emc_dqs_brlshft0 << 8 >> 29 << 21) | ((sdram->emc_dqs_brlshft0 << 11 >> 29 << 18) | ((sdram->emc_dqs_brlshft0 << 14 >> 29 << 15) | ((sdram->emc_dqs_brlshft0 << 17 >> 29 << 12) | ((sdram->emc_dqs_brlshft0 << 20 >> 29 << 9) | ((sdram->emc_dqs_brlshft0 << 23 >> 29 << 6) | (8 * (sdram->emc_dqs_brlshft0 << 26 >> 29) | (sdram->emc_dqs_brlshft0 & 7 | 8 * (pmc->scratch91 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
// pmc->scratch91 = (sdram->emc_dqs_brlshft0 << 8 >> 29 << 21) | ((sdram->emc_dqs_brlshft0 << 11 >> 29 << 18) | ((sdram->emc_dqs_brlshft0 << 14 >> 29 << 15) | ((sdram->emc_dqs_brlshft0 << 17 >> 29 << 12) | ((sdram->emc_dqs_brlshft0 << 20 >> 29 << 9) | ((sdram->emc_dqs_brlshft0 << 23 >> 29 << 6) | (8 * (sdram->emc_dqs_brlshft0 << 26 >> 29) | (sdram->emc_dqs_brlshft0 & 7 | 8 * (pmc->scratch91 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
||||||
pmc->scratch92 = (sdram->emc_dqs_brlshft1 << 8 >> 29 << 21) | ((sdram->emc_dqs_brlshft1 << 11 >> 29 << 18) | ((sdram->emc_dqs_brlshft1 << 14 >> 29 << 15) | ((sdram->emc_dqs_brlshft1 << 17 >> 29 << 12) | ((sdram->emc_dqs_brlshft1 << 20 >> 29 << 9) | ((sdram->emc_dqs_brlshft1 << 23 >> 29 << 6) | (8 * (sdram->emc_dqs_brlshft1 << 26 >> 29) | (sdram->emc_dqs_brlshft1 & 7 | 8 * (pmc->scratch92 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
// pmc->scratch92 = (sdram->emc_dqs_brlshft1 << 8 >> 29 << 21) | ((sdram->emc_dqs_brlshft1 << 11 >> 29 << 18) | ((sdram->emc_dqs_brlshft1 << 14 >> 29 << 15) | ((sdram->emc_dqs_brlshft1 << 17 >> 29 << 12) | ((sdram->emc_dqs_brlshft1 << 20 >> 29 << 9) | ((sdram->emc_dqs_brlshft1 << 23 >> 29 << 6) | (8 * (sdram->emc_dqs_brlshft1 << 26 >> 29) | (sdram->emc_dqs_brlshft1 & 7 | 8 * (pmc->scratch92 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
||||||
pmc->scratch93 = (2 * sdram->emc_swizzle_rank0_byte0 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank0_byte0 >> 29 << 18) | ((sdram->emc_swizzle_rank0_byte0 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte0 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte0 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte0 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte0 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte0 & 7 | 8 * (pmc->scratch93 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
// pmc->scratch93 = (2 * sdram->emc_swizzle_rank0_byte0 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank0_byte0 >> 29 << 18) | ((sdram->emc_swizzle_rank0_byte0 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte0 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte0 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte0 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte0 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte0 & 7 | 8 * (pmc->scratch93 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF;
|
||||||
pmc->scratch94 = ((u8)(sdram->emc_cfg) << 27 >> 31 << 31) | (2 * ((sdram->emc_ras << 24) | ((2 * sdram->emc_swizzle_rank0_byte1 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank0_byte1 >> 29 << 18) | ((sdram->emc_swizzle_rank0_byte1 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte1 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte1 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte1 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte1 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte1 & 7 | 8 * (pmc->scratch94 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch94 = ((u8)(sdram->emc_cfg) << 27 >> 31 << 31) | (2 * ((sdram->emc_ras << 24) | ((2 * sdram->emc_swizzle_rank0_byte1 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank0_byte1 >> 29 << 18) | ((sdram->emc_swizzle_rank0_byte1 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte1 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte1 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte1 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte1 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte1 & 7 | 8 * (pmc->scratch94 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch95 = ((u8)(sdram->emc_cfg) << 26 >> 31 << 31) | (2 * ((sdram->emc_w2p << 24) | ((2 * sdram->emc_swizzle_rank0_byte2 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank0_byte2 >> 29 << 18) | ((sdram->emc_swizzle_rank0_byte2 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte2 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte2 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte2 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte2 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte2 & 7 | 8 * (pmc->scratch95 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch95 = ((u8)(sdram->emc_cfg) << 26 >> 31 << 31) | (2 * ((sdram->emc_w2p << 24) | ((2 * sdram->emc_swizzle_rank0_byte2 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank0_byte2 >> 29 << 18) | ((sdram->emc_swizzle_rank0_byte2 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte2 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte2 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte2 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte2 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte2 & 7 | 8 * (pmc->scratch95 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch96 = ((u8)(sdram->emc_cfg) << 25 >> 31 << 31) | (2 * ((sdram->emc_qsafe << 24) | ((2 * sdram->emc_swizzle_rank0_byte3 >> 29 << 21) | (((sdram->emc_swizzle_rank0_byte3 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte3 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte3 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte3 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte3 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte3 & 7 | 8 * (pmc->scratch96 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF | (32 * sdram->emc_swizzle_rank0_byte3 >> 29 << 18)) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch96 = ((u8)(sdram->emc_cfg) << 25 >> 31 << 31) | (2 * ((sdram->emc_qsafe << 24) | ((2 * sdram->emc_swizzle_rank0_byte3 >> 29 << 21) | (((sdram->emc_swizzle_rank0_byte3 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank0_byte3 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank0_byte3 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank0_byte3 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank0_byte3 << 25 >> 29) | (sdram->emc_swizzle_rank0_byte3 & 7 | 8 * (pmc->scratch96 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF | (32 * sdram->emc_swizzle_rank0_byte3 >> 29 << 18)) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch97 = ((u8)(sdram->emc_cfg) << 24 >> 31 << 31) | (2 * ((sdram->emc_rdv << 24) | ((2 * sdram->emc_swizzle_rank1_byte0 >> 29 << 21) | (((sdram->emc_swizzle_rank1_byte0 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte0 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte0 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte0 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte0 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte0 & 7 | 8 * (pmc->scratch97 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF | (32 * sdram->emc_swizzle_rank1_byte0 >> 29 << 18)) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch97 = ((u8)(sdram->emc_cfg) << 24 >> 31 << 31) | (2 * ((sdram->emc_rdv << 24) | ((2 * sdram->emc_swizzle_rank1_byte0 >> 29 << 21) | (((sdram->emc_swizzle_rank1_byte0 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte0 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte0 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte0 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte0 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte0 & 7 | 8 * (pmc->scratch97 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF | (32 * sdram->emc_swizzle_rank1_byte0 >> 29 << 18)) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch98 = ((u16)(sdram->emc_cfg) << 23 >> 31 << 31) | (2 * (((u16)(sdram->emc_rw2pden) << 24) | ((2 * sdram->emc_swizzle_rank1_byte1 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank1_byte1 >> 29 << 18) | ((sdram->emc_swizzle_rank1_byte1 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte1 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte1 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte1 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte1 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte1 & 7 | 8 * (pmc->scratch98 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch98 = ((u16)(sdram->emc_cfg) << 23 >> 31 << 31) | (2 * (((u16)(sdram->emc_rw2pden) << 24) | ((2 * sdram->emc_swizzle_rank1_byte1 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank1_byte1 >> 29 << 18) | ((sdram->emc_swizzle_rank1_byte1 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte1 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte1 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte1 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte1 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte1 & 7 | 8 * (pmc->scratch98 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch99 = ((u16)(sdram->emc_cfg) << 22 >> 31 << 31) | (2 * ((sdram->emc_tfaw << 24) | ((2 * sdram->emc_swizzle_rank1_byte2 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank1_byte2 >> 29 << 18) | ((sdram->emc_swizzle_rank1_byte2 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte2 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte2 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte2 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte2 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte2 & 7 | 8 * (pmc->scratch99 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch99 = ((u16)(sdram->emc_cfg) << 22 >> 31 << 31) | (2 * ((sdram->emc_tfaw << 24) | ((2 * sdram->emc_swizzle_rank1_byte2 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank1_byte2 >> 29 << 18) | ((sdram->emc_swizzle_rank1_byte2 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte2 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte2 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte2 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte2 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte2 & 7 | 8 * (pmc->scratch99 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch100 = (sdram->emc_cfg << 13 >> 31 << 31) | (2 * ((sdram->emc_tclkstable << 24) | ((2 * sdram->emc_swizzle_rank1_byte3 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank1_byte3 >> 29 << 18) | ((sdram->emc_swizzle_rank1_byte3 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte3 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte3 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte3 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte3 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte3 & 7 | 8 * (pmc->scratch100 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch100 = (sdram->emc_cfg << 13 >> 31 << 31) | (2 * ((sdram->emc_tclkstable << 24) | ((2 * sdram->emc_swizzle_rank1_byte3 >> 29 << 21) | ((32 * sdram->emc_swizzle_rank1_byte3 >> 29 << 18) | ((sdram->emc_swizzle_rank1_byte3 << 9 >> 29 << 15) | ((sdram->emc_swizzle_rank1_byte3 << 13 >> 29 << 12) | ((sdram->emc_swizzle_rank1_byte3 << 17 >> 29 << 9) | ((sdram->emc_swizzle_rank1_byte3 << 21 >> 29 << 6) | (8 * (sdram->emc_swizzle_rank1_byte3 << 25 >> 29) | (sdram->emc_swizzle_rank1_byte3 & 7 | 8 * (pmc->scratch100 >> 3)) & 0xFFFFFFC7) & 0xFFFFFE3F) & 0xFFFFF1FF) & 0xFFFF8FFF) & 0xFFFC7FFF) & 0xFFE3FFFF) & 0xFF1FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
tmp = 2 * (((u8)(sdram->emc_trtm) << 24) | ((16 * sdram->emc_cfg_pipe2 >> 31 << 23) | ((32 * sdram->emc_cfg_pipe2 >> 31 << 22) | ((sdram->emc_cfg_pipe2 << 6 >> 31 << 21) | ((sdram->emc_cfg_pipe2 << 7 >> 31 << 20) | ((sdram->emc_cfg_pipe2 << 8 >> 31 << 19) | ((sdram->emc_cfg_pipe2 << 9 >> 31 << 18) | ((sdram->emc_cfg_pipe2 << 10 >> 31 << 17) | ((sdram->emc_cfg_pipe2 << 11 >> 31 << 16) | ((sdram->emc_cfg_pipe2 << 12 >> 31 << 15) | ((sdram->emc_cfg_pipe2 << 13 >> 31 << 14) | ((sdram->emc_cfg_pipe2 << 14 >> 31 << 13) | ((sdram->emc_cfg_pipe2 << 15 >> 31 << 12) | ((sdram->emc_cfg_pipe2 << 20 >> 31 << 11) | ((sdram->emc_cfg_pipe2 << 21 >> 31 << 10) | ((sdram->emc_cfg_pipe2 << 22 >> 31 << 9) | ((sdram->emc_cfg_pipe2 << 23 >> 31 << 8) | ((sdram->emc_cfg_pipe2 << 24 >> 31 << 7) | ((sdram->emc_cfg_pipe2 << 25 >> 31 << 6) | (32 * (sdram->emc_cfg_pipe2 << 26 >> 31) | (16 * (sdram->emc_cfg_pipe2 << 27 >> 31) | (8 * (sdram->emc_cfg_pipe2 << 28 >> 31) | (4 * (sdram->emc_cfg_pipe2 << 29 >> 31) | (2 * (sdram->emc_cfg_pipe2 << 30 >> 31) | (sdram->emc_cfg_pipe2 & 1 | 2 * (pmc->scratch101 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1;
|
// tmp = 2 * (((u8)(sdram->emc_trtm) << 24) | ((16 * sdram->emc_cfg_pipe2 >> 31 << 23) | ((32 * sdram->emc_cfg_pipe2 >> 31 << 22) | ((sdram->emc_cfg_pipe2 << 6 >> 31 << 21) | ((sdram->emc_cfg_pipe2 << 7 >> 31 << 20) | ((sdram->emc_cfg_pipe2 << 8 >> 31 << 19) | ((sdram->emc_cfg_pipe2 << 9 >> 31 << 18) | ((sdram->emc_cfg_pipe2 << 10 >> 31 << 17) | ((sdram->emc_cfg_pipe2 << 11 >> 31 << 16) | ((sdram->emc_cfg_pipe2 << 12 >> 31 << 15) | ((sdram->emc_cfg_pipe2 << 13 >> 31 << 14) | ((sdram->emc_cfg_pipe2 << 14 >> 31 << 13) | ((sdram->emc_cfg_pipe2 << 15 >> 31 << 12) | ((sdram->emc_cfg_pipe2 << 20 >> 31 << 11) | ((sdram->emc_cfg_pipe2 << 21 >> 31 << 10) | ((sdram->emc_cfg_pipe2 << 22 >> 31 << 9) | ((sdram->emc_cfg_pipe2 << 23 >> 31 << 8) | ((sdram->emc_cfg_pipe2 << 24 >> 31 << 7) | ((sdram->emc_cfg_pipe2 << 25 >> 31 << 6) | (32 * (sdram->emc_cfg_pipe2 << 26 >> 31) | (16 * (sdram->emc_cfg_pipe2 << 27 >> 31) | (8 * (sdram->emc_cfg_pipe2 << 28 >> 31) | (4 * (sdram->emc_cfg_pipe2 << 29 >> 31) | (2 * (sdram->emc_cfg_pipe2 << 30 >> 31) | (sdram->emc_cfg_pipe2 & 1 | 2 * (pmc->scratch101 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1;
|
||||||
pmc->scratch101 = (sdram->emc_cfg << 10 >> 31 << 31) | tmp;
|
// pmc->scratch101 = (sdram->emc_cfg << 10 >> 31 << 31) | tmp;
|
||||||
tmp = (2 * (pmc->scratch102 >> 1) | sdram->emc_cfg_pipe1 & 1) & 0xFFFFFFFD;
|
// tmp = (2 * (pmc->scratch102 >> 1) | sdram->emc_cfg_pipe1 & 1) & 0xFFFFFFFD;
|
||||||
pmc->scratch102 = (sdram->emc_cfg << 9 >> 31 << 31) | (2 * (((u8)(sdram->emc_twtm) << 24) | ((16 * sdram->emc_cfg_pipe1 >> 31 << 23) | ((32 * sdram->emc_cfg_pipe1 >> 31 << 22) | ((sdram->emc_cfg_pipe1 << 6 >> 31 << 21) | ((sdram->emc_cfg_pipe1 << 7 >> 31 << 20) | ((sdram->emc_cfg_pipe1 << 8 >> 31 << 19) | ((sdram->emc_cfg_pipe1 << 9 >> 31 << 18) | ((sdram->emc_cfg_pipe1 << 10 >> 31 << 17) | ((sdram->emc_cfg_pipe1 << 11 >> 31 << 16) | ((sdram->emc_cfg_pipe1 << 12 >> 31 << 15) | ((sdram->emc_cfg_pipe1 << 13 >> 31 << 14) | ((sdram->emc_cfg_pipe1 << 14 >> 31 << 13) | ((sdram->emc_cfg_pipe1 << 15 >> 31 << 12) | ((sdram->emc_cfg_pipe1 << 20 >> 31 << 11) | ((sdram->emc_cfg_pipe1 << 21 >> 31 << 10) | ((sdram->emc_cfg_pipe1 << 22 >> 31 << 9) | ((sdram->emc_cfg_pipe1 << 23 >> 31 << 8) | ((sdram->emc_cfg_pipe1 << 24 >> 31 << 7) | ((sdram->emc_cfg_pipe1 << 25 >> 31 << 6) | (32 * (sdram->emc_cfg_pipe1 << 26 >> 31) | (16 * (sdram->emc_cfg_pipe1 << 27 >> 31) | (8 * (sdram->emc_cfg_pipe1 << 28 >> 31) | (4 * (sdram->emc_cfg_pipe1 << 29 >> 31) | (2 * (sdram->emc_cfg_pipe1 << 30 >> 31) | tmp) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch102 = (sdram->emc_cfg << 9 >> 31 << 31) | (2 * (((u8)(sdram->emc_twtm) << 24) | ((16 * sdram->emc_cfg_pipe1 >> 31 << 23) | ((32 * sdram->emc_cfg_pipe1 >> 31 << 22) | ((sdram->emc_cfg_pipe1 << 6 >> 31 << 21) | ((sdram->emc_cfg_pipe1 << 7 >> 31 << 20) | ((sdram->emc_cfg_pipe1 << 8 >> 31 << 19) | ((sdram->emc_cfg_pipe1 << 9 >> 31 << 18) | ((sdram->emc_cfg_pipe1 << 10 >> 31 << 17) | ((sdram->emc_cfg_pipe1 << 11 >> 31 << 16) | ((sdram->emc_cfg_pipe1 << 12 >> 31 << 15) | ((sdram->emc_cfg_pipe1 << 13 >> 31 << 14) | ((sdram->emc_cfg_pipe1 << 14 >> 31 << 13) | ((sdram->emc_cfg_pipe1 << 15 >> 31 << 12) | ((sdram->emc_cfg_pipe1 << 20 >> 31 << 11) | ((sdram->emc_cfg_pipe1 << 21 >> 31 << 10) | ((sdram->emc_cfg_pipe1 << 22 >> 31 << 9) | ((sdram->emc_cfg_pipe1 << 23 >> 31 << 8) | ((sdram->emc_cfg_pipe1 << 24 >> 31 << 7) | ((sdram->emc_cfg_pipe1 << 25 >> 31 << 6) | (32 * (sdram->emc_cfg_pipe1 << 26 >> 31) | (16 * (sdram->emc_cfg_pipe1 << 27 >> 31) | (8 * (sdram->emc_cfg_pipe1 << 28 >> 31) | (4 * (sdram->emc_cfg_pipe1 << 29 >> 31) | (2 * (sdram->emc_cfg_pipe1 << 30 >> 31) | tmp) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
tmp = 2 * (((u8)(sdram->emc_tratm) << 24) | ((sdram->emc_pmacro_ddll_pwrd0 >> 31 << 23) | ((2 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 22) | ((8 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 21) | ((16 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 20) | ((32 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 19) | ((sdram->emc_pmacro_ddll_pwrd0 << 6 >> 31 << 18) | ((sdram->emc_pmacro_ddll_pwrd0 << 8 >> 31 << 17) | ((sdram->emc_pmacro_ddll_pwrd0 << 9 >> 31 << 16) | ((sdram->emc_pmacro_ddll_pwrd0 << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_pwrd0 << 12 >> 31 << 14) | ((sdram->emc_pmacro_ddll_pwrd0 << 13 >> 31 << 13) | ((sdram->emc_pmacro_ddll_pwrd0 << 14 >> 31 << 12) | ((sdram->emc_pmacro_ddll_pwrd0 << 16 >> 31 << 11) | ((sdram->emc_pmacro_ddll_pwrd0 << 17 >> 31 << 10) | ((sdram->emc_pmacro_ddll_pwrd0 << 19 >> 31 << 9) | ((sdram->emc_pmacro_ddll_pwrd0 << 20 >> 31 << 8) | ((sdram->emc_pmacro_ddll_pwrd0 << 21 >> 31 << 7) | ((sdram->emc_pmacro_ddll_pwrd0 << 22 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_pwrd0 << 24 >> 31) | (16 * (sdram->emc_pmacro_ddll_pwrd0 << 25 >> 31) | (8 * (sdram->emc_pmacro_ddll_pwrd0 << 27 >> 31) | (4 * (sdram->emc_pmacro_ddll_pwrd0 << 28 >> 31) | (2 * (sdram->emc_pmacro_ddll_pwrd0 << 29 >> 31) | ((sdram->emc_pmacro_ddll_pwrd0 << 30 >> 31) | 2 * (pmc->scratch103 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1;
|
// tmp = 2 * (((u8)(sdram->emc_tratm) << 24) | ((sdram->emc_pmacro_ddll_pwrd0 >> 31 << 23) | ((2 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 22) | ((8 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 21) | ((16 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 20) | ((32 * sdram->emc_pmacro_ddll_pwrd0 >> 31 << 19) | ((sdram->emc_pmacro_ddll_pwrd0 << 6 >> 31 << 18) | ((sdram->emc_pmacro_ddll_pwrd0 << 8 >> 31 << 17) | ((sdram->emc_pmacro_ddll_pwrd0 << 9 >> 31 << 16) | ((sdram->emc_pmacro_ddll_pwrd0 << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_pwrd0 << 12 >> 31 << 14) | ((sdram->emc_pmacro_ddll_pwrd0 << 13 >> 31 << 13) | ((sdram->emc_pmacro_ddll_pwrd0 << 14 >> 31 << 12) | ((sdram->emc_pmacro_ddll_pwrd0 << 16 >> 31 << 11) | ((sdram->emc_pmacro_ddll_pwrd0 << 17 >> 31 << 10) | ((sdram->emc_pmacro_ddll_pwrd0 << 19 >> 31 << 9) | ((sdram->emc_pmacro_ddll_pwrd0 << 20 >> 31 << 8) | ((sdram->emc_pmacro_ddll_pwrd0 << 21 >> 31 << 7) | ((sdram->emc_pmacro_ddll_pwrd0 << 22 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_pwrd0 << 24 >> 31) | (16 * (sdram->emc_pmacro_ddll_pwrd0 << 25 >> 31) | (8 * (sdram->emc_pmacro_ddll_pwrd0 << 27 >> 31) | (4 * (sdram->emc_pmacro_ddll_pwrd0 << 28 >> 31) | (2 * (sdram->emc_pmacro_ddll_pwrd0 << 29 >> 31) | ((sdram->emc_pmacro_ddll_pwrd0 << 30 >> 31) | 2 * (pmc->scratch103 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1;
|
||||||
pmc->scratch103 = (sdram->emc_cfg << 8 >> 31 << 31) | tmp;
|
// pmc->scratch103 = (sdram->emc_cfg << 8 >> 31 << 31) | tmp;
|
||||||
tmp = 2 * (((u8)(sdram->emc_twatm) << 24) | ((sdram->emc_pmacro_ddll_pwrd1 >> 31 << 23) | ((2 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 22) | ((8 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 21) | ((16 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 20) | ((32 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 19) | ((sdram->emc_pmacro_ddll_pwrd1 << 6 >> 31 << 18) | ((sdram->emc_pmacro_ddll_pwrd1 << 8 >> 31 << 17) | ((sdram->emc_pmacro_ddll_pwrd1 << 9 >> 31 << 16) | ((sdram->emc_pmacro_ddll_pwrd1 << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_pwrd1 << 12 >> 31 << 14) | ((sdram->emc_pmacro_ddll_pwrd1 << 13 >> 31 << 13) | ((sdram->emc_pmacro_ddll_pwrd1 << 14 >> 31 << 12) | ((sdram->emc_pmacro_ddll_pwrd1 << 16 >> 31 << 11) | ((sdram->emc_pmacro_ddll_pwrd1 << 17 >> 31 << 10) | ((sdram->emc_pmacro_ddll_pwrd1 << 19 >> 31 << 9) | ((sdram->emc_pmacro_ddll_pwrd1 << 20 >> 31 << 8) | ((sdram->emc_pmacro_ddll_pwrd1 << 21 >> 31 << 7) | ((sdram->emc_pmacro_ddll_pwrd1 << 22 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_pwrd1 << 24 >> 31) | (16 * (sdram->emc_pmacro_ddll_pwrd1 << 25 >> 31) | (8 * (sdram->emc_pmacro_ddll_pwrd1 << 27 >> 31) | (4 * (sdram->emc_pmacro_ddll_pwrd1 << 28 >> 31) | (2 * (sdram->emc_pmacro_ddll_pwrd1 << 29 >> 31) | ((sdram->emc_pmacro_ddll_pwrd1 << 30 >> 31) | 2 * (pmc->scratch104 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1;
|
// tmp = 2 * (((u8)(sdram->emc_twatm) << 24) | ((sdram->emc_pmacro_ddll_pwrd1 >> 31 << 23) | ((2 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 22) | ((8 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 21) | ((16 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 20) | ((32 * sdram->emc_pmacro_ddll_pwrd1 >> 31 << 19) | ((sdram->emc_pmacro_ddll_pwrd1 << 6 >> 31 << 18) | ((sdram->emc_pmacro_ddll_pwrd1 << 8 >> 31 << 17) | ((sdram->emc_pmacro_ddll_pwrd1 << 9 >> 31 << 16) | ((sdram->emc_pmacro_ddll_pwrd1 << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_pwrd1 << 12 >> 31 << 14) | ((sdram->emc_pmacro_ddll_pwrd1 << 13 >> 31 << 13) | ((sdram->emc_pmacro_ddll_pwrd1 << 14 >> 31 << 12) | ((sdram->emc_pmacro_ddll_pwrd1 << 16 >> 31 << 11) | ((sdram->emc_pmacro_ddll_pwrd1 << 17 >> 31 << 10) | ((sdram->emc_pmacro_ddll_pwrd1 << 19 >> 31 << 9) | ((sdram->emc_pmacro_ddll_pwrd1 << 20 >> 31 << 8) | ((sdram->emc_pmacro_ddll_pwrd1 << 21 >> 31 << 7) | ((sdram->emc_pmacro_ddll_pwrd1 << 22 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_pwrd1 << 24 >> 31) | (16 * (sdram->emc_pmacro_ddll_pwrd1 << 25 >> 31) | (8 * (sdram->emc_pmacro_ddll_pwrd1 << 27 >> 31) | (4 * (sdram->emc_pmacro_ddll_pwrd1 << 28 >> 31) | (2 * (sdram->emc_pmacro_ddll_pwrd1 << 29 >> 31) | ((sdram->emc_pmacro_ddll_pwrd1 << 30 >> 31) | 2 * (pmc->scratch104 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1;
|
||||||
pmc->scratch104 = (sdram->emc_cfg << 7 >> 31 << 31) | tmp;
|
// pmc->scratch104 = (sdram->emc_cfg << 7 >> 31 << 31) | tmp;
|
||||||
tmp = (sdram->emc_pmacro_ddll_pwrd2 << 22 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_pwrd2 << 24 >> 31) | (16 * (sdram->emc_pmacro_ddll_pwrd2 << 25 >> 31) | (8 * (sdram->emc_pmacro_ddll_pwrd2 << 27 >> 31) | (4 * (sdram->emc_pmacro_ddll_pwrd2 << 28 >> 31) | (2 * (sdram->emc_pmacro_ddll_pwrd2 << 29 >> 31) | ((sdram->emc_pmacro_ddll_pwrd2 << 30 >> 31) | 2 * (pmc->scratch105 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF;
|
// tmp = (sdram->emc_pmacro_ddll_pwrd2 << 22 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_pwrd2 << 24 >> 31) | (16 * (sdram->emc_pmacro_ddll_pwrd2 << 25 >> 31) | (8 * (sdram->emc_pmacro_ddll_pwrd2 << 27 >> 31) | (4 * (sdram->emc_pmacro_ddll_pwrd2 << 28 >> 31) | (2 * (sdram->emc_pmacro_ddll_pwrd2 << 29 >> 31) | ((sdram->emc_pmacro_ddll_pwrd2 << 30 >> 31) | 2 * (pmc->scratch105 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF;
|
||||||
pmc->scratch105 = (sdram->emc_cfg << 6 >> 31 << 31) | (2 * (((u8)(sdram->emc_tr2ref) << 24) | ((sdram->emc_pmacro_ddll_pwrd2 >> 31 << 23) | ((2 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 22) | ((8 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 21) | ((16 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 20) | ((32 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 19) | ((sdram->emc_pmacro_ddll_pwrd2 << 6 >> 31 << 18) | ((sdram->emc_pmacro_ddll_pwrd2 << 8 >> 31 << 17) | ((sdram->emc_pmacro_ddll_pwrd2 << 9 >> 31 << 16) | ((sdram->emc_pmacro_ddll_pwrd2 << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_pwrd2 << 12 >> 31 << 14) | ((sdram->emc_pmacro_ddll_pwrd2 << 13 >> 31 << 13) | ((sdram->emc_pmacro_ddll_pwrd2 << 14 >> 31 << 12) | ((sdram->emc_pmacro_ddll_pwrd2 << 16 >> 31 << 11) | ((sdram->emc_pmacro_ddll_pwrd2 << 17 >> 31 << 10) | ((sdram->emc_pmacro_ddll_pwrd2 << 19 >> 31 << 9) | ((sdram->emc_pmacro_ddll_pwrd2 << 20 >> 31 << 8) | ((sdram->emc_pmacro_ddll_pwrd2 << 21 >> 31 << 7) | tmp & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch105 = (sdram->emc_cfg << 6 >> 31 << 31) | (2 * (((u8)(sdram->emc_tr2ref) << 24) | ((sdram->emc_pmacro_ddll_pwrd2 >> 31 << 23) | ((2 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 22) | ((8 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 21) | ((16 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 20) | ((32 * sdram->emc_pmacro_ddll_pwrd2 >> 31 << 19) | ((sdram->emc_pmacro_ddll_pwrd2 << 6 >> 31 << 18) | ((sdram->emc_pmacro_ddll_pwrd2 << 8 >> 31 << 17) | ((sdram->emc_pmacro_ddll_pwrd2 << 9 >> 31 << 16) | ((sdram->emc_pmacro_ddll_pwrd2 << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_pwrd2 << 12 >> 31 << 14) | ((sdram->emc_pmacro_ddll_pwrd2 << 13 >> 31 << 13) | ((sdram->emc_pmacro_ddll_pwrd2 << 14 >> 31 << 12) | ((sdram->emc_pmacro_ddll_pwrd2 << 16 >> 31 << 11) | ((sdram->emc_pmacro_ddll_pwrd2 << 17 >> 31 << 10) | ((sdram->emc_pmacro_ddll_pwrd2 << 19 >> 31 << 9) | ((sdram->emc_pmacro_ddll_pwrd2 << 20 >> 31 << 8) | ((sdram->emc_pmacro_ddll_pwrd2 << 21 >> 31 << 7) | tmp & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch106 = (32 * sdram->emc_cfg >> 31 << 31) | (2 * (((u16)(sdram->emc_pdex2mrr) << 24) | ((8 * sdram->emc_pmacro_ddll_periodic_offset >> 31 << 23) | ((16 * sdram->emc_pmacro_ddll_periodic_offset >> 31 << 22) | ((32 * sdram->emc_pmacro_ddll_periodic_offset >> 31 << 21) | ((sdram->emc_pmacro_ddll_periodic_offset << 6 >> 31 << 20) | ((sdram->emc_pmacro_ddll_periodic_offset << 7 >> 31 << 19) | ((sdram->emc_pmacro_ddll_periodic_offset << 8 >> 31 << 18) | ((sdram->emc_pmacro_ddll_periodic_offset << 9 >> 31 << 17) | ((sdram->emc_pmacro_ddll_periodic_offset << 10 >> 31 << 16) | ((sdram->emc_pmacro_ddll_periodic_offset << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_periodic_offset << 15 >> 31 << 14) | ((sdram->emc_pmacro_ddll_periodic_offset << 16 >> 31 << 13) | ((sdram->emc_pmacro_ddll_periodic_offset << 17 >> 31 << 12) | ((sdram->emc_pmacro_ddll_periodic_offset << 18 >> 31 << 11) | ((sdram->emc_pmacro_ddll_periodic_offset << 19 >> 31 << 10) | ((sdram->emc_pmacro_ddll_periodic_offset << 20 >> 31 << 9) | ((sdram->emc_pmacro_ddll_periodic_offset << 21 >> 31 << 8) | ((sdram->emc_pmacro_ddll_periodic_offset << 22 >> 31 << 7) | ((sdram->emc_pmacro_ddll_periodic_offset << 23 >> 31 << 6) | (sdram->emc_pmacro_ddll_periodic_offset & 0x3F | (pmc->scratch106 >> 6 << 6)) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch106 = (32 * sdram->emc_cfg >> 31 << 31) | (2 * (((u16)(sdram->emc_pdex2mrr) << 24) | ((8 * sdram->emc_pmacro_ddll_periodic_offset >> 31 << 23) | ((16 * sdram->emc_pmacro_ddll_periodic_offset >> 31 << 22) | ((32 * sdram->emc_pmacro_ddll_periodic_offset >> 31 << 21) | ((sdram->emc_pmacro_ddll_periodic_offset << 6 >> 31 << 20) | ((sdram->emc_pmacro_ddll_periodic_offset << 7 >> 31 << 19) | ((sdram->emc_pmacro_ddll_periodic_offset << 8 >> 31 << 18) | ((sdram->emc_pmacro_ddll_periodic_offset << 9 >> 31 << 17) | ((sdram->emc_pmacro_ddll_periodic_offset << 10 >> 31 << 16) | ((sdram->emc_pmacro_ddll_periodic_offset << 11 >> 31 << 15) | ((sdram->emc_pmacro_ddll_periodic_offset << 15 >> 31 << 14) | ((sdram->emc_pmacro_ddll_periodic_offset << 16 >> 31 << 13) | ((sdram->emc_pmacro_ddll_periodic_offset << 17 >> 31 << 12) | ((sdram->emc_pmacro_ddll_periodic_offset << 18 >> 31 << 11) | ((sdram->emc_pmacro_ddll_periodic_offset << 19 >> 31 << 10) | ((sdram->emc_pmacro_ddll_periodic_offset << 20 >> 31 << 9) | ((sdram->emc_pmacro_ddll_periodic_offset << 21 >> 31 << 8) | ((sdram->emc_pmacro_ddll_periodic_offset << 22 >> 31 << 7) | ((sdram->emc_pmacro_ddll_periodic_offset << 23 >> 31 << 6) | (sdram->emc_pmacro_ddll_periodic_offset & 0x3F | (pmc->scratch106 >> 6 << 6)) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch107 = (8 * sdram->emc_cfg >> 31 << 31) | (2 * ((sdram->emc_clken_override << 15 >> 31 << 30) | ((sdram->emc_clken_override << 23 >> 31 << 29) | ((sdram->emc_clken_override << 24 >> 31 << 28) | ((sdram->emc_clken_override << 25 >> 31 << 27) | ((sdram->emc_clken_override << 28 >> 31 << 26) | ((sdram->emc_clken_override << 29 >> 31 << 25) | ((sdram->emc_clken_override << 30 >> 31 << 24) | ((sdram->mc_emem_arb_da_covers << 8 >> 24 << 16) | ((sdram->mc_emem_arb_da_covers << 16 >> 24 << 8) | (sdram->mc_emem_arb_da_covers & 0xFF | (pmc->scratch107 >> 8 << 8)) & 0xFFFF00FF) & 0xFF00FFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch107 = (8 * sdram->emc_cfg >> 31 << 31) | (2 * ((sdram->emc_clken_override << 15 >> 31 << 30) | ((sdram->emc_clken_override << 23 >> 31 << 29) | ((sdram->emc_clken_override << 24 >> 31 << 28) | ((sdram->emc_clken_override << 25 >> 31 << 27) | ((sdram->emc_clken_override << 28 >> 31 << 26) | ((sdram->emc_clken_override << 29 >> 31 << 25) | ((sdram->emc_clken_override << 30 >> 31 << 24) | ((sdram->mc_emem_arb_da_covers << 8 >> 24 << 16) | ((sdram->mc_emem_arb_da_covers << 16 >> 24 << 8) | (sdram->mc_emem_arb_da_covers & 0xFF | (pmc->scratch107 >> 8 << 8)) & 0xFFFF00FF) & 0xFF00FFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch108 = (sdram->emc_rfc_pb << 23) | ((sdram->emc_xm2_comp_pad_ctrl >> 24 << 15) | ((sdram->emc_xm2_comp_pad_ctrl << 12 >> 24 << 7) | ((sdram->emc_xm2_comp_pad_ctrl << 20 >> 31 << 6) | (32 * (sdram->emc_xm2_comp_pad_ctrl << 22 >> 31) | (4 * (sdram->emc_xm2_comp_pad_ctrl << 25 >> 29) | (sdram->emc_xm2_comp_pad_ctrl & 3 | 4 * (pmc->scratch108 >> 2)) & 0xFFFFFFE3) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFF807F) & 0xFF807FFF) & 0x7FFFFF;
|
// pmc->scratch108 = (sdram->emc_rfc_pb << 23) | ((sdram->emc_xm2_comp_pad_ctrl >> 24 << 15) | ((sdram->emc_xm2_comp_pad_ctrl << 12 >> 24 << 7) | ((sdram->emc_xm2_comp_pad_ctrl << 20 >> 31 << 6) | (32 * (sdram->emc_xm2_comp_pad_ctrl << 22 >> 31) | (4 * (sdram->emc_xm2_comp_pad_ctrl << 25 >> 29) | (sdram->emc_xm2_comp_pad_ctrl & 3 | 4 * (pmc->scratch108 >> 2)) & 0xFFFFFFE3) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFF807F) & 0xFF807FFF) & 0x7FFFFF;
|
||||||
pmc->scratch109 = (sdram->emc_cfg_update >> 31 << 31) | (2 * ((2 * sdram->emc_cfg_update >> 31 << 30) | ((4 * sdram->emc_cfg_update >> 31 << 29) | ((8 * sdram->emc_cfg_update >> 31 << 28) | ((sdram->emc_cfg_update << 21 >> 30 << 26) | ((sdram->emc_cfg_update << 23 >> 31 << 25) | ((sdram->emc_cfg_update << 29 >> 30 << 23) | ((sdram->emc_cfg_update << 22) & 0x7FFFFF | ((sdram->emc_auto_cal_config3 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config3 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config3 << 17 >> 25 << 7) | ((pmc->scratch109 >> 7 << 7) | sdram->emc_auto_cal_config3 & 0x7F) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFE7FFFFF) & 0xFDFFFFFF) & 0xF3FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch109 = (sdram->emc_cfg_update >> 31 << 31) | (2 * ((2 * sdram->emc_cfg_update >> 31 << 30) | ((4 * sdram->emc_cfg_update >> 31 << 29) | ((8 * sdram->emc_cfg_update >> 31 << 28) | ((sdram->emc_cfg_update << 21 >> 30 << 26) | ((sdram->emc_cfg_update << 23 >> 31 << 25) | ((sdram->emc_cfg_update << 29 >> 30 << 23) | ((sdram->emc_cfg_update << 22) & 0x7FFFFF | ((sdram->emc_auto_cal_config3 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config3 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config3 << 17 >> 25 << 7) | ((pmc->scratch109 >> 7 << 7) | sdram->emc_auto_cal_config3 & 0x7F) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFE7FFFFF) & 0xFDFFFFFF) & 0xF3FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch110 = (sdram->emc_rfc << 22) | ((sdram->emc_auto_cal_config4 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config4 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config4 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config4 & 0x7F | (pmc->scratch110 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0x3FFFFF;
|
// pmc->scratch110 = (sdram->emc_rfc << 22) | ((sdram->emc_auto_cal_config4 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config4 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config4 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config4 & 0x7F | (pmc->scratch110 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0x3FFFFF;
|
||||||
pmc->scratch111 = ((u16)(sdram->emc_txsr) << 22) | ((sdram->emc_auto_cal_config5 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config5 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config5 << 17 >> 25 << 7) | ((pmc->scratch111 >> 7 << 7) | sdram->emc_auto_cal_config5 & 0x7F) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0x3FFFFF;
|
// pmc->scratch111 = ((u16)(sdram->emc_txsr) << 22) | ((sdram->emc_auto_cal_config5 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config5 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config5 << 17 >> 25 << 7) | ((pmc->scratch111 >> 7 << 7) | sdram->emc_auto_cal_config5 & 0x7F) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0x3FFFFF;
|
||||||
pmc->scratch112 = (16 * sdram->emc_mc2emc_q >> 28 << 28) | ((sdram->emc_mc2emc_q << 21 >> 29 << 25) | ((sdram->emc_mc2emc_q << 22) & 0x1FFFFFF | ((sdram->emc_auto_cal_config6 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config6 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config6 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config6 & 0x7F | (pmc->scratch112 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xFFFFFFF;
|
// pmc->scratch112 = (16 * sdram->emc_mc2emc_q >> 28 << 28) | ((sdram->emc_mc2emc_q << 21 >> 29 << 25) | ((sdram->emc_mc2emc_q << 22) & 0x1FFFFFF | ((sdram->emc_auto_cal_config6 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config6 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config6 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config6 & 0x7F | (pmc->scratch112 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch113 = (sdram->mc_emem_arb_ring1_throttle << 11 >> 27 << 27) | ((sdram->mc_emem_arb_ring1_throttle << 22) | ((sdram->emc_auto_cal_config7 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config7 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config7 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config7 & 0x7F | (pmc->scratch113 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xF83FFFFF) & 0x7FFFFFF;
|
// pmc->scratch113 = (sdram->mc_emem_arb_ring1_throttle << 11 >> 27 << 27) | ((sdram->mc_emem_arb_ring1_throttle << 22) | ((sdram->emc_auto_cal_config7 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config7 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config7 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config7 & 0x7F | (pmc->scratch113 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xF83FFFFF) & 0x7FFFFFF;
|
||||||
pmc->scratch114 = (sdram->emc_auto_cal_config8 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config8 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config8 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config8 & 0x7F | (pmc->scratch114 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF;
|
// pmc->scratch114 = (sdram->emc_auto_cal_config8 << 8 >> 28 << 18) | ((sdram->emc_auto_cal_config8 << 12 >> 28 << 14) | ((sdram->emc_auto_cal_config8 << 17 >> 25 << 7) | (sdram->emc_auto_cal_config8 & 0x7F | (pmc->scratch114 >> 7 << 7)) & 0xFFFFC07F) & 0xFFFC3FFF) & 0xFFC3FFFF;
|
||||||
pmc->scratch115 = (4 * sdram->emc_cfg >> 31 << 31) | (2 * (((u16)(sdram->emc_ar2pden) << 22) | ((sdram->emc_fbio_cfg7 << 10 >> 30 << 20) | ((sdram->emc_fbio_cfg7 << 12 >> 31 << 19) | ((sdram->emc_fbio_cfg7 << 13 >> 31 << 18) | ((sdram->emc_fbio_cfg7 << 14 >> 31 << 17) | ((sdram->emc_fbio_cfg7 << 15 >> 31 << 16) | ((sdram->emc_fbio_cfg7 << 16 >> 31 << 15) | ((sdram->emc_fbio_cfg7 << 17 >> 31 << 14) | ((sdram->emc_fbio_cfg7 << 18 >> 31 << 13) | ((sdram->emc_fbio_cfg7 << 19 >> 31 << 12) | ((sdram->emc_fbio_cfg7 << 20 >> 31 << 11) | ((sdram->emc_fbio_cfg7 << 21 >> 31 << 10) | ((sdram->emc_fbio_cfg7 << 22 >> 31 << 9) | ((sdram->emc_fbio_cfg7 << 23 >> 31 << 8) | ((sdram->emc_fbio_cfg7 << 24 >> 31 << 7) | ((sdram->emc_fbio_cfg7 << 25 >> 31 << 6) | (32 * (sdram->emc_fbio_cfg7 << 26 >> 31) | (16 * (sdram->emc_fbio_cfg7 << 27 >> 31) | (8 * (sdram->emc_fbio_cfg7 << 28 >> 31) | (4 * (sdram->emc_fbio_cfg7 << 29 >> 31) | (2 * (sdram->emc_fbio_cfg7 << 30 >> 31) | (sdram->emc_fbio_cfg7 & 1 | 2 * (pmc->scratch115 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFCFFFFF) & 0x803FFFFF) >> 1);
|
// pmc->scratch115 = (4 * sdram->emc_cfg >> 31 << 31) | (2 * (((u16)(sdram->emc_ar2pden) << 22) | ((sdram->emc_fbio_cfg7 << 10 >> 30 << 20) | ((sdram->emc_fbio_cfg7 << 12 >> 31 << 19) | ((sdram->emc_fbio_cfg7 << 13 >> 31 << 18) | ((sdram->emc_fbio_cfg7 << 14 >> 31 << 17) | ((sdram->emc_fbio_cfg7 << 15 >> 31 << 16) | ((sdram->emc_fbio_cfg7 << 16 >> 31 << 15) | ((sdram->emc_fbio_cfg7 << 17 >> 31 << 14) | ((sdram->emc_fbio_cfg7 << 18 >> 31 << 13) | ((sdram->emc_fbio_cfg7 << 19 >> 31 << 12) | ((sdram->emc_fbio_cfg7 << 20 >> 31 << 11) | ((sdram->emc_fbio_cfg7 << 21 >> 31 << 10) | ((sdram->emc_fbio_cfg7 << 22 >> 31 << 9) | ((sdram->emc_fbio_cfg7 << 23 >> 31 << 8) | ((sdram->emc_fbio_cfg7 << 24 >> 31 << 7) | ((sdram->emc_fbio_cfg7 << 25 >> 31 << 6) | (32 * (sdram->emc_fbio_cfg7 << 26 >> 31) | (16 * (sdram->emc_fbio_cfg7 << 27 >> 31) | (8 * (sdram->emc_fbio_cfg7 << 28 >> 31) | (4 * (sdram->emc_fbio_cfg7 << 29 >> 31) | (2 * (sdram->emc_fbio_cfg7 << 30 >> 31) | (sdram->emc_fbio_cfg7 & 1 | 2 * (pmc->scratch115 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFCFFFFF) & 0x803FFFFF) >> 1);
|
||||||
pmc->scratch123 = (2 * sdram->emc_cfg >> 31 << 31) | (2 * ((sdram->emc_rfc_slr << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_0 & 0x7FF | (pmc->scratch123 >> 11 << 11)) & 0xFFC007FF) & 0x803FFFFF) >> 1);
|
// pmc->scratch123 = (2 * sdram->emc_cfg >> 31 << 31) | (2 * ((sdram->emc_rfc_slr << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_0 & 0x7FF | (pmc->scratch123 >> 11 << 11)) & 0xFFC007FF) & 0x803FFFFF) >> 1);
|
||||||
pmc->scratch124 = (sdram->emc_cfg >> 31 << 31) | (2 * ((4 * sdram->emc_ibdly >> 30 << 29) | ((sdram->emc_ibdly << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_1 & 0x7FF | (pmc->scratch124 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
// pmc->scratch124 = (sdram->emc_cfg >> 31 << 31) | (2 * ((4 * sdram->emc_ibdly >> 30 << 29) | ((sdram->emc_ibdly << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_1 & 0x7FF | (pmc->scratch124 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
||||||
pmc->scratch125 = (sdram->emc_fbio_cfg5 << 27 >> 31 << 31) | (2 * (((u16)(sdram->mc_emem_arb_timing_rfcpb) << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_2 & 0x7FF | (pmc->scratch125 >> 11 << 11)) & 0xFFC007FF) & 0x803FFFFF) >> 1);
|
// pmc->scratch125 = (sdram->emc_fbio_cfg5 << 27 >> 31 << 31) | (2 * (((u16)(sdram->mc_emem_arb_timing_rfcpb) << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_2 & 0x7FF | (pmc->scratch125 >> 11 << 11)) & 0xFFC007FF) & 0x803FFFFF) >> 1);
|
||||||
pmc->scratch126 = (sdram->emc_fbio_cfg5 << 16 >> 29 << 29) | ((sdram->emc_auto_cal_config9 << 25 >> 31 << 28) | ((sdram->emc_auto_cal_config9 << 26 >> 31 << 27) | ((sdram->emc_auto_cal_config9 << 27 >> 31 << 26) | ((sdram->emc_auto_cal_config9 << 28 >> 31 << 25) | ((sdram->emc_auto_cal_config9 << 29 >> 31 << 24) | ((sdram->emc_auto_cal_config9 << 30 >> 31 << 23) | ((sdram->emc_auto_cal_config9 << 22) & 0x7FFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_3 & 0x7FF | (pmc->scratch126 >> 11 << 11)) & 0xFFC007FF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
// pmc->scratch126 = (sdram->emc_fbio_cfg5 << 16 >> 29 << 29) | ((sdram->emc_auto_cal_config9 << 25 >> 31 << 28) | ((sdram->emc_auto_cal_config9 << 26 >> 31 << 27) | ((sdram->emc_auto_cal_config9 << 27 >> 31 << 26) | ((sdram->emc_auto_cal_config9 << 28 >> 31 << 25) | ((sdram->emc_auto_cal_config9 << 29 >> 31 << 24) | ((sdram->emc_auto_cal_config9 << 30 >> 31 << 23) | ((sdram->emc_auto_cal_config9 << 22) & 0x7FFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_3 & 0x7FF | (pmc->scratch126 >> 11 << 11)) & 0xFFC007FF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch127 = ((u8)(sdram->emc_cfg2) << 26 >> 29 << 29) | ((sdram->emc_rdv_mask << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_4 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_4 & 0x7FF | (pmc->scratch127 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
// pmc->scratch127 = ((u8)(sdram->emc_cfg2) << 26 >> 29 << 29) | ((sdram->emc_rdv_mask << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_4 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_4 & 0x7FF | (pmc->scratch127 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch128 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 27 >> 29 << 29) | (((u8)(sdram->emc_rdv_early_mask) << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_5 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_5 & 0x7FF | (pmc->scratch128 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
// pmc->scratch128 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 27 >> 29 << 29) | (((u8)(sdram->emc_rdv_early_mask) << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank0_5 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank0_5 & 0x7FF | (pmc->scratch128 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch129 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 22 >> 29 << 29) | ((sdram->emc_rdv_early << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_0 & 0x7FF | (pmc->scratch129 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
// pmc->scratch129 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 22 >> 29 << 29) | ((sdram->emc_rdv_early << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_0 & 0x7FF | (pmc->scratch129 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch130 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 17 >> 29 << 29) | ((4 * sdram->emc_quse_width >> 31 << 28) | ((8 * sdram->emc_quse_width >> 31 << 27) | ((sdram->emc_quse_width << 22) & 0x7FFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_1 & 0x7FF | (pmc->scratch130 >> 11 << 11)) & 0xFFC007FF) & 0xF83FFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
// pmc->scratch130 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 17 >> 29 << 29) | ((4 * sdram->emc_quse_width >> 31 << 28) | ((8 * sdram->emc_quse_width >> 31 << 27) | ((sdram->emc_quse_width << 22) & 0x7FFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_1 & 0x7FF | (pmc->scratch130 >> 11 << 11)) & 0xFFC007FF) & 0xF83FFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch131 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 12 >> 29 << 29) | (((u16)(sdram->emc_pmacro_ddll_short_cmd_2) << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_2 & 0x7FF | (pmc->scratch131 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
// pmc->scratch131 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 12 >> 29 << 29) | (((u16)(sdram->emc_pmacro_ddll_short_cmd_2) << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_2 & 0x7FF | (pmc->scratch131 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch132 = (sdram->emc_pmacro_data_pad_tx_ctrl << 27 >> 29 << 29) | ((sdram->emc_pmacro_cmd_rx_term_mode << 18 >> 31 << 28) | ((sdram->emc_pmacro_cmd_rx_term_mode << 22 >> 30 << 26) | ((sdram->emc_pmacro_cmd_rx_term_mode << 26 >> 30 << 24) | ((sdram->emc_pmacro_cmd_rx_term_mode << 22) & 0xFFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_3 & 0x7FF | (pmc->scratch132 >> 11 << 11)) & 0xFFC007FF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
// pmc->scratch132 = (sdram->emc_pmacro_data_pad_tx_ctrl << 27 >> 29 << 29) | ((sdram->emc_pmacro_cmd_rx_term_mode << 18 >> 31 << 28) | ((sdram->emc_pmacro_cmd_rx_term_mode << 22 >> 30 << 26) | ((sdram->emc_pmacro_cmd_rx_term_mode << 26 >> 30 << 24) | ((sdram->emc_pmacro_cmd_rx_term_mode << 22) & 0xFFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_3 & 0x7FF | (pmc->scratch132 >> 11 << 11)) & 0xFFC007FF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch133 = (sdram->emc_pmacro_data_pad_tx_ctrl << 22 >> 29 << 29) | ((sdram->emc_pmacro_data_rx_term_mode << 18 >> 31 << 28) | ((sdram->emc_pmacro_data_rx_term_mode << 22 >> 30 << 26) | ((sdram->emc_pmacro_data_rx_term_mode << 26 >> 30 << 24) | ((sdram->emc_pmacro_data_rx_term_mode << 22) & 0xFFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank1_4 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_4 & 0x7FF | (pmc->scratch133 >> 11 << 11)) & 0xFFC007FF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
// pmc->scratch133 = (sdram->emc_pmacro_data_pad_tx_ctrl << 22 >> 29 << 29) | ((sdram->emc_pmacro_data_rx_term_mode << 18 >> 31 << 28) | ((sdram->emc_pmacro_data_rx_term_mode << 22 >> 30 << 26) | ((sdram->emc_pmacro_data_rx_term_mode << 26 >> 30 << 24) | ((sdram->emc_pmacro_data_rx_term_mode << 22) & 0xFFFFFF | ((32 * sdram->emc_pmacro_quse_ddll_rank1_4 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_4 & 0x7FF | (pmc->scratch133 >> 11 << 11)) & 0xFFC007FF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xEFFFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch134 = (sdram->emc_pmacro_data_pad_tx_ctrl << 17 >> 29 << 29) | ((sdram->mc_emem_arb_timing_rp << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank1_5 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_5 & 0x7FF | (pmc->scratch134 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
// pmc->scratch134 = (sdram->emc_pmacro_data_pad_tx_ctrl << 17 >> 29 << 29) | ((sdram->mc_emem_arb_timing_rp << 22) | ((32 * sdram->emc_pmacro_quse_ddll_rank1_5 >> 21 << 11) | (sdram->emc_pmacro_quse_ddll_rank1_5 & 0x7FF | (pmc->scratch134 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch135 = (sdram->emc_pmacro_data_pad_tx_ctrl << 12 >> 29 << 29) | ((sdram->mc_emem_arb_timing_ras << 22) | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_0 & 0x7FF | (pmc->scratch135 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
// pmc->scratch135 = (sdram->emc_pmacro_data_pad_tx_ctrl << 12 >> 29 << 29) | ((sdram->mc_emem_arb_timing_ras << 22) | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_0 & 0x7FF | (pmc->scratch135 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x1FFFFFFF;
|
||||||
pmc->scratch136 = (sdram->emc_fbio_cfg5 << 23 >> 31 << 31) | (2 * ((sdram->emc_cfg << 14 >> 30 << 29) | ((sdram->mc_emem_arb_timing_faw << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_1 & 0x7FF | (pmc->scratch136 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
// pmc->scratch136 = (sdram->emc_fbio_cfg5 << 23 >> 31 << 31) | (2 * ((sdram->emc_cfg << 14 >> 30 << 29) | ((sdram->mc_emem_arb_timing_faw << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_1 & 0x7FF | (pmc->scratch136 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
||||||
pmc->scratch137 = (sdram->emc_fbio_cfg5 << 21 >> 31 << 31) | (2 * ((sdram->emc_fbio_cfg5 << 29) | ((sdram->mc_emem_arb_timing_rap2pre << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_2 & 0x7FF | (pmc->scratch137 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
// pmc->scratch137 = (sdram->emc_fbio_cfg5 << 21 >> 31 << 31) | (2 * ((sdram->emc_fbio_cfg5 << 29) | ((sdram->mc_emem_arb_timing_rap2pre << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_2 & 0x7FF | (pmc->scratch137 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
||||||
pmc->scratch138 = (sdram->emc_fbio_cfg5 << 19 >> 31 << 31) | (2 * ((sdram->emc_fbio_cfg5 << 28 >> 30 << 29) | ((sdram->mc_emem_arb_timing_wap2pre << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_3 & 0x7FF | (pmc->scratch138 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
// pmc->scratch138 = (sdram->emc_fbio_cfg5 << 19 >> 31 << 31) | (2 * ((sdram->emc_fbio_cfg5 << 28 >> 30 << 29) | ((sdram->mc_emem_arb_timing_wap2pre << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_3 & 0x7FF | (pmc->scratch138 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
||||||
pmc->scratch139 = (sdram->emc_fbio_cfg5 << 7 >> 31 << 31) | (2 * ((16 * sdram->emc_cfg2 >> 30 << 29) | (((u8)(sdram->mc_emem_arb_timing_r2w) << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_4 & 0x7FF | (pmc->scratch139 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
// pmc->scratch139 = (sdram->emc_fbio_cfg5 << 7 >> 31 << 31) | (2 * ((16 * sdram->emc_cfg2 >> 30 << 29) | (((u8)(sdram->mc_emem_arb_timing_r2w) << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_4 & 0x7FF | (pmc->scratch139 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0x9FFFFFFF) >> 1);
|
||||||
pmc->scratch140 = (16 * sdram->emc_fbio_cfg5 >> 31 << 31) | (2 * ((32 * sdram->emc_fbio_cfg5 >> 31 << 30) | ((sdram->emc_fbio_cfg5 << 6 >> 31 << 29) | (((u8)(sdram->mc_emem_arb_timing_w2r) << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_5 & 0x7FF | (pmc->scratch140 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch140 = (16 * sdram->emc_fbio_cfg5 >> 31 << 31) | (2 * ((32 * sdram->emc_fbio_cfg5 >> 31 << 30) | ((sdram->emc_fbio_cfg5 << 6 >> 31 << 29) | (((u8)(sdram->mc_emem_arb_timing_w2r) << 22) & 0x1FFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank0_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank0_5 & 0x7FF | (pmc->scratch140 >> 11 << 11)) & 0xFFC007FF) & 0xE03FFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch141 = (sdram->emc_fbio_cfg5 << 8 >> 28 << 28) | (((u16)(sdram->emc_wdv) << 22) | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_0 & 0x7FF | (pmc->scratch141 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xFFFFFFF;
|
// pmc->scratch141 = (sdram->emc_fbio_cfg5 << 8 >> 28 << 28) | (((u16)(sdram->emc_wdv) << 22) | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_0 & 0x7FF | (pmc->scratch141 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch142 = ((u8)(sdram->emc_cfg2) << 31) | (2 * ((sdram->emc_fbio_cfg5 >> 31 << 30) | ((2 * sdram->emc_fbio_cfg5 >> 31 << 29) | ((8 * sdram->emc_fbio_cfg5 >> 31 << 28) | ((sdram->emc_quse << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_1 & 0x7FF | (pmc->scratch142 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch142 = ((u8)(sdram->emc_cfg2) << 31) | (2 * ((sdram->emc_fbio_cfg5 >> 31 << 30) | ((2 * sdram->emc_fbio_cfg5 >> 31 << 29) | ((8 * sdram->emc_fbio_cfg5 >> 31 << 28) | ((sdram->emc_quse << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_1 & 0x7FF | (pmc->scratch142 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch143 = (((u16)(sdram->emc_cfg2) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_cfg2) << 24) >> 31 << 30) | ((((u16)(sdram->emc_cfg2) << 29) >> 31 << 29) | ((((u16)(sdram->emc_cfg2) << 30) >> 31 << 28) | (((u8)(sdram->emc_pdex2wr) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_2 & 0x7FF | (pmc->scratch143 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch143 = (((u16)(sdram->emc_cfg2) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_cfg2) << 24) >> 31 << 30) | ((((u16)(sdram->emc_cfg2) << 29) >> 31 << 29) | ((((u16)(sdram->emc_cfg2) << 30) >> 31 << 28) | (((u8)(sdram->emc_pdex2wr) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_2 & 0x7FF | (pmc->scratch143 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch144 = (sdram->emc_cfg2 << 15 >> 31 << 31) | (2 * ((sdram->emc_cfg2 << 16 >> 31 << 30) | ((sdram->emc_cfg2 << 17 >> 31 << 29) | ((sdram->emc_cfg2 << 20 >> 31 << 28) | (((u8)(sdram->emc_pdex2rd) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_3 & 0x7FF | (pmc->scratch144 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch144 = (sdram->emc_cfg2 << 15 >> 31 << 31) | (2 * ((sdram->emc_cfg2 << 16 >> 31 << 30) | ((sdram->emc_cfg2 << 17 >> 31 << 29) | ((sdram->emc_cfg2 << 20 >> 31 << 28) | (((u8)(sdram->emc_pdex2rd) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_3 & 0x7FF | (pmc->scratch144 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch145 = (sdram->emc_cfg2 << 7 >> 31 << 31) | (2 * ((sdram->emc_cfg2 << 8 >> 31 << 30) | ((sdram->emc_cfg2 << 9 >> 31 << 29) | ((sdram->emc_cfg2 << 11 >> 31 << 28) | (((u16)(sdram->emc_pdex2che) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_4 & 0x7FF | (pmc->scratch145 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch145 = (sdram->emc_cfg2 << 7 >> 31 << 31) | (2 * ((sdram->emc_cfg2 << 8 >> 31 << 30) | ((sdram->emc_cfg2 << 9 >> 31 << 29) | ((sdram->emc_cfg2 << 11 >> 31 << 28) | (((u16)(sdram->emc_pdex2che) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_4 & 0x7FF | (pmc->scratch145 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch146 = (2 * sdram->emc_cfg2 >> 31 << 31) | (2 * ((4 * sdram->emc_cfg2 >> 31 << 30) | (((sdram->emc_cfg2 << 6 >> 31 << 28) | (((u8)(sdram->emc_pchg2pden) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_5 & 0x7FF | (pmc->scratch146 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF | (8 * sdram->emc_cfg2 >> 31 << 29)) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch146 = (2 * sdram->emc_cfg2 >> 31 << 31) | (2 * ((4 * sdram->emc_cfg2 >> 31 << 30) | (((sdram->emc_cfg2 << 6 >> 31 << 28) | (((u8)(sdram->emc_pchg2pden) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dq_rank1_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dq_rank1_5 & 0x7FF | (pmc->scratch146 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF | (8 * sdram->emc_cfg2 >> 31 << 29)) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch147 = (((u8)(sdram->emc_cfg_pipe) << 29) >> 31 << 31) | (2 * ((((u8)(sdram->emc_cfg_pipe) << 30) >> 31 << 30) | ((((u8)(sdram->emc_cfg_pipe) << 31) >> 2) | ((sdram->emc_cfg2 >> 31 << 28) | (((u16)(sdram->emc_act2pden) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_0 & 0x7FF | (pmc->scratch147 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch147 = (((u8)(sdram->emc_cfg_pipe) << 29) >> 31 << 31) | (2 * ((((u8)(sdram->emc_cfg_pipe) << 30) >> 31 << 30) | ((((u8)(sdram->emc_cfg_pipe) << 31) >> 2) | ((sdram->emc_cfg2 >> 31 << 28) | (((u16)(sdram->emc_act2pden) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_0 & 0x7FF | (pmc->scratch147 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch148 = (((u8)(sdram->emc_cfg_pipe) << 25) >> 31 << 31) | (2 * ((((u8)(sdram->emc_cfg_pipe) << 26) >> 31 << 30) | ((((u8)(sdram->emc_cfg_pipe) << 27) >> 31 << 29) | ((((u8)(sdram->emc_cfg_pipe) << 28) >> 31 << 28) | (((u16)(sdram->emc_cke2pden) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_1 & 0x7FF | (pmc->scratch148 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch148 = (((u8)(sdram->emc_cfg_pipe) << 25) >> 31 << 31) | (2 * ((((u8)(sdram->emc_cfg_pipe) << 26) >> 31 << 30) | ((((u8)(sdram->emc_cfg_pipe) << 27) >> 31 << 29) | ((((u8)(sdram->emc_cfg_pipe) << 28) >> 31 << 28) | (((u16)(sdram->emc_cke2pden) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_1 & 0x7FF | (pmc->scratch148 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch149 = (((u16)(sdram->emc_cfg_pipe) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_cfg_pipe) << 22) >> 31 << 30) | ((((u16)(sdram->emc_cfg_pipe) << 23) >> 31 << 29) | ((((u16)(sdram->emc_cfg_pipe) << 24) >> 31 << 28) | ((sdram->emc_tcke << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_2 & 0x7FF | (pmc->scratch149 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch149 = (((u16)(sdram->emc_cfg_pipe) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_cfg_pipe) << 22) >> 31 << 30) | ((((u16)(sdram->emc_cfg_pipe) << 23) >> 31 << 29) | ((((u16)(sdram->emc_cfg_pipe) << 24) >> 31 << 28) | ((sdram->emc_tcke << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_2 & 0x7FF | (pmc->scratch149 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch150 = (sdram->emc_cfg_pipe << 13 >> 31 << 31) | (2 * ((sdram->emc_cfg_pipe << 14 >> 31 << 30) | (((sdram->emc_cfg_pipe << 20 >> 31 << 28) | ((sdram->emc_trpab << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_3 & 0x7FF | (pmc->scratch150 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF | (sdram->emc_cfg_pipe << 15 >> 31 << 29)) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch150 = (sdram->emc_cfg_pipe << 13 >> 31 << 31) | (2 * ((sdram->emc_cfg_pipe << 14 >> 31 << 30) | (((sdram->emc_cfg_pipe << 20 >> 31 << 28) | ((sdram->emc_trpab << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_3 & 0x7FF | (pmc->scratch150 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF | (sdram->emc_cfg_pipe << 15 >> 31 << 29)) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch151 = (sdram->emc_cfg_pipe << 9 >> 31 << 31) | (2 * ((sdram->emc_cfg_pipe << 10 >> 31 << 30) | ((sdram->emc_cfg_pipe << 11 >> 31 << 29) | ((sdram->emc_cfg_pipe << 12 >> 31 << 28) | ((sdram->emc_einput << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_4 & 0x7FF | (pmc->scratch151 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch151 = (sdram->emc_cfg_pipe << 9 >> 31 << 31) | (2 * ((sdram->emc_cfg_pipe << 10 >> 31 << 30) | ((sdram->emc_cfg_pipe << 11 >> 31 << 29) | ((sdram->emc_cfg_pipe << 12 >> 31 << 28) | ((sdram->emc_einput << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_4 & 0x7FF | (pmc->scratch151 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch152 = (32 * sdram->emc_cfg_pipe >> 31 << 31) | (2 * ((sdram->emc_cfg_pipe << 6 >> 31 << 30) | ((sdram->emc_cfg_pipe << 7 >> 31 << 29) | ((sdram->emc_cfg_pipe << 8 >> 31 << 28) | ((sdram->emc_einput_duration << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_5 & 0x7FF | (pmc->scratch152 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch152 = (32 * sdram->emc_cfg_pipe >> 31 << 31) | (2 * ((sdram->emc_cfg_pipe << 6 >> 31 << 30) | ((sdram->emc_cfg_pipe << 7 >> 31 << 29) | ((sdram->emc_cfg_pipe << 8 >> 31 << 28) | ((sdram->emc_einput_duration << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank0_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank0_5 & 0x7FF | (pmc->scratch152 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch153 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 29) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 30) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 31) >> 2) | ((16 * sdram->emc_cfg_pipe >> 31 << 28) | ((sdram->emc_puterm_extra << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_0 & 0x7FF | (pmc->scratch153 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch153 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 29) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 30) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 31) >> 2) | ((16 * sdram->emc_cfg_pipe >> 31 << 28) | ((sdram->emc_puterm_extra << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_0 & 0x7FF | (pmc->scratch153 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch154 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 25) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 26) >> 31 << 30) | (((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 28) >> 31 << 28) | ((sdram->emc_tckesr << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_1 & 0x7FF | (pmc->scratch154 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF | (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 27) >> 31 << 29)) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch154 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 25) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 26) >> 31 << 30) | (((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 28) >> 31 << 28) | ((sdram->emc_tckesr << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_1 & 0x7FF | (pmc->scratch154 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF | (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 27) >> 31 << 29)) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch155 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 22) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 23) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 24) >> 31 << 28) | ((sdram->emc_tpd << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_2 & 0x7FF | (pmc->scratch155 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch155 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 22) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 23) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src0) << 24) >> 31 << 28) | ((sdram->emc_tpd << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_2 & 0x7FF | (pmc->scratch155 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch156 = (sdram->emc_pmacro_tx_sel_clk_src0 << 12 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src0 << 13 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 14 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 15 >> 31 << 28) | ((sdram->emc_wdv_mask << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_3 & 0x7FF | (pmc->scratch156 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch156 = (sdram->emc_pmacro_tx_sel_clk_src0 << 12 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src0 << 13 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 14 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 15 >> 31 << 28) | ((sdram->emc_wdv_mask << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_3 & 0x7FF | (pmc->scratch156 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch157 = (sdram->emc_pmacro_tx_sel_clk_src0 << 8 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src0 << 9 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 10 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 11 >> 31 << 28) | (((u16)(sdram->emc_wdv_chk) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_4 & 0x7FF | (pmc->scratch157 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch157 = (sdram->emc_pmacro_tx_sel_clk_src0 << 8 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src0 << 9 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 10 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 11 >> 31 << 28) | (((u16)(sdram->emc_wdv_chk) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_4 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_4 & 0x7FF | (pmc->scratch157 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch158 = ((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 31) | (2 * ((32 * sdram->emc_pmacro_tx_sel_clk_src0 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 6 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 7 >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft0) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft0) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_5 & 0x7FF | (pmc->scratch158 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch158 = ((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 31) | (2 * ((32 * sdram->emc_pmacro_tx_sel_clk_src0 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 6 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src0 << 7 >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft0) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft0) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ob_ddll_long_dqs_rank1_5 >> 21 << 11) | (sdram->emc_pmacro_ob_ddll_long_dqs_rank1_5 & 0x7FF | (pmc->scratch158 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch159 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 27) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 28) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 29) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 30) >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft1) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft1) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_0 & 0x7FF | (pmc->scratch159 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch159 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 27) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 28) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 29) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 30) >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft1) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft1) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_0 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_0 & 0x7FF | (pmc->scratch159 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch160 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 23) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 24) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 25) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 26) >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft2) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft2) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_1 & 0x7FF | (pmc->scratch160 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch160 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 23) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 24) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 25) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src1) << 26) >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft2) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft2) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_1 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_1 & 0x7FF | (pmc->scratch160 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch161 = (sdram->emc_pmacro_tx_sel_clk_src1 << 14 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src1 << 15 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 21 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 22 >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft3) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft3) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_2 & 0x7FF | (pmc->scratch161 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch161 = (sdram->emc_pmacro_tx_sel_clk_src1 << 14 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src1 << 15 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 21 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 22 >> 31 << 28) | (((u8)(sdram->emc_cmd_brlshft3) << 26 >> 29 << 25) | (((u8)(sdram->emc_cmd_brlshft3) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_2 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_2 & 0x7FF | (pmc->scratch161 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch162 = (sdram->emc_pmacro_tx_sel_clk_src1 << 10 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src1 << 11 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 12 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 13 >> 31 << 28) | (((u16)(sdram->emc_wev) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_3 & 0x7FF | (pmc->scratch162 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch162 = (sdram->emc_pmacro_tx_sel_clk_src1 << 10 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src1 << 11 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 12 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 13 >> 31 << 28) | (((u16)(sdram->emc_wev) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank0_3 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank0_3 & 0x7FF | (pmc->scratch162 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch163 = (sdram->emc_pmacro_tx_sel_clk_src1 << 6 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src1 << 7 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 8 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 9 >> 31 << 28) | (((u16)(sdram->emc_wsv) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_0 & 0x7FF | (pmc->scratch163 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch163 = (sdram->emc_pmacro_tx_sel_clk_src1 << 6 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src1 << 7 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 8 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src1 << 9 >> 31 << 28) | (((u16)(sdram->emc_wsv) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_0 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_0 & 0x7FF | (pmc->scratch163 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch164 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 29) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 30) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 31) >> 2) | ((32 * sdram->emc_pmacro_tx_sel_clk_src1 >> 31 << 28) | (((u8)(sdram->emc_cfg3) << 25 >> 29 << 25) | (((u8)(sdram->emc_cfg3) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_1 & 0x7FF | (pmc->scratch164 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch164 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 29) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 30) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 31) >> 2) | ((32 * sdram->emc_pmacro_tx_sel_clk_src1 >> 31 << 28) | (((u8)(sdram->emc_cfg3) << 25 >> 29 << 25) | (((u8)(sdram->emc_cfg3) << 22) & 0x1FFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_1 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_1 & 0x7FF | (pmc->scratch164 >> 11 << 11)) & 0xFFC007FF) & 0xFE3FFFFF) & 0xF1FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch165 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 25) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 26) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 27) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 28) >> 31 << 28) | ((sdram->emc_puterm_width << 23) & 0xFFFFFFF | ((sdram->emc_puterm_width >> 31 << 22) | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_2 & 0x7FF | (pmc->scratch165 >> 11 << 11)) & 0xFFC007FF) & 0xFFBFFFFF) & 0xF07FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch165 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 25) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 26) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 27) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 28) >> 31 << 28) | ((sdram->emc_puterm_width << 23) & 0xFFFFFFF | ((sdram->emc_puterm_width >> 31 << 22) | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_2 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_2 & 0x7FF | (pmc->scratch165 >> 11 << 11)) & 0xFFC007FF) & 0xFFBFFFFF) & 0xF07FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch166 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 22) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 23) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 24) >> 31 << 28) | ((sdram->mc_emem_arb_timing_rcd << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_3 & 0x7FF | (pmc->scratch166 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch166 = (((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 21) >> 31 << 31) | (2 * ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 22) >> 31 << 30) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 23) >> 31 << 29) | ((((u16)(sdram->emc_pmacro_tx_sel_clk_src3) << 24) >> 31 << 28) | ((sdram->mc_emem_arb_timing_rcd << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ib_ddll_long_dqs_rank1_3 >> 21 << 11) | (sdram->emc_pmacro_ib_ddll_long_dqs_rank1_3 & 0x7FF | (pmc->scratch166 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch167 = (sdram->emc_pmacro_tx_sel_clk_src3 << 12 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src3 << 13 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 14 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 15 >> 31 << 28) | (((u16)(sdram->mc_emem_arb_timing_ccdmw) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ddll_long_cmd_0 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_0 & 0x7FF | (pmc->scratch167 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch167 = (sdram->emc_pmacro_tx_sel_clk_src3 << 12 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src3 << 13 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 14 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 15 >> 31 << 28) | (((u16)(sdram->mc_emem_arb_timing_ccdmw) << 22) & 0xFFFFFFF | ((32 * sdram->emc_pmacro_ddll_long_cmd_0 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_0 & 0x7FF | (pmc->scratch167 >> 11 << 11)) & 0xFFC007FF) & 0xF03FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch168 = (sdram->emc_pmacro_tx_sel_clk_src3 << 8 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src3 << 9 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 10 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 11 >> 31 << 28) | ((sdram->mc_emem_arb_override << 28 >> 31 << 27) | (((sdram->mc_emem_arb_override << 21 >> 31 << 25) | ((sdram->mc_emem_arb_override << 15 >> 31 << 24) | ((32 * sdram->mc_emem_arb_override >> 31 << 23) | ((16 * sdram->mc_emem_arb_override >> 31 << 22) | ((32 * sdram->emc_pmacro_ddll_long_cmd_1 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_1 & 0x7FF | (pmc->scratch168 >> 11 << 11)) & 0xFFC007FF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF | (sdram->mc_emem_arb_override << 27 >> 31 << 26)) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch168 = (sdram->emc_pmacro_tx_sel_clk_src3 << 8 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src3 << 9 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 10 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 11 >> 31 << 28) | ((sdram->mc_emem_arb_override << 28 >> 31 << 27) | (((sdram->mc_emem_arb_override << 21 >> 31 << 25) | ((sdram->mc_emem_arb_override << 15 >> 31 << 24) | ((32 * sdram->mc_emem_arb_override >> 31 << 23) | ((16 * sdram->mc_emem_arb_override >> 31 << 22) | ((32 * sdram->emc_pmacro_ddll_long_cmd_1 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_1 & 0x7FF | (pmc->scratch168 >> 11 << 11)) & 0xFFC007FF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF | (sdram->mc_emem_arb_override << 27 >> 31 << 26)) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch169 = ((u16)(sdram->emc_rext) << 27) | (((u16)(sdram->emc_rrd) << 22) | ((32 * sdram->emc_pmacro_ddll_long_cmd_2 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_2 & 0x7FF | (pmc->scratch169 >> 11 << 11)) & 0xFFC007FF) & 0xF83FFFFF) & 0x7FFFFFF;
|
// pmc->scratch169 = ((u16)(sdram->emc_rext) << 27) | (((u16)(sdram->emc_rrd) << 22) | ((32 * sdram->emc_pmacro_ddll_long_cmd_2 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_2 & 0x7FF | (pmc->scratch169 >> 11 << 11)) & 0xFFC007FF) & 0xF83FFFFF) & 0x7FFFFFF;
|
||||||
pmc->scratch170 = ((u16)(sdram->emc_wext) << 27) | ((sdram->emc_tclkstop << 22) | ((32 * sdram->emc_pmacro_ddll_long_cmd_3 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_3 & 0x7FF | (pmc->scratch170 >> 11 << 11)) & 0xFFC007FF) & 0xF83FFFFF) & 0x7FFFFFF;
|
// pmc->scratch170 = ((u16)(sdram->emc_wext) << 27) | ((sdram->emc_tclkstop << 22) | ((32 * sdram->emc_pmacro_ddll_long_cmd_3 >> 21 << 11) | (sdram->emc_pmacro_ddll_long_cmd_3 & 0x7FF | (pmc->scratch170 >> 11 << 11)) & 0xFFC007FF) & 0xF83FFFFF) & 0x7FFFFFF;
|
||||||
tmp = (32 * sdram->emc_pmacro_perbit_fgcg_ctrl0 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl0 & 1 | 2 * (pmc->scratch171 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF;
|
// tmp = (32 * sdram->emc_pmacro_perbit_fgcg_ctrl0 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl0 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl0 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl0 & 1 | 2 * (pmc->scratch171 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF;
|
||||||
pmc->scratch171 = (sdram->emc_we_duration << 27) | ((sdram->emc_ref_ctrl2 >> 31 << 26) | ((32 * sdram->emc_ref_ctrl2 >> 29 << 23) | ((sdram->emc_ref_ctrl2 << 22) & 0x7FFFFF | tmp & 0xFFBFFFFF) & 0xFC7FFFFF) & 0xFBFFFFFF) & 0x7FFFFFF;
|
// pmc->scratch171 = (sdram->emc_we_duration << 27) | ((sdram->emc_ref_ctrl2 >> 31 << 26) | ((32 * sdram->emc_ref_ctrl2 >> 29 << 23) | ((sdram->emc_ref_ctrl2 << 22) & 0x7FFFFF | tmp & 0xFFBFFFFF) & 0xFC7FFFFF) & 0xFBFFFFFF) & 0x7FFFFFF;
|
||||||
tmp = (sdram->emc_pmacro_pad_cfg_ctrl << 22 >> 31 << 28) | ((sdram->emc_pmacro_pad_cfg_ctrl << 27) & 0xFFFFFFF | ((sdram->emc_ws_duration << 22) & 0x7FFFFFF | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl1 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl1 & 1 | 2 * (pmc->scratch172 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xF83FFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF;
|
// tmp = (sdram->emc_pmacro_pad_cfg_ctrl << 22 >> 31 << 28) | ((sdram->emc_pmacro_pad_cfg_ctrl << 27) & 0xFFFFFFF | ((sdram->emc_ws_duration << 22) & 0x7FFFFFF | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl1 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl1 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl1 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl1 & 1 | 2 * (pmc->scratch172 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xF83FFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF;
|
||||||
pmc->scratch172 = (sdram->emc_pmacro_pad_cfg_ctrl << 14 >> 30 << 30) | (4 * ((sdram->emc_pmacro_pad_cfg_ctrl << 18 >> 31 << 29) | tmp & 0xDFFFFFFF) >> 2);
|
// pmc->scratch172 = (sdram->emc_pmacro_pad_cfg_ctrl << 14 >> 30 << 30) | (4 * ((sdram->emc_pmacro_pad_cfg_ctrl << 18 >> 31 << 29) | tmp & 0xDFFFFFFF) >> 2);
|
||||||
pmc->scratch173 = ((u8)(sdram->mc_emem_arb_timing_r2r) << 27) | ((sdram->mc_emem_arb_timing_rrd << 22) | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl2 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl2 & 1 | 2 * (pmc->scratch173 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xF83FFFFF) & 0x7FFFFFF;
|
// pmc->scratch173 = ((u8)(sdram->mc_emem_arb_timing_r2r) << 27) | ((sdram->mc_emem_arb_timing_rrd << 22) | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl2 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl2 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl2 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl2 & 1 | 2 * (pmc->scratch173 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xF83FFFFF) & 0x7FFFFFF;
|
||||||
tmp = 32 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl3 & 1 | 2 * (pmc->scratch174 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF;
|
// tmp = 32 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl3 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl3 & 1 | 2 * (pmc->scratch174 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF;
|
||||||
pmc->scratch174 = ((u16)(sdram->emc_pmacro_tx_sel_clk_src2) << 30 >> 31 << 31) | (2 * (((u16)(sdram->emc_pmacro_tx_sel_clk_src2) << 30) | ((32 * sdram->emc_pmacro_tx_sel_clk_src3 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 6 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 7 >> 31 << 27) | (((u8)(sdram->mc_emem_arb_timing_w2w) << 22) & 0x7FFFFFF | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl3 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 25 >> 31 << 6) | tmp & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xF83FFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch174 = ((u16)(sdram->emc_pmacro_tx_sel_clk_src2) << 30 >> 31 << 31) | (2 * (((u16)(sdram->emc_pmacro_tx_sel_clk_src2) << 30) | ((32 * sdram->emc_pmacro_tx_sel_clk_src3 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 6 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src3 << 7 >> 31 << 27) | (((u8)(sdram->mc_emem_arb_timing_w2w) << 22) & 0x7FFFFFF | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl3 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl3 << 25 >> 31 << 6) | tmp & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xF83FFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
tmp = (sdram->emc_pmacro_tx_sel_clk_src2 << 28 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 29 >> 31 << 22) | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl4 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl4 & 1 | 2 * (pmc->scratch175 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF;
|
// tmp = (sdram->emc_pmacro_tx_sel_clk_src2 << 28 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 29 >> 31 << 22) | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl4 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl4 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl4 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl4 & 1 | 2 * (pmc->scratch175 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF;
|
||||||
pmc->scratch175 = (sdram->emc_pmacro_tx_sel_clk_src2 << 15 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src2 << 21 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 22 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 23 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 24 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 25 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 26 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 27 >> 31 << 24) | tmp & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch175 = (sdram->emc_pmacro_tx_sel_clk_src2 << 15 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src2 << 21 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 22 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 23 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 24 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 25 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 26 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 27 >> 31 << 24) | tmp & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
tmp = (sdram->emc_pmacro_tx_sel_clk_src2 << 12 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 13 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 14 >> 31 << 22) | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl5 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl5 & 1 | 2 * (pmc->scratch176 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF;
|
// tmp = (sdram->emc_pmacro_tx_sel_clk_src2 << 12 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 13 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 14 >> 31 << 22) | ((32 * sdram->emc_pmacro_perbit_fgcg_ctrl5 >> 31 << 21) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 6 >> 31 << 20) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 7 >> 31 << 19) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 8 >> 31 << 18) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 9 >> 31 << 17) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 10 >> 31 << 16) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 11 >> 31 << 15) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 12 >> 31 << 14) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 13 >> 31 << 13) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 14 >> 31 << 12) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 15 >> 31 << 11) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 21 >> 31 << 10) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 22 >> 31 << 9) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 23 >> 31 << 8) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 24 >> 31 << 7) | ((sdram->emc_pmacro_perbit_fgcg_ctrl5 << 25 >> 31 << 6) | (32 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 26 >> 31) | (16 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 27 >> 31) | (8 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 28 >> 31) | (4 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 29 >> 31) | (2 * (sdram->emc_pmacro_perbit_fgcg_ctrl5 << 30 >> 31) | (sdram->emc_pmacro_perbit_fgcg_ctrl5 & 1 | 2 * (pmc->scratch176 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF;
|
||||||
pmc->scratch176 = (32 * sdram->emc_pmacro_tx_sel_clk_src2 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src2 << 6 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 7 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 8 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 9 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 10 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 11 >> 31 << 25) | tmp & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch176 = (32 * sdram->emc_pmacro_tx_sel_clk_src2 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src2 << 6 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 7 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 8 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 9 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 10 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src2 << 11 >> 31 << 25) | tmp & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch177 = (sdram->emc_pmacro_tx_sel_clk_src4 << 22 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src4 << 23 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 24 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 25 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 26 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 27 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 28 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 29 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 30 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 22) & 0x7FFFFF | ((sdram->mc_emem_arb_cfg >> 28 << 18) | ((16 * sdram->mc_emem_arb_cfg >> 28 << 14) | ((sdram->mc_emem_arb_cfg << 11 >> 27 << 9) | (sdram->mc_emem_arb_cfg & 0x1FF | (pmc->scratch177 >> 9 << 9)) & 0xFFFFC1FF) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch177 = (sdram->emc_pmacro_tx_sel_clk_src4 << 22 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src4 << 23 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 24 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 25 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 26 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 27 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 28 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 29 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 30 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 22) & 0x7FFFFF | ((sdram->mc_emem_arb_cfg >> 28 << 18) | ((16 * sdram->mc_emem_arb_cfg >> 28 << 14) | ((sdram->mc_emem_arb_cfg << 11 >> 27 << 9) | (sdram->mc_emem_arb_cfg & 0x1FF | (pmc->scratch177 >> 9 << 9)) & 0xFFFFC1FF) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch178 = (sdram->emc_pmacro_tx_sel_clk_src4 << 7 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src4 << 8 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 9 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 10 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 11 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 12 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 13 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 14 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 15 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 21 >> 31 << 22) | ((sdram->mc_emem_arb_misc1 >> 28 << 18) | ((sdram->mc_emem_arb_misc1 << 6 >> 30 << 16) | ((sdram->mc_emem_arb_misc1 << 8 >> 29 << 13) | (16 * (sdram->mc_emem_arb_misc1 << 19 >> 23) | (8 * (sdram->mc_emem_arb_misc1 << 28 >> 31) | (4 * (sdram->mc_emem_arb_misc1 << 29 >> 31) | (2 * (sdram->mc_emem_arb_misc1 << 30 >> 31) | (sdram->mc_emem_arb_misc1 & 1 | 2 * (pmc->scratch178 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFE00F) & 0xFFFF1FFF) & 0xFFFCFFFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch178 = (sdram->emc_pmacro_tx_sel_clk_src4 << 7 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src4 << 8 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 9 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 10 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 11 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 12 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 13 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 14 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 15 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src4 << 21 >> 31 << 22) | ((sdram->mc_emem_arb_misc1 >> 28 << 18) | ((sdram->mc_emem_arb_misc1 << 6 >> 30 << 16) | ((sdram->mc_emem_arb_misc1 << 8 >> 29 << 13) | (16 * (sdram->mc_emem_arb_misc1 << 19 >> 23) | (8 * (sdram->mc_emem_arb_misc1 << 28 >> 31) | (4 * (sdram->mc_emem_arb_misc1 << 29 >> 31) | (2 * (sdram->mc_emem_arb_misc1 << 30 >> 31) | (sdram->mc_emem_arb_misc1 & 1 | 2 * (pmc->scratch178 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFE00F) & 0xFFFF1FFF) & 0xFFFCFFFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch179 = (sdram->emc_odt_write >> 31 << 31) | (2 * ((sdram->emc_odt_write << 20 >> 28 << 27) | ((sdram->emc_odt_write << 26 >> 31 << 26) | ((sdram->emc_odt_write << 27 >> 31 << 25) | ((sdram->emc_odt_write << 21) & 0x1FFFFFF | ((32 * sdram->emc_mrs_wait_cnt2 >> 21 << 10) | (sdram->emc_mrs_wait_cnt2 & 0x3FF | (pmc->scratch179 >> 10 << 10)) & 0xFFE003FF) & 0xFE1FFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0x87FFFFFF) >> 1);
|
// pmc->scratch179 = (sdram->emc_odt_write >> 31 << 31) | (2 * ((sdram->emc_odt_write << 20 >> 28 << 27) | ((sdram->emc_odt_write << 26 >> 31 << 26) | ((sdram->emc_odt_write << 27 >> 31 << 25) | ((sdram->emc_odt_write << 21) & 0x1FFFFFF | ((32 * sdram->emc_mrs_wait_cnt2 >> 21 << 10) | (sdram->emc_mrs_wait_cnt2 & 0x3FF | (pmc->scratch179 >> 10 << 10)) & 0xFFE003FF) & 0xFE1FFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0x87FFFFFF) >> 1);
|
||||||
pmc->scratch180 = (sdram->emc_pmacro_ib_rxrt << 21) | ((32 * sdram->emc_mrs_wait_cnt >> 21 << 10) | (sdram->emc_mrs_wait_cnt & 0x3FF | (pmc->scratch180 >> 10 << 10)) & 0xFFE003FF) & 0x1FFFFF;
|
// pmc->scratch180 = (sdram->emc_pmacro_ib_rxrt << 21) | ((32 * sdram->emc_mrs_wait_cnt >> 21 << 10) | (sdram->emc_mrs_wait_cnt & 0x3FF | (pmc->scratch180 >> 10 << 10)) & 0xFFE003FF) & 0x1FFFFF;
|
||||||
pmc->scratch181 = ((u16)(sdram->emc_pmacro_ddll_long_cmd_4) << 21) | sdram->emc_auto_cal_interval & 0x1FFFFF;
|
// pmc->scratch181 = ((u16)(sdram->emc_pmacro_ddll_long_cmd_4) << 21) | sdram->emc_auto_cal_interval & 0x1FFFFF;
|
||||||
pmc->scratch182 = (sdram->mc_emem_arb_outstanding_req >> 31 << 31) | (2 * ((2 * sdram->mc_emem_arb_outstanding_req >> 31 << 30) | ((sdram->mc_emem_arb_outstanding_req << 23 >> 2) | ((sdram->emc_emem_arb_refpb_hp_ctrl << 9 >> 25 << 14) | ((sdram->emc_emem_arb_refpb_hp_ctrl << 17 >> 25 << 7) | (sdram->emc_emem_arb_refpb_hp_ctrl & 0x7F | (pmc->scratch182 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xC01FFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch182 = (sdram->mc_emem_arb_outstanding_req >> 31 << 31) | (2 * ((2 * sdram->mc_emem_arb_outstanding_req >> 31 << 30) | ((sdram->mc_emem_arb_outstanding_req << 23 >> 2) | ((sdram->emc_emem_arb_refpb_hp_ctrl << 9 >> 25 << 14) | ((sdram->emc_emem_arb_refpb_hp_ctrl << 17 >> 25 << 7) | (sdram->emc_emem_arb_refpb_hp_ctrl & 0x7F | (pmc->scratch182 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xC01FFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch183 = (4 * sdram->emc_pmacro_cmd_ctrl0 >> 31 << 31) | (2 * ((8 * sdram->emc_pmacro_cmd_ctrl0 >> 31 << 30) | ((sdram->emc_pmacro_cmd_ctrl0 << 7 >> 31 << 29) | ((sdram->emc_pmacro_cmd_ctrl0 << 10 >> 31 << 28) | ((sdram->emc_pmacro_cmd_ctrl0 << 11 >> 31 << 27) | ((sdram->emc_pmacro_cmd_ctrl0 << 15 >> 31 << 26) | ((sdram->emc_pmacro_cmd_ctrl0 << 18 >> 31 << 25) | ((sdram->emc_pmacro_cmd_ctrl0 << 19 >> 31 << 24) | ((sdram->emc_pmacro_cmd_ctrl0 << 23 >> 31 << 23) | ((sdram->emc_pmacro_cmd_ctrl0 << 26 >> 31 << 22) | ((sdram->emc_pmacro_cmd_ctrl0 << 27 >> 31 << 21) | ((sdram->emc_pmacro_cmd_ctrl0 << 20) & 0x1FFFFF | ((4 * sdram->emc_xm2_comp_pad_ctrl2 >> 26 << 14) | ((sdram->emc_xm2_comp_pad_ctrl2 << 10 >> 30 << 12) | ((sdram->emc_xm2_comp_pad_ctrl2 << 14 >> 31 << 11) | ((sdram->emc_xm2_comp_pad_ctrl2 << 15 >> 31 << 10) | ((sdram->emc_xm2_comp_pad_ctrl2 << 16 >> 30 << 8) | ((sdram->emc_xm2_comp_pad_ctrl2 << 18 >> 30 << 6) | (4 * (sdram->emc_xm2_comp_pad_ctrl2 << 26 >> 28) | (sdram->emc_xm2_comp_pad_ctrl2 & 3 | 4 * (pmc->scratch183 >> 2)) & 0xFFFFFFC3) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFCFFF) & 0xFFF03FFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch183 = (4 * sdram->emc_pmacro_cmd_ctrl0 >> 31 << 31) | (2 * ((8 * sdram->emc_pmacro_cmd_ctrl0 >> 31 << 30) | ((sdram->emc_pmacro_cmd_ctrl0 << 7 >> 31 << 29) | ((sdram->emc_pmacro_cmd_ctrl0 << 10 >> 31 << 28) | ((sdram->emc_pmacro_cmd_ctrl0 << 11 >> 31 << 27) | ((sdram->emc_pmacro_cmd_ctrl0 << 15 >> 31 << 26) | ((sdram->emc_pmacro_cmd_ctrl0 << 18 >> 31 << 25) | ((sdram->emc_pmacro_cmd_ctrl0 << 19 >> 31 << 24) | ((sdram->emc_pmacro_cmd_ctrl0 << 23 >> 31 << 23) | ((sdram->emc_pmacro_cmd_ctrl0 << 26 >> 31 << 22) | ((sdram->emc_pmacro_cmd_ctrl0 << 27 >> 31 << 21) | ((sdram->emc_pmacro_cmd_ctrl0 << 20) & 0x1FFFFF | ((4 * sdram->emc_xm2_comp_pad_ctrl2 >> 26 << 14) | ((sdram->emc_xm2_comp_pad_ctrl2 << 10 >> 30 << 12) | ((sdram->emc_xm2_comp_pad_ctrl2 << 14 >> 31 << 11) | ((sdram->emc_xm2_comp_pad_ctrl2 << 15 >> 31 << 10) | ((sdram->emc_xm2_comp_pad_ctrl2 << 16 >> 30 << 8) | ((sdram->emc_xm2_comp_pad_ctrl2 << 18 >> 30 << 6) | (4 * (sdram->emc_xm2_comp_pad_ctrl2 << 26 >> 28) | (sdram->emc_xm2_comp_pad_ctrl2 & 3 | 4 * (pmc->scratch183 >> 2)) & 0xFFFFFFC3) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFCFFF) & 0xFFF03FFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch184 = (4 * sdram->emc_pmacro_cmd_ctrl1 >> 31 << 31) | (2 * ((8 * sdram->emc_pmacro_cmd_ctrl1 >> 31 << 30) | ((sdram->emc_pmacro_cmd_ctrl1 << 7 >> 31 << 29) | ((sdram->emc_pmacro_cmd_ctrl1 << 10 >> 31 << 28) | ((sdram->emc_pmacro_cmd_ctrl1 << 11 >> 31 << 27) | ((sdram->emc_pmacro_cmd_ctrl1 << 15 >> 31 << 26) | ((sdram->emc_pmacro_cmd_ctrl1 << 18 >> 31 << 25) | ((sdram->emc_pmacro_cmd_ctrl1 << 19 >> 31 << 24) | ((sdram->emc_pmacro_cmd_ctrl1 << 23 >> 31 << 23) | ((sdram->emc_pmacro_cmd_ctrl1 << 26 >> 31 << 22) | ((sdram->emc_pmacro_cmd_ctrl1 << 27 >> 31 << 21) | ((sdram->emc_pmacro_cmd_ctrl1 << 20) & 0x1FFFFF | ((sdram->emc_cfg_dig_dll_1 << 12 >> 28 << 16) | ((sdram->emc_cfg_dig_dll_1 << 16 >> 28 << 12) | ((sdram->emc_cfg_dig_dll_1 << 20 >> 26 << 6) | (2 * (sdram->emc_cfg_dig_dll_1 << 26 >> 27) | (sdram->emc_cfg_dig_dll_1 & 1 | 2 * (pmc->scratch184 >> 1)) & 0xFFFFFFC1) & 0xFFFFF03F) & 0xFFFF0FFF) & 0xFFF0FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch184 = (4 * sdram->emc_pmacro_cmd_ctrl1 >> 31 << 31) | (2 * ((8 * sdram->emc_pmacro_cmd_ctrl1 >> 31 << 30) | ((sdram->emc_pmacro_cmd_ctrl1 << 7 >> 31 << 29) | ((sdram->emc_pmacro_cmd_ctrl1 << 10 >> 31 << 28) | ((sdram->emc_pmacro_cmd_ctrl1 << 11 >> 31 << 27) | ((sdram->emc_pmacro_cmd_ctrl1 << 15 >> 31 << 26) | ((sdram->emc_pmacro_cmd_ctrl1 << 18 >> 31 << 25) | ((sdram->emc_pmacro_cmd_ctrl1 << 19 >> 31 << 24) | ((sdram->emc_pmacro_cmd_ctrl1 << 23 >> 31 << 23) | ((sdram->emc_pmacro_cmd_ctrl1 << 26 >> 31 << 22) | ((sdram->emc_pmacro_cmd_ctrl1 << 27 >> 31 << 21) | ((sdram->emc_pmacro_cmd_ctrl1 << 20) & 0x1FFFFF | ((sdram->emc_cfg_dig_dll_1 << 12 >> 28 << 16) | ((sdram->emc_cfg_dig_dll_1 << 16 >> 28 << 12) | ((sdram->emc_cfg_dig_dll_1 << 20 >> 26 << 6) | (2 * (sdram->emc_cfg_dig_dll_1 << 26 >> 27) | (sdram->emc_cfg_dig_dll_1 & 1 | 2 * (pmc->scratch184 >> 1)) & 0xFFFFFFC1) & 0xFFFFF03F) & 0xFFFF0FFF) & 0xFFF0FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch185 = (4 * sdram->emc_pmacro_cmd_ctrl2 >> 31 << 31) | (2 * ((8 * sdram->emc_pmacro_cmd_ctrl2 >> 31 << 30) | ((sdram->emc_pmacro_cmd_ctrl2 << 7 >> 31 << 29) | ((sdram->emc_pmacro_cmd_ctrl2 << 10 >> 31 << 28) | ((sdram->emc_pmacro_cmd_ctrl2 << 11 >> 31 << 27) | ((sdram->emc_pmacro_cmd_ctrl2 << 15 >> 31 << 26) | ((sdram->emc_pmacro_cmd_ctrl2 << 18 >> 31 << 25) | ((sdram->emc_pmacro_cmd_ctrl2 << 19 >> 31 << 24) | ((sdram->emc_pmacro_cmd_ctrl2 << 23 >> 31 << 23) | ((sdram->emc_pmacro_cmd_ctrl2 << 26 >> 31 << 22) | ((sdram->emc_pmacro_cmd_ctrl2 << 27 >> 31 << 21) | ((sdram->emc_pmacro_cmd_ctrl2 << 20) & 0x1FFFFF | ((sdram->emc_quse_brlshft0 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft0 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft0 << 22 >> 27) | (sdram->emc_quse_brlshft0 & 0x1F | 32 * (pmc->scratch185 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch185 = (4 * sdram->emc_pmacro_cmd_ctrl2 >> 31 << 31) | (2 * ((8 * sdram->emc_pmacro_cmd_ctrl2 >> 31 << 30) | ((sdram->emc_pmacro_cmd_ctrl2 << 7 >> 31 << 29) | ((sdram->emc_pmacro_cmd_ctrl2 << 10 >> 31 << 28) | ((sdram->emc_pmacro_cmd_ctrl2 << 11 >> 31 << 27) | ((sdram->emc_pmacro_cmd_ctrl2 << 15 >> 31 << 26) | ((sdram->emc_pmacro_cmd_ctrl2 << 18 >> 31 << 25) | ((sdram->emc_pmacro_cmd_ctrl2 << 19 >> 31 << 24) | ((sdram->emc_pmacro_cmd_ctrl2 << 23 >> 31 << 23) | ((sdram->emc_pmacro_cmd_ctrl2 << 26 >> 31 << 22) | ((sdram->emc_pmacro_cmd_ctrl2 << 27 >> 31 << 21) | ((sdram->emc_pmacro_cmd_ctrl2 << 20) & 0x1FFFFF | ((sdram->emc_quse_brlshft0 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft0 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft0 << 22 >> 27) | (sdram->emc_quse_brlshft0 & 0x1F | 32 * (pmc->scratch185 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch186 = (sdram->emc_pmacro_dsr_vttgen_ctrl0 >> 8 << 24) | ((sdram->emc_pmacro_dsr_vttgen_ctrl0 << 20) | ((sdram->emc_quse_brlshft1 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft1 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft1 << 22 >> 27) | (sdram->emc_quse_brlshft1 & 0x1F | 32 * (pmc->scratch186 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFF0FFFFF) & 0xFFFFFF;
|
// pmc->scratch186 = (sdram->emc_pmacro_dsr_vttgen_ctrl0 >> 8 << 24) | ((sdram->emc_pmacro_dsr_vttgen_ctrl0 << 20) | ((sdram->emc_quse_brlshft1 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft1 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft1 << 22 >> 27) | (sdram->emc_quse_brlshft1 & 0x1F | 32 * (pmc->scratch186 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFF0FFFFF) & 0xFFFFFF;
|
||||||
pmc->scratch187 = (sdram->emc_pmacro_perbit_rfu1_ctrl0 << 10 >> 30 << 30) | (4 * ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 12 >> 30 << 28) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 14 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 26 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 28 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 20) & 0x3FFFFF | ((sdram->emc_quse_brlshft2 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft2 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft2 << 22 >> 27) | (sdram->emc_quse_brlshft2 & 0x1F | 32 * (pmc->scratch187 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch187 = (sdram->emc_pmacro_perbit_rfu1_ctrl0 << 10 >> 30 << 30) | (4 * ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 12 >> 30 << 28) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 14 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 26 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 28 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl0 << 20) & 0x3FFFFF | ((sdram->emc_quse_brlshft2 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft2 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft2 << 22 >> 27) | (sdram->emc_quse_brlshft2 & 0x1F | 32 * (pmc->scratch187 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch188 = (sdram->emc_pmacro_perbit_rfu1_ctrl1 << 10 >> 30 << 30) | (4 * ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 12 >> 30 << 28) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 14 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 26 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 28 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 20) & 0x3FFFFF | ((sdram->emc_quse_brlshft3 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft3 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft3 << 22 >> 27) | (sdram->emc_quse_brlshft3 & 0x1F | 32 * (pmc->scratch188 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->scratch188 = (sdram->emc_pmacro_perbit_rfu1_ctrl1 << 10 >> 30 << 30) | (4 * ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 12 >> 30 << 28) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 14 >> 30 << 26) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 26 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 28 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl1 << 20) & 0x3FFFFF | ((sdram->emc_quse_brlshft3 << 12 >> 27 << 15) | ((sdram->emc_quse_brlshft3 << 17 >> 27 << 10) | (32 * (sdram->emc_quse_brlshft3 << 22 >> 27) | (sdram->emc_quse_brlshft3 & 0x1F | 32 * (pmc->scratch188 >> 5)) & 0xFFFFFC1F) & 0xFFFF83FF) & 0xFFF07FFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->scratch189 = (sdram->emc_trefbw << 18) | ((sdram->emc_dbg >> 31 << 17) | ((2 * sdram->emc_dbg >> 31 << 16) | ((4 * sdram->emc_dbg >> 31 << 15) | ((8 * sdram->emc_dbg >> 31 << 14) | ((16 * sdram->emc_dbg >> 30 << 12) | ((sdram->emc_dbg << 6 >> 31 << 11) | ((sdram->emc_dbg << 7 >> 31 << 10) | ((sdram->emc_dbg << 18 >> 31 << 9) | ((sdram->emc_dbg << 19 >> 31 << 8) | ((sdram->emc_dbg << 20 >> 31 << 7) | ((sdram->emc_dbg << 21 >> 31 << 6) | (32 * (sdram->emc_dbg << 22 >> 31) | (16 * (sdram->emc_dbg << 27 >> 31) | (8 * (sdram->emc_dbg << 28 >> 31) | (4 * (sdram->emc_dbg << 29 >> 31) | (2 * (sdram->emc_dbg << 30 >> 31) | (sdram->emc_dbg & 1 | 2 * (pmc->scratch189 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFCFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0x3FFFF;
|
// pmc->scratch189 = (sdram->emc_trefbw << 18) | ((sdram->emc_dbg >> 31 << 17) | ((2 * sdram->emc_dbg >> 31 << 16) | ((4 * sdram->emc_dbg >> 31 << 15) | ((8 * sdram->emc_dbg >> 31 << 14) | ((16 * sdram->emc_dbg >> 30 << 12) | ((sdram->emc_dbg << 6 >> 31 << 11) | ((sdram->emc_dbg << 7 >> 31 << 10) | ((sdram->emc_dbg << 18 >> 31 << 9) | ((sdram->emc_dbg << 19 >> 31 << 8) | ((sdram->emc_dbg << 20 >> 31 << 7) | ((sdram->emc_dbg << 21 >> 31 << 6) | (32 * (sdram->emc_dbg << 22 >> 31) | (16 * (sdram->emc_dbg << 27 >> 31) | (8 * (sdram->emc_dbg << 28 >> 31) | (4 * (sdram->emc_dbg << 29 >> 31) | (2 * (sdram->emc_dbg << 30 >> 31) | (sdram->emc_dbg & 1 | 2 * (pmc->scratch189 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFCFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0x3FFFF;
|
||||||
pmc->scratch191 = (sdram->emc_qpop << 9 >> 25 << 25) | ((sdram->emc_qpop << 18) | ((sdram->emc_zcal_wait_cnt >> 31 << 17) | ((sdram->emc_zcal_wait_cnt << 10 >> 26 << 11) | (sdram->emc_zcal_wait_cnt & 0x7FF | (pmc->scratch191 >> 11 << 11)) & 0xFFFE07FF) & 0xFFFDFFFF) & 0xFE03FFFF) & 0x1FFFFFF;
|
// pmc->scratch191 = (sdram->emc_qpop << 9 >> 25 << 25) | ((sdram->emc_qpop << 18) | ((sdram->emc_zcal_wait_cnt >> 31 << 17) | ((sdram->emc_zcal_wait_cnt << 10 >> 26 << 11) | (sdram->emc_zcal_wait_cnt & 0x7FF | (pmc->scratch191 >> 11 << 11)) & 0xFFFE07FF) & 0xFFFDFFFF) & 0xFE03FFFF) & 0x1FFFFFF;
|
||||||
pmc->scratch192 = (sdram->emc_pmacro_tx_sel_clk_src4 << 6 >> 31 << 31) | (2 * ((sdram->emc_pmacro_auto_cal_common << 15 >> 31 << 30) | ((sdram->emc_pmacro_auto_cal_common << 18 >> 26 << 24) | ((sdram->emc_pmacro_auto_cal_common << 18) & 0xFFFFFF | ((sdram->emc_zcal_mrw_cmd >> 30 << 16) | ((sdram->emc_zcal_mrw_cmd << 8 >> 24 << 8) | (sdram->emc_zcal_mrw_cmd & 0xFF | (pmc->scratch192 >> 8 << 8)) & 0xFFFF00FF) & 0xFFFCFFFF) & 0xFF03FFFF) & 0xC0FFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch192 = (sdram->emc_pmacro_tx_sel_clk_src4 << 6 >> 31 << 31) | (2 * ((sdram->emc_pmacro_auto_cal_common << 15 >> 31 << 30) | ((sdram->emc_pmacro_auto_cal_common << 18 >> 26 << 24) | ((sdram->emc_pmacro_auto_cal_common << 18) & 0xFFFFFF | ((sdram->emc_zcal_mrw_cmd >> 30 << 16) | ((sdram->emc_zcal_mrw_cmd << 8 >> 24 << 8) | (sdram->emc_zcal_mrw_cmd & 0xFF | (pmc->scratch192 >> 8 << 8)) & 0xFFFF00FF) & 0xFFFCFFFF) & 0xFF03FFFF) & 0xC0FFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
tmp = (sdram->emc_dll_cfg1 << 7 >> 31 << 17) | ((sdram->emc_dll_cfg1 << 10 >> 31 << 16) | ((sdram->emc_dll_cfg1 << 11 >> 31 << 15) | ((sdram->emc_dll_cfg1 << 14 >> 30 << 13) | ((sdram->emc_dll_cfg1 << 18 >> 31 << 12) | ((sdram->emc_dll_cfg1 << 19 >> 31 << 11) | ((pmc->scratch193 >> 11 << 11) | sdram->emc_dll_cfg1 & 0x7FF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFF9FFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF;
|
// tmp = (sdram->emc_dll_cfg1 << 7 >> 31 << 17) | ((sdram->emc_dll_cfg1 << 10 >> 31 << 16) | ((sdram->emc_dll_cfg1 << 11 >> 31 << 15) | ((sdram->emc_dll_cfg1 << 14 >> 30 << 13) | ((sdram->emc_dll_cfg1 << 18 >> 31 << 12) | ((sdram->emc_dll_cfg1 << 19 >> 31 << 11) | ((pmc->scratch193 >> 11 << 11) | sdram->emc_dll_cfg1 & 0x7FF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFF9FFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF;
|
||||||
pmc->scratch193 = (sdram->emc_pmacro_tx_sel_clk_src5 << 31) | (2 * ((32 * sdram->emc_pmacro_tx_sel_clk_src4 >> 31 << 30) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 10 >> 30 << 28) | (((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 14 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 26 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 28 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 18) & 0xFFFFF | tmp & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl2 << 12 >> 30 << 26)) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch193 = (sdram->emc_pmacro_tx_sel_clk_src5 << 31) | (2 * ((32 * sdram->emc_pmacro_tx_sel_clk_src4 >> 31 << 30) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 10 >> 30 << 28) | (((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 14 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 26 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 28 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu1_ctrl2 << 18) & 0xFFFFF | tmp & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl2 << 12 >> 30 << 26)) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch194 = (sdram->emc_pmacro_tx_sel_clk_src5 << 29 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src5 << 30 >> 31 << 30) | ((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 10 >> 30 << 28) | (((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 14 >> 30 << 24) | (((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 28 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 18) & 0xFFFFF | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 14 >> 30 << 16) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 16 >> 30 << 14) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 18 >> 30 << 12) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 20 >> 30 << 10) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 22 >> 30 << 8) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 26 >> 30) | (4 * (sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 28 >> 30) | (sdram->emc_pmacro_cmd_brick_ctrl_fdpd & 3 | 4 * (pmc->scratch194 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl3 << 26 >> 30 << 22)) & 0xFCFFFFFF) & 0xF3FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl3 << 12 >> 30 << 26)) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch194 = (sdram->emc_pmacro_tx_sel_clk_src5 << 29 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src5 << 30 >> 31 << 30) | ((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 10 >> 30 << 28) | (((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 14 >> 30 << 24) | (((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 28 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu1_ctrl3 << 18) & 0xFFFFF | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 14 >> 30 << 16) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 16 >> 30 << 14) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 18 >> 30 << 12) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 20 >> 30 << 10) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 22 >> 30 << 8) | ((sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 26 >> 30) | (4 * (sdram->emc_pmacro_cmd_brick_ctrl_fdpd << 28 >> 30) | (sdram->emc_pmacro_cmd_brick_ctrl_fdpd & 3 | 4 * (pmc->scratch194 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl3 << 26 >> 30 << 22)) & 0xFCFFFFFF) & 0xF3FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl3 << 12 >> 30 << 26)) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch195 = (sdram->emc_pmacro_tx_sel_clk_src5 << 27 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src5 << 28 >> 31 << 30) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 10 >> 30 << 28) | (((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 14 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 26 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 28 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 18) & 0xFFFFF | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 14 >> 30 << 16) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 16 >> 30 << 14) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 18 >> 30 << 12) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 20 >> 30 << 10) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 22 >> 30 << 8) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_data_brick_ctrl_fdpd << 26 >> 30) | (4 * (sdram->emc_pmacro_data_brick_ctrl_fdpd << 28 >> 30) | (sdram->emc_pmacro_data_brick_ctrl_fdpd & 3 | 4 * (pmc->scratch195 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl4 << 12 >> 30 << 26)) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch195 = (sdram->emc_pmacro_tx_sel_clk_src5 << 27 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src5 << 28 >> 31 << 30) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 10 >> 30 << 28) | (((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 14 >> 30 << 24) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 26 >> 30 << 22) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 28 >> 30 << 20) | ((sdram->emc_pmacro_perbit_rfu1_ctrl4 << 18) & 0xFFFFF | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 14 >> 30 << 16) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 16 >> 30 << 14) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 18 >> 30 << 12) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 20 >> 30 << 10) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 22 >> 30 << 8) | ((sdram->emc_pmacro_data_brick_ctrl_fdpd << 24 >> 30 << 6) | (16 * (sdram->emc_pmacro_data_brick_ctrl_fdpd << 26 >> 30) | (4 * (sdram->emc_pmacro_data_brick_ctrl_fdpd << 28 >> 30) | (sdram->emc_pmacro_data_brick_ctrl_fdpd & 3 | 4 * (pmc->scratch195 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFCF) & 0xFFFFFF3F) & 0xFFFFFCFF) & 0xFFFFF3FF) & 0xFFFFCFFF) & 0xFFFF3FFF) & 0xFFFCFFFF) & 0xFFF3FFFF) & 0xFFCFFFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xF3FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl4 << 12 >> 30 << 26)) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch196 = (sdram->emc_emem_arb_refpb_bank_ctrl >> 31 << 31) | (2 * ((sdram->emc_emem_arb_refpb_bank_ctrl << 17 >> 25 << 24) | ((sdram->emc_emem_arb_refpb_bank_ctrl << 17) & 0xFFFFFF | ((sdram->emc_dyn_self_ref_control >> 31 << 16) | (sdram->emc_dyn_self_ref_control & 0xFFFF | (pmc->scratch196 >> 16 << 16)) & 0xFFFEFFFF) & 0xFF01FFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch196 = (sdram->emc_emem_arb_refpb_bank_ctrl >> 31 << 31) | (2 * ((sdram->emc_emem_arb_refpb_bank_ctrl << 17 >> 25 << 24) | ((sdram->emc_emem_arb_refpb_bank_ctrl << 17) & 0xFFFFFF | ((sdram->emc_dyn_self_ref_control >> 31 << 16) | (sdram->emc_dyn_self_ref_control & 0xFFFF | (pmc->scratch196 >> 16 << 16)) & 0xFFFEFFFF) & 0xFF01FFFF) & 0x80FFFFFF) >> 1);
|
||||||
pmc->scratch197 = (sdram->emc_pmacro_tx_sel_clk_src5 << 24 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src5 << 25 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 26 >> 31 << 29) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 10 >> 30 << 27) | (((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 14 >> 30 << 23) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 26 >> 30 << 21) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 28 >> 30 << 19) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 17) & 0x7FFFF | ((16 * sdram->emc_pmacro_cmd_pad_rx_ctrl >> 28 << 13) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 8 >> 31 << 12) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 9 >> 31 << 11) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 10 >> 31 << 10) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 12 >> 28 << 6) | (32 * (sdram->emc_pmacro_cmd_pad_rx_ctrl << 16 >> 31) | (16 * (sdram->emc_pmacro_cmd_pad_rx_ctrl << 19 >> 31) | (4 * (sdram->emc_pmacro_cmd_pad_rx_ctrl << 26 >> 30) | (sdram->emc_pmacro_cmd_pad_rx_ctrl & 3 | 4 * (pmc->scratch197 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFC3F) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFE1FFF) & 0xFFF9FFFF) & 0xFFE7FFFF) & 0xFF9FFFFF) & 0xFE7FFFFF) & 0xF9FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl5 << 12 >> 30 << 25)) & 0xE7FFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch197 = (sdram->emc_pmacro_tx_sel_clk_src5 << 24 >> 31 << 31) | (2 * ((sdram->emc_pmacro_tx_sel_clk_src5 << 25 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 26 >> 31 << 29) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 10 >> 30 << 27) | (((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 14 >> 30 << 23) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 26 >> 30 << 21) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 28 >> 30 << 19) | ((sdram->emc_pmacro_perbit_rfu1_ctrl5 << 17) & 0x7FFFF | ((16 * sdram->emc_pmacro_cmd_pad_rx_ctrl >> 28 << 13) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 8 >> 31 << 12) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 9 >> 31 << 11) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 10 >> 31 << 10) | ((sdram->emc_pmacro_cmd_pad_rx_ctrl << 12 >> 28 << 6) | (32 * (sdram->emc_pmacro_cmd_pad_rx_ctrl << 16 >> 31) | (16 * (sdram->emc_pmacro_cmd_pad_rx_ctrl << 19 >> 31) | (4 * (sdram->emc_pmacro_cmd_pad_rx_ctrl << 26 >> 30) | (sdram->emc_pmacro_cmd_pad_rx_ctrl & 3 | 4 * (pmc->scratch197 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFC3F) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFE1FFF) & 0xFFF9FFFF) & 0xFFE7FFFF) & 0xFF9FFFFF) & 0xFE7FFFFF) & 0xF9FFFFFF | (sdram->emc_pmacro_perbit_rfu1_ctrl5 << 12 >> 30 << 25)) & 0xE7FFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch198 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 31) | (2 * ((32 * sdram->emc_pmacro_tx_sel_clk_src5 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 6 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 7 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 8 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 9 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 10 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 11 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 12 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 13 >> 31 << 22) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 14 >> 31 << 21) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 15 >> 31 << 20) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 21 >> 31 << 19) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 22 >> 31 << 18) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 23 >> 31 << 17) | ((16 * sdram->emc_pmacro_data_pad_rx_ctrl >> 28 << 13) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 8 >> 31 << 12) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 9 >> 31 << 11) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 10 >> 31 << 10) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 12 >> 28 << 6) | (32 * (sdram->emc_pmacro_data_pad_rx_ctrl << 16 >> 31) | (16 * (sdram->emc_pmacro_data_pad_rx_ctrl << 19 >> 31) | (4 * (sdram->emc_pmacro_data_pad_rx_ctrl << 26 >> 30) | (sdram->emc_pmacro_data_pad_rx_ctrl & 3 | 4 * (pmc->scratch198 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFC3F) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFE1FFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch198 = (sdram->emc_pmacro_cmd_pad_tx_ctrl << 31) | (2 * ((32 * sdram->emc_pmacro_tx_sel_clk_src5 >> 31 << 30) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 6 >> 31 << 29) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 7 >> 31 << 28) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 8 >> 31 << 27) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 9 >> 31 << 26) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 10 >> 31 << 25) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 11 >> 31 << 24) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 12 >> 31 << 23) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 13 >> 31 << 22) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 14 >> 31 << 21) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 15 >> 31 << 20) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 21 >> 31 << 19) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 22 >> 31 << 18) | ((sdram->emc_pmacro_tx_sel_clk_src5 << 23 >> 31 << 17) | ((16 * sdram->emc_pmacro_data_pad_rx_ctrl >> 28 << 13) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 8 >> 31 << 12) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 9 >> 31 << 11) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 10 >> 31 << 10) | ((sdram->emc_pmacro_data_pad_rx_ctrl << 12 >> 28 << 6) | (32 * (sdram->emc_pmacro_data_pad_rx_ctrl << 16 >> 31) | (16 * (sdram->emc_pmacro_data_pad_rx_ctrl << 19 >> 31) | (4 * (sdram->emc_pmacro_data_pad_rx_ctrl << 26 >> 30) | (sdram->emc_pmacro_data_pad_rx_ctrl & 3 | 4 * (pmc->scratch198 >> 2)) & 0xFFFFFFF3) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFC3F) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFE1FFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch199 = (8 * sdram->emc_cmd_q >> 27 << 27) | ((sdram->emc_cmd_q << 17 >> 29 << 24) | ((sdram->emc_cmd_q << 21 >> 29 << 21) | ((sdram->emc_cmd_q << 16) & 0x1FFFFF | (((u16)(sdram->emc_refresh) << 16 >> 22 << 6) | (sdram->emc_refresh & 0x3F | (pmc->scratch199 >> 6 << 6)) & 0xFFFF003F) & 0xFFE0FFFF) & 0xFF1FFFFF) & 0xF8FFFFFF) & 0x7FFFFFF;
|
// pmc->scratch199 = (8 * sdram->emc_cmd_q >> 27 << 27) | ((sdram->emc_cmd_q << 17 >> 29 << 24) | ((sdram->emc_cmd_q << 21 >> 29 << 21) | ((sdram->emc_cmd_q << 16) & 0x1FFFFF | (((u16)(sdram->emc_refresh) << 16 >> 22 << 6) | (sdram->emc_refresh & 0x3F | (pmc->scratch199 >> 6 << 6)) & 0xFFFF003F) & 0xFFE0FFFF) & 0xFF1FFFFF) & 0xF8FFFFFF) & 0x7FFFFFF;
|
||||||
pmc->scratch210 = (sdram->emc_auto_cal_vref_sel1 << 16 >> 31 << 31) | (2 * ((sdram->emc_auto_cal_vref_sel1 << 17 >> 25 << 24) | ((sdram->emc_auto_cal_vref_sel1 << 24 >> 31 << 23) | ((sdram->emc_auto_cal_vref_sel1 << 16) & 0x7FFFFF | (sdram->emc_acpd_control & 0xFFFF | (pmc->scratch210 >> 16 << 16)) & 0xFF80FFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
// pmc->scratch210 = (sdram->emc_auto_cal_vref_sel1 << 16 >> 31 << 31) | (2 * ((sdram->emc_auto_cal_vref_sel1 << 17 >> 25 << 24) | ((sdram->emc_auto_cal_vref_sel1 << 24 >> 31 << 23) | ((sdram->emc_auto_cal_vref_sel1 << 16) & 0x7FFFFF | (sdram->emc_acpd_control & 0xFFFF | (pmc->scratch210 >> 16 << 16)) & 0xFF80FFFF) & 0xFF7FFFFF) & 0x80FFFFFF) >> 1);
|
||||||
tmp = 8 * (sdram->emc_pmacro_auto_cal_cfg0 << 28 >> 31) | (4 * (sdram->emc_pmacro_auto_cal_cfg0 << 29 >> 31) | (2 * (sdram->emc_pmacro_auto_cal_cfg0 << 30 >> 31) | (sdram->emc_pmacro_auto_cal_cfg0 & 1 | 2 * (pmc->scratch211 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7;
|
// tmp = 8 * (sdram->emc_pmacro_auto_cal_cfg0 << 28 >> 31) | (4 * (sdram->emc_pmacro_auto_cal_cfg0 << 29 >> 31) | (2 * (sdram->emc_pmacro_auto_cal_cfg0 << 30 >> 31) | (sdram->emc_pmacro_auto_cal_cfg0 & 1 | 2 * (pmc->scratch211 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7;
|
||||||
tmp = (sdram->emc_pmacro_auto_cal_cfg1 << 7 >> 31 << 28) | ((sdram->emc_pmacro_auto_cal_cfg1 << 12 >> 31 << 27) | ((sdram->emc_pmacro_auto_cal_cfg1 << 13 >> 31 << 26) | ((sdram->emc_pmacro_auto_cal_cfg1 << 14 >> 31 << 25) | ((sdram->emc_pmacro_auto_cal_cfg1 << 15 >> 31 << 24) | ((sdram->emc_pmacro_auto_cal_cfg1 << 20 >> 31 << 23) | ((sdram->emc_pmacro_auto_cal_cfg1 << 21 >> 31 << 22) | ((sdram->emc_pmacro_auto_cal_cfg1 << 22 >> 31 << 21) | ((sdram->emc_pmacro_auto_cal_cfg1 << 23 >> 31 << 20) | ((sdram->emc_pmacro_auto_cal_cfg1 << 28 >> 31 << 19) | ((sdram->emc_pmacro_auto_cal_cfg1 << 29 >> 31 << 18) | ((sdram->emc_pmacro_auto_cal_cfg1 << 30 >> 31 << 17) | ((sdram->emc_pmacro_auto_cal_cfg1 << 16) & 0x1FFFF | ((16 * sdram->emc_pmacro_auto_cal_cfg0 >> 31 << 15) | ((32 * sdram->emc_pmacro_auto_cal_cfg0 >> 31 << 14) | ((sdram->emc_pmacro_auto_cal_cfg0 << 6 >> 31 << 13) | ((sdram->emc_pmacro_auto_cal_cfg0 << 7 >> 31 << 12) | ((sdram->emc_pmacro_auto_cal_cfg0 << 12 >> 31 << 11) | ((sdram->emc_pmacro_auto_cal_cfg0 << 13 >> 31 << 10) | ((sdram->emc_pmacro_auto_cal_cfg0 << 14 >> 31 << 9) | ((sdram->emc_pmacro_auto_cal_cfg0 << 15 >> 31 << 8) | ((sdram->emc_pmacro_auto_cal_cfg0 << 20 >> 31 << 7) | ((sdram->emc_pmacro_auto_cal_cfg0 << 21 >> 31 << 6) | (32 * (sdram->emc_pmacro_auto_cal_cfg0 << 22 >> 31) | (16 * (sdram->emc_pmacro_auto_cal_cfg0 << 23 >> 31) | tmp & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF;
|
// tmp = (sdram->emc_pmacro_auto_cal_cfg1 << 7 >> 31 << 28) | ((sdram->emc_pmacro_auto_cal_cfg1 << 12 >> 31 << 27) | ((sdram->emc_pmacro_auto_cal_cfg1 << 13 >> 31 << 26) | ((sdram->emc_pmacro_auto_cal_cfg1 << 14 >> 31 << 25) | ((sdram->emc_pmacro_auto_cal_cfg1 << 15 >> 31 << 24) | ((sdram->emc_pmacro_auto_cal_cfg1 << 20 >> 31 << 23) | ((sdram->emc_pmacro_auto_cal_cfg1 << 21 >> 31 << 22) | ((sdram->emc_pmacro_auto_cal_cfg1 << 22 >> 31 << 21) | ((sdram->emc_pmacro_auto_cal_cfg1 << 23 >> 31 << 20) | ((sdram->emc_pmacro_auto_cal_cfg1 << 28 >> 31 << 19) | ((sdram->emc_pmacro_auto_cal_cfg1 << 29 >> 31 << 18) | ((sdram->emc_pmacro_auto_cal_cfg1 << 30 >> 31 << 17) | ((sdram->emc_pmacro_auto_cal_cfg1 << 16) & 0x1FFFF | ((16 * sdram->emc_pmacro_auto_cal_cfg0 >> 31 << 15) | ((32 * sdram->emc_pmacro_auto_cal_cfg0 >> 31 << 14) | ((sdram->emc_pmacro_auto_cal_cfg0 << 6 >> 31 << 13) | ((sdram->emc_pmacro_auto_cal_cfg0 << 7 >> 31 << 12) | ((sdram->emc_pmacro_auto_cal_cfg0 << 12 >> 31 << 11) | ((sdram->emc_pmacro_auto_cal_cfg0 << 13 >> 31 << 10) | ((sdram->emc_pmacro_auto_cal_cfg0 << 14 >> 31 << 9) | ((sdram->emc_pmacro_auto_cal_cfg0 << 15 >> 31 << 8) | ((sdram->emc_pmacro_auto_cal_cfg0 << 20 >> 31 << 7) | ((sdram->emc_pmacro_auto_cal_cfg0 << 21 >> 31 << 6) | (32 * (sdram->emc_pmacro_auto_cal_cfg0 << 22 >> 31) | (16 * (sdram->emc_pmacro_auto_cal_cfg0 << 23 >> 31) | tmp & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF;
|
||||||
pmc->scratch211 = (16 * sdram->emc_pmacro_auto_cal_cfg1 >> 31 << 31) | (2 * ((32 * sdram->emc_pmacro_auto_cal_cfg1 >> 31 << 30) | ((sdram->emc_pmacro_auto_cal_cfg1 << 6 >> 31 << 29) | tmp & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->scratch211 = (16 * sdram->emc_pmacro_auto_cal_cfg1 >> 31 << 31) | (2 * ((32 * sdram->emc_pmacro_auto_cal_cfg1 >> 31 << 30) | ((sdram->emc_pmacro_auto_cal_cfg1 << 6 >> 31 << 29) | tmp & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->scratch212 = (sdram->emc_xm2_comp_pad_ctrl3 << 8 >> 28 << 28) | ((sdram->emc_xm2_comp_pad_ctrl3 << 14 >> 31 << 27) | ((sdram->emc_xm2_comp_pad_ctrl3 << 15 >> 31 << 26) | ((sdram->emc_xm2_comp_pad_ctrl3 << 16 >> 30 << 24) | ((sdram->emc_xm2_comp_pad_ctrl3 << 18 >> 30 << 22) | ((sdram->emc_xm2_comp_pad_ctrl3 << 26 >> 28 << 18) | ((sdram->emc_xm2_comp_pad_ctrl3 << 16) & 0x3FFFF | ((16 * sdram->emc_pmacro_auto_cal_cfg2 >> 31 << 15) | ((32 * sdram->emc_pmacro_auto_cal_cfg2 >> 31 << 14) | ((sdram->emc_pmacro_auto_cal_cfg2 << 6 >> 31 << 13) | ((sdram->emc_pmacro_auto_cal_cfg2 << 7 >> 31 << 12) | ((sdram->emc_pmacro_auto_cal_cfg2 << 12 >> 31 << 11) | ((sdram->emc_pmacro_auto_cal_cfg2 << 13 >> 31 << 10) | ((sdram->emc_pmacro_auto_cal_cfg2 << 14 >> 31 << 9) | ((sdram->emc_pmacro_auto_cal_cfg2 << 15 >> 31 << 8) | ((sdram->emc_pmacro_auto_cal_cfg2 << 20 >> 31 << 7) | ((sdram->emc_pmacro_auto_cal_cfg2 << 21 >> 31 << 6) | (32 * (sdram->emc_pmacro_auto_cal_cfg2 << 22 >> 31) | (16 * (sdram->emc_pmacro_auto_cal_cfg2 << 23 >> 31) | (8 * (sdram->emc_pmacro_auto_cal_cfg2 << 28 >> 31) | (4 * (sdram->emc_pmacro_auto_cal_cfg2 << 29 >> 31) | (2 * (sdram->emc_pmacro_auto_cal_cfg2 << 30 >> 31) | (sdram->emc_pmacro_auto_cal_cfg2 & 1 | 2 * (pmc->scratch212 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFCFFFF) & 0xFFC3FFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xFFFFFFF;
|
// pmc->scratch212 = (sdram->emc_xm2_comp_pad_ctrl3 << 8 >> 28 << 28) | ((sdram->emc_xm2_comp_pad_ctrl3 << 14 >> 31 << 27) | ((sdram->emc_xm2_comp_pad_ctrl3 << 15 >> 31 << 26) | ((sdram->emc_xm2_comp_pad_ctrl3 << 16 >> 30 << 24) | ((sdram->emc_xm2_comp_pad_ctrl3 << 18 >> 30 << 22) | ((sdram->emc_xm2_comp_pad_ctrl3 << 26 >> 28 << 18) | ((sdram->emc_xm2_comp_pad_ctrl3 << 16) & 0x3FFFF | ((16 * sdram->emc_pmacro_auto_cal_cfg2 >> 31 << 15) | ((32 * sdram->emc_pmacro_auto_cal_cfg2 >> 31 << 14) | ((sdram->emc_pmacro_auto_cal_cfg2 << 6 >> 31 << 13) | ((sdram->emc_pmacro_auto_cal_cfg2 << 7 >> 31 << 12) | ((sdram->emc_pmacro_auto_cal_cfg2 << 12 >> 31 << 11) | ((sdram->emc_pmacro_auto_cal_cfg2 << 13 >> 31 << 10) | ((sdram->emc_pmacro_auto_cal_cfg2 << 14 >> 31 << 9) | ((sdram->emc_pmacro_auto_cal_cfg2 << 15 >> 31 << 8) | ((sdram->emc_pmacro_auto_cal_cfg2 << 20 >> 31 << 7) | ((sdram->emc_pmacro_auto_cal_cfg2 << 21 >> 31 << 6) | (32 * (sdram->emc_pmacro_auto_cal_cfg2 << 22 >> 31) | (16 * (sdram->emc_pmacro_auto_cal_cfg2 << 23 >> 31) | (8 * (sdram->emc_pmacro_auto_cal_cfg2 << 28 >> 31) | (4 * (sdram->emc_pmacro_auto_cal_cfg2 << 29 >> 31) | (2 * (sdram->emc_pmacro_auto_cal_cfg2 << 30 >> 31) | (sdram->emc_pmacro_auto_cal_cfg2 & 1 | 2 * (pmc->scratch212 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFCFFFF) & 0xFFC3FFFF) & 0xFF3FFFFF) & 0xFCFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xFFFFFFF;
|
||||||
pmc->scratch213 = ((u16)(sdram->emc_prerefresh_req_cnt) << 16) | (u16)(sdram->emc_cfg_dig_dll_period);
|
// pmc->scratch213 = ((u16)(sdram->emc_prerefresh_req_cnt) << 16) | (u16)(sdram->emc_cfg_dig_dll_period);
|
||||||
pmc->scratch214 = (sdram->emc_pmacro_data_pi_ctrl << 10 >> 26 << 26) | ((sdram->emc_pmacro_data_pi_ctrl << 19 >> 31 << 25) | ((sdram->emc_pmacro_data_pi_ctrl << 20 >> 28 << 21) | ((sdram->emc_pmacro_data_pi_ctrl << 27 >> 31 << 20) | ((sdram->emc_pmacro_data_pi_ctrl << 16) & 0xFFFFF | ((sdram->emc_pmacro_ddll_bypass >> 31 << 15) | ((2 * sdram->emc_pmacro_ddll_bypass >> 31 << 14) | ((4 * sdram->emc_pmacro_ddll_bypass >> 31 << 13) | ((16 * sdram->emc_pmacro_ddll_bypass >> 31 << 12) | ((32 * sdram->emc_pmacro_ddll_bypass >> 31 << 11) | ((sdram->emc_pmacro_ddll_bypass << 6 >> 31 << 10) | ((sdram->emc_pmacro_ddll_bypass << 7 >> 31 << 9) | ((sdram->emc_pmacro_ddll_bypass << 15 >> 31 << 8) | ((sdram->emc_pmacro_ddll_bypass << 16 >> 31 << 7) | ((sdram->emc_pmacro_ddll_bypass << 17 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_bypass << 18 >> 31) | (16 * (sdram->emc_pmacro_ddll_bypass << 20 >> 31) | (8 * (sdram->emc_pmacro_ddll_bypass << 21 >> 31) | (4 * (sdram->emc_pmacro_ddll_bypass << 22 >> 31) | (2 * (sdram->emc_pmacro_ddll_bypass << 23 >> 31) | (sdram->emc_pmacro_ddll_bypass & 1 | 2 * (pmc->scratch214 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFF0FFFF) & 0xFFEFFFFF) & 0xFE1FFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
// pmc->scratch214 = (sdram->emc_pmacro_data_pi_ctrl << 10 >> 26 << 26) | ((sdram->emc_pmacro_data_pi_ctrl << 19 >> 31 << 25) | ((sdram->emc_pmacro_data_pi_ctrl << 20 >> 28 << 21) | ((sdram->emc_pmacro_data_pi_ctrl << 27 >> 31 << 20) | ((sdram->emc_pmacro_data_pi_ctrl << 16) & 0xFFFFF | ((sdram->emc_pmacro_ddll_bypass >> 31 << 15) | ((2 * sdram->emc_pmacro_ddll_bypass >> 31 << 14) | ((4 * sdram->emc_pmacro_ddll_bypass >> 31 << 13) | ((16 * sdram->emc_pmacro_ddll_bypass >> 31 << 12) | ((32 * sdram->emc_pmacro_ddll_bypass >> 31 << 11) | ((sdram->emc_pmacro_ddll_bypass << 6 >> 31 << 10) | ((sdram->emc_pmacro_ddll_bypass << 7 >> 31 << 9) | ((sdram->emc_pmacro_ddll_bypass << 15 >> 31 << 8) | ((sdram->emc_pmacro_ddll_bypass << 16 >> 31 << 7) | ((sdram->emc_pmacro_ddll_bypass << 17 >> 31 << 6) | (32 * (sdram->emc_pmacro_ddll_bypass << 18 >> 31) | (16 * (sdram->emc_pmacro_ddll_bypass << 20 >> 31) | (8 * (sdram->emc_pmacro_ddll_bypass << 21 >> 31) | (4 * (sdram->emc_pmacro_ddll_bypass << 22 >> 31) | (2 * (sdram->emc_pmacro_ddll_bypass << 23 >> 31) | (sdram->emc_pmacro_ddll_bypass & 1 | 2 * (pmc->scratch214 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFF0FFFF) & 0xFFEFFFFF) & 0xFE1FFFFF) & 0xFDFFFFFF) & 0x3FFFFFF;
|
||||||
pmc->scratch215 = (sdram->emc_pmacro_cmd_pi_ctrl << 10 >> 26 << 10) | ((sdram->emc_pmacro_cmd_pi_ctrl << 19 >> 31 << 9) | (32 * (sdram->emc_pmacro_cmd_pi_ctrl << 20 >> 28) | (16 * (sdram->emc_pmacro_cmd_pi_ctrl << 27 >> 31) | (sdram->emc_pmacro_cmd_pi_ctrl & 0xF | 16 * (pmc->scratch215 >> 4)) & 0xFFFFFFEF) & 0xFFFFFE1F) & 0xFFFFFDFF) & 0xFFFF03FF;
|
// pmc->scratch215 = (sdram->emc_pmacro_cmd_pi_ctrl << 10 >> 26 << 10) | ((sdram->emc_pmacro_cmd_pi_ctrl << 19 >> 31 << 9) | (32 * (sdram->emc_pmacro_cmd_pi_ctrl << 20 >> 28) | (16 * (sdram->emc_pmacro_cmd_pi_ctrl << 27 >> 31) | (sdram->emc_pmacro_cmd_pi_ctrl & 0xF | 16 * (pmc->scratch215 >> 4)) & 0xFFFFFFEF) & 0xFFFFFE1F) & 0xFFFFFDFF) & 0xFFFF03FF;
|
||||||
tmp = (sdram->emc_pmacro_data_pad_tx_ctrl << 7 >> 31 << 24) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 8 >> 31 << 23) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 9 >> 31 << 22) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 10 >> 31 << 21) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 15 >> 31 << 20) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 16 >> 31 << 19) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 21 >> 31 << 18) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 25 >> 31 << 17) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 26 >> 31 << 16) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 15) & 0xFFFF | ((2 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 14) | ((4 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 13) | ((8 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 12) | ((16 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 11) | ((32 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 10) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 6 >> 31 << 9) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 7 >> 31 << 8) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 8 >> 31 << 7) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 9 >> 31 << 6) | (32 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 10 >> 31) | (16 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 15 >> 31) | (8 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 16 >> 31) | (4 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 21 >> 31) | (2 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 25 >> 31) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 26 >> 31) | 2 * (pmc->scratch216 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF;
|
// tmp = (sdram->emc_pmacro_data_pad_tx_ctrl << 7 >> 31 << 24) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 8 >> 31 << 23) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 9 >> 31 << 22) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 10 >> 31 << 21) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 15 >> 31 << 20) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 16 >> 31 << 19) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 21 >> 31 << 18) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 25 >> 31 << 17) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 26 >> 31 << 16) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 15) & 0xFFFF | ((2 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 14) | ((4 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 13) | ((8 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 12) | ((16 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 11) | ((32 * sdram->emc_pmacro_cmd_pad_tx_ctrl >> 31 << 10) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 6 >> 31 << 9) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 7 >> 31 << 8) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 8 >> 31 << 7) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 9 >> 31 << 6) | (32 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 10 >> 31) | (16 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 15 >> 31) | (8 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 16 >> 31) | (4 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 21 >> 31) | (2 * (sdram->emc_pmacro_cmd_pad_tx_ctrl << 25 >> 31) | ((sdram->emc_pmacro_cmd_pad_tx_ctrl << 26 >> 31) | 2 * (pmc->scratch216 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF) & 0xFFFFFFBF) & 0xFFFFFF7F) & 0xFFFFFEFF) & 0xFFFFFDFF) & 0xFFFFFBFF) & 0xFFFFF7FF) & 0xFFFFEFFF) & 0xFFFFDFFF) & 0xFFFFBFFF) & 0xFFFF7FFF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFFBFFFF) & 0xFFF7FFFF) & 0xFFEFFFFF) & 0xFFDFFFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF;
|
||||||
|
|
||||||
s(emc_pin_gpio, 1:0, scratch9, 31:30);
|
// s(emc_pin_gpio, 1:0, scratch9, 31:30);
|
||||||
s(emc_pin_gpio_enable, 1:0, scratch10, 31:30);
|
// s(emc_pin_gpio_enable, 1:0, scratch10, 31:30);
|
||||||
s(emc_dev_select, 1:0, scratch11, 31:30);
|
// s(emc_dev_select, 1:0, scratch11, 31:30);
|
||||||
s(emc_zcal_warm_cold_boot_enables, 1:0, scratch12, 31:30);
|
// s(emc_zcal_warm_cold_boot_enables, 1:0, scratch12, 31:30);
|
||||||
s(emc_cfg_dig_dll_period_warm_boot, 1:0, scratch13, 31:30);
|
// s(emc_cfg_dig_dll_period_warm_boot, 1:0, scratch13, 31:30);
|
||||||
s32(emc_bct_spare13, scratch45);
|
// s32(emc_bct_spare13, scratch45);
|
||||||
s32(emc_bct_spare12, scratch46);
|
// s32(emc_bct_spare12, scratch46);
|
||||||
s32(emc_bct_spare7, scratch47);
|
// s32(emc_bct_spare7, scratch47);
|
||||||
s32(emc_bct_spare6, scratch48);
|
// s32(emc_bct_spare6, scratch48);
|
||||||
s32(emc_bct_spare5, scratch50);
|
// s32(emc_bct_spare5, scratch50);
|
||||||
s32(emc_bct_spare4, scratch51);
|
// s32(emc_bct_spare4, scratch51);
|
||||||
s32(emc_bct_spare3, scratch56);
|
// s32(emc_bct_spare3, scratch56);
|
||||||
s32(emc_bct_spare2, scratch57);
|
// s32(emc_bct_spare2, scratch57);
|
||||||
s32(emc_bct_spare1, scratch58);
|
// s32(emc_bct_spare1, scratch58);
|
||||||
s32(emc_bct_spare0, scratch59);
|
// s32(emc_bct_spare0, scratch59);
|
||||||
s32(emc_bct_spare9, scratch60);
|
// s32(emc_bct_spare9, scratch60);
|
||||||
s32(emc_bct_spare8, scratch61);
|
// s32(emc_bct_spare8, scratch61);
|
||||||
s32(boot_rom_patch_data, scratch62);
|
// s32(boot_rom_patch_data, scratch62);
|
||||||
s32(boot_rom_patch_control, scratch63);
|
// s32(boot_rom_patch_control, scratch63);
|
||||||
s(mc_clken_override_allwarm_boot, 0:0, scratch65, 31:31);
|
// s(mc_clken_override_allwarm_boot, 0:0, scratch65, 31:31);
|
||||||
pmc->scratch66 = pmc->scratch66 & 0x1FFFFFFF | ((u8)(sdram->emc_extra_refresh_num) << 29);
|
// pmc->scratch66 = pmc->scratch66 & 0x1FFFFFFF | ((u8)(sdram->emc_extra_refresh_num) << 29);
|
||||||
pmc->scratch72 = pmc->scratch72 & 0x8FFFFFFF | ((u16)(sdram->pmc_io_dpd3_req_wait) << 28) & 0x70000000;
|
// pmc->scratch72 = pmc->scratch72 & 0x8FFFFFFF | ((u16)(sdram->pmc_io_dpd3_req_wait) << 28) & 0x70000000;
|
||||||
pmc->scratch72 = ((2 * pmc->scratch72) >> 1) | ((u16)(sdram->emc_clken_override_allwarm_boot) << 31);
|
// pmc->scratch72 = ((2 * pmc->scratch72) >> 1) | ((u16)(sdram->emc_clken_override_allwarm_boot) << 31);
|
||||||
pmc->scratch73 = pmc->scratch73 & 0x8FFFFFFF | ((u8)(sdram->memory_type) << 28) & 0x70000000;
|
// pmc->scratch73 = pmc->scratch73 & 0x8FFFFFFF | ((u8)(sdram->memory_type) << 28) & 0x70000000;
|
||||||
pmc->scratch73 = ((2 * pmc->scratch73) >> 1) | (sdram->emc_mrs_warm_boot_enable << 31);
|
// pmc->scratch73 = ((2 * pmc->scratch73) >> 1) | (sdram->emc_mrs_warm_boot_enable << 31);
|
||||||
pmc->scratch74 = pmc->scratch74 & 0x8FFFFFFF | (sdram->pmc_io_dpd4_req_wait << 28) & 0x70000000;
|
// pmc->scratch74 = pmc->scratch74 & 0x8FFFFFFF | (sdram->pmc_io_dpd4_req_wait << 28) & 0x70000000;
|
||||||
pmc->scratch74 = ((2 * pmc->scratch74) >> 1) | (sdram->clear_clock2_mc1 << 31);
|
// pmc->scratch74 = ((2 * pmc->scratch74) >> 1) | (sdram->clear_clock2_mc1 << 31);
|
||||||
pmc->scratch75 = pmc->scratch75 & 0xEFFFFFFF | (sdram->emc_warm_boot_extramode_reg_write_enable << 28) & 0x10000000;
|
// pmc->scratch75 = pmc->scratch75 & 0xEFFFFFFF | (sdram->emc_warm_boot_extramode_reg_write_enable << 28) & 0x10000000;
|
||||||
pmc->scratch75 = pmc->scratch75 & 0xDFFFFFFF | (sdram->clk_rst_pllm_misc20_override_enable << 29) & 0x20000000;
|
// pmc->scratch75 = pmc->scratch75 & 0xDFFFFFFF | (sdram->clk_rst_pllm_misc20_override_enable << 29) & 0x20000000;
|
||||||
pmc->scratch75 = pmc->scratch75 & 0xBFFFFFFF | ((u16)(sdram->emc_dbg_write_mux) << 30) & 0x40000000;
|
// pmc->scratch75 = pmc->scratch75 & 0xBFFFFFFF | ((u16)(sdram->emc_dbg_write_mux) << 30) & 0x40000000;
|
||||||
pmc->scratch75 = ((2 * pmc->scratch75) >> 1) | ((u16)(sdram->ahb_arbitration_xbar_ctrl_meminit_done) << 31);
|
// pmc->scratch75 = ((2 * pmc->scratch75) >> 1) | ((u16)(sdram->ahb_arbitration_xbar_ctrl_meminit_done) << 31);
|
||||||
pmc->scratch90 = pmc->scratch90 & 0xFFFFFF | (sdram->emc_timing_control_wait << 24);
|
// pmc->scratch90 = pmc->scratch90 & 0xFFFFFF | (sdram->emc_timing_control_wait << 24);
|
||||||
pmc->scratch91 = pmc->scratch91 & 0xFFFFFF | (sdram->emc_zcal_warm_boot_wait << 24);
|
// pmc->scratch91 = pmc->scratch91 & 0xFFFFFF | (sdram->emc_zcal_warm_boot_wait << 24);
|
||||||
pmc->scratch92 = pmc->scratch92 & 0xFFFFFF | (sdram->warm_boot_wait << 24);
|
// pmc->scratch92 = pmc->scratch92 & 0xFFFFFF | (sdram->warm_boot_wait << 24);
|
||||||
pmc->scratch93 = pmc->scratch93 & 0xFFFFFF | ((u16)(sdram->emc_pin_program_wait) << 24);
|
// pmc->scratch93 = pmc->scratch93 & 0xFFFFFF | ((u16)(sdram->emc_pin_program_wait) << 24);
|
||||||
pmc->scratch114 = pmc->scratch114 & 0x3FFFFF | ((u16)(sdram->emc_auto_cal_wait) << 22);
|
// pmc->scratch114 = pmc->scratch114 & 0x3FFFFF | ((u16)(sdram->emc_auto_cal_wait) << 22);
|
||||||
pmc->scratch215 = (u16)pmc->scratch215 | ((u16)(sdram->swizzle_rank_byte_encode) << 16);
|
// pmc->scratch215 = (u16)pmc->scratch215 | ((u16)(sdram->swizzle_rank_byte_encode) << 16);
|
||||||
pmc->scratch216 = (2 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 30) | ((4 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 29) | ((8 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 28) | ((16 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 27) | ((32 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 26) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 6 >> 31 << 25) | tmp & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF;
|
// pmc->scratch216 = (2 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 30) | ((4 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 29) | ((8 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 28) | ((16 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 27) | ((32 * sdram->emc_pmacro_data_pad_tx_ctrl >> 31 << 26) | ((sdram->emc_pmacro_data_pad_tx_ctrl << 6 >> 31 << 25) | tmp & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF;
|
||||||
s(emc_mrw_lpddr2zcal_warm_boot, 23:16, scratch5, 7:0);
|
// s(emc_mrw_lpddr2zcal_warm_boot, 23:16, scratch5, 7:0);
|
||||||
s(emc_mrw_lpddr2zcal_warm_boot, 7:0, scratch5, 15:8);
|
// s(emc_mrw_lpddr2zcal_warm_boot, 7:0, scratch5, 15:8);
|
||||||
s(emc_warm_boot_mrw_extra, 23:16, scratch5, 23:16);
|
// s(emc_warm_boot_mrw_extra, 23:16, scratch5, 23:16);
|
||||||
s(emc_warm_boot_mrw_extra, 7:0, scratch5, 31:24);
|
// s(emc_warm_boot_mrw_extra, 7:0, scratch5, 31:24);
|
||||||
s(emc_mrw_lpddr2zcal_warm_boot, 31:30, scratch6, 1:0);
|
// s(emc_mrw_lpddr2zcal_warm_boot, 31:30, scratch6, 1:0);
|
||||||
s(emc_warm_boot_mrw_extra, 31:30, scratch6, 3:2);
|
// s(emc_warm_boot_mrw_extra, 31:30, scratch6, 3:2);
|
||||||
s(emc_mrw_lpddr2zcal_warm_boot, 27:26, scratch6, 5:4);
|
// s(emc_mrw_lpddr2zcal_warm_boot, 27:26, scratch6, 5:4);
|
||||||
s(emc_warm_boot_mrw_extra, 27:26, scratch6, 7:6);
|
// s(emc_warm_boot_mrw_extra, 27:26, scratch6, 7:6);
|
||||||
s(emc_mrw6, 27:0, scratch8, 27:0);
|
// s(EmcMrw6, 27:0, scratch8, 27:0);
|
||||||
s(emc_mrw6, 31:30, scratch8, 29:28);
|
// s(EmcMrw6, 31:30, scratch8, 29:28);
|
||||||
s(emc_mrw8, 27:0, scratch9, 27:0);
|
// s(EmcMrw8, 27:0, scratch9, 27:0);
|
||||||
s(emc_mrw8, 31:30, scratch9, 29:28);
|
// s(EmcMrw8, 31:30, scratch9, 29:28);
|
||||||
s(emc_mrw9, 27:0, scratch10, 27:0);
|
// s(EmcMrw9, 27:0, scratch10, 27:0);
|
||||||
s(emc_mrw9, 31:30, scratch10, 29:28);
|
// s(EmcMrw9, 31:30, scratch10, 29:28);
|
||||||
s(emc_mrw10, 27:0, scratch11, 27:0);
|
// s(EmcMrw10, 27:0, scratch11, 27:0);
|
||||||
s(emc_mrw10, 31:30, scratch11, 29:28);
|
// s(EmcMrw10, 31:30, scratch11, 29:28);
|
||||||
s(emc_mrw12, 27:0, scratch12, 27:0);
|
// s(EmcMrw12, 27:0, scratch12, 27:0);
|
||||||
s(emc_mrw12, 31:30, scratch12, 29:28);
|
// s(EmcMrw12, 31:30, scratch12, 29:28);
|
||||||
s(emc_mrw13, 27:0, scratch13, 27:0);
|
// s(EmcMrw13, 27:0, scratch13, 27:0);
|
||||||
s(emc_mrw13, 31:30, scratch13, 29:28);
|
// s(EmcMrw13, 31:30, scratch13, 29:28);
|
||||||
s(emc_mrw14, 27:0, scratch14, 27:0);
|
// s(EmcMrw14, 27:0, scratch14, 27:0);
|
||||||
s(emc_mrw14, 31:30, scratch14, 29:28);
|
// s(EmcMrw14, 31:30, scratch14, 29:28);
|
||||||
s(emc_mrw1, 7:0, scratch15, 7:0);
|
// s(EmcMrw1, 7:0, scratch15, 7:0);
|
||||||
s(emc_mrw1, 23:16, scratch15, 15:8);
|
// s(EmcMrw1, 23:16, scratch15, 15:8);
|
||||||
s(emc_mrw1, 27:26, scratch15, 17:16);
|
// s(EmcMrw1, 27:26, scratch15, 17:16);
|
||||||
s(emc_mrw1, 31:30, scratch15, 19:18);
|
// s(EmcMrw1, 31:30, scratch15, 19:18);
|
||||||
s(emc_warm_boot_mrw_extra, 7:0, scratch16, 7:0);
|
// s(emc_warm_boot_mrw_extra, 7:0, scratch16, 7:0);
|
||||||
s(emc_warm_boot_mrw_extra, 23:16, scratch16, 15:8);
|
// s(emc_warm_boot_mrw_extra, 23:16, scratch16, 15:8);
|
||||||
s(emc_warm_boot_mrw_extra, 27:26, scratch16, 17:16);
|
// s(emc_warm_boot_mrw_extra, 27:26, scratch16, 17:16);
|
||||||
s(emc_warm_boot_mrw_extra, 31:30, scratch16, 19:18);
|
// s(emc_warm_boot_mrw_extra, 31:30, scratch16, 19:18);
|
||||||
s(emc_mrw2, 7:0, scratch17, 7:0);
|
// s(emc_mrw2, 7:0, scratch17, 7:0);
|
||||||
s(emc_mrw2, 23:16, scratch17, 15:8);
|
// s(emc_mrw2, 23:16, scratch17, 15:8);
|
||||||
s(emc_mrw2, 27:26, scratch17, 17:16);
|
// s(emc_mrw2, 27:26, scratch17, 17:16);
|
||||||
s(emc_mrw2, 31:30, scratch17, 19:18);
|
// s(emc_mrw2, 31:30, scratch17, 19:18);
|
||||||
pmc->scratch18 = (sdram->emc_mrw3 >> 30 << 18) | ((16 * sdram->emc_mrw3 >> 31 << 17) | ((32 * sdram->emc_mrw3 >> 31 << 16) | ((sdram->emc_mrw3 << 8 >> 24 << 8) | ((u8)sdram->emc_mrw3 | (pmc->scratch18 >> 8 << 8)) & 0xFFFF00FF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFF3FFFF;
|
// pmc->scratch18 = (sdram->emc_mrw3 >> 30 << 18) | ((16 * sdram->emc_mrw3 >> 31 << 17) | ((32 * sdram->emc_mrw3 >> 31 << 16) | ((sdram->emc_mrw3 << 8 >> 24 << 8) | ((u8)sdram->emc_mrw3 | (pmc->scratch18 >> 8 << 8)) & 0xFFFF00FF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFF3FFFF;
|
||||||
pmc->scratch19 = (sdram->emc_mrw4 >> 30 << 18) | ((16 * sdram->emc_mrw4 >> 31 << 17) | ((32 * sdram->emc_mrw4 >> 31 << 16) | ((sdram->emc_mrw4 << 8 >> 24 << 8) | ((u8)sdram->emc_mrw4 | (pmc->scratch19 >> 8 << 8)) & 0xFFFF00FF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFF3FFFF;
|
// pmc->scratch19 = (sdram->emc_mrw4 >> 30 << 18) | ((16 * sdram->emc_mrw4 >> 31 << 17) | ((32 * sdram->emc_mrw4 >> 31 << 16) | ((sdram->emc_mrw4 << 8 >> 24 << 8) | ((u8)sdram->emc_mrw4 | (pmc->scratch19 >> 8 << 8)) & 0xFFFF00FF) & 0xFFFEFFFF) & 0xFFFDFFFF) & 0xFFF3FFFF;
|
||||||
s32(emc_cmd_mapping_byte, secure_scratch8);
|
// s32(emc_cmd_mapping_byte, secure_scratch8);
|
||||||
s32(emc_pmacro_brick_mapping0, secure_scratch9);
|
// s32(emc_pmacro_brick_mapping0, secure_scratch9);
|
||||||
s32(emc_pmacro_brick_mapping1, secure_scratch10);
|
// s32(emc_pmacro_brick_mapping1, secure_scratch10);
|
||||||
s32(emc_pmacro_brick_mapping2, secure_scratch11);
|
// s32(emc_pmacro_brick_mapping2, secure_scratch11);
|
||||||
s32(mc_video_protect_gpu_override0, secure_scratch12);
|
// s32(mc_video_protect_gpu_override0, secure_scratch12);
|
||||||
pmc->secure_scratch13 = ((u16)(sdram->emc_adr_cfg) << 31) | (2 * ((((u16)(sdram->mc_untranslated_region_check) << 22) >> 31 << 30) | ((((u16)(sdram->mc_untranslated_region_check) << 23) >> 31 << 29) | (((u16)(sdram->mc_untranslated_region_check) << 28) & 0x1FFFFFFF | ((2 * sdram->emc_cmd_mapping_cmd0_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd0_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd0_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd0_0 & 0x7F | (pmc->secure_scratch13 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch13 = ((u16)(sdram->emc_adr_cfg) << 31) | (2 * ((((u16)(sdram->mc_untranslated_region_check) << 22) >> 31 << 30) | ((((u16)(sdram->mc_untranslated_region_check) << 23) >> 31 << 29) | (((u16)(sdram->mc_untranslated_region_check) << 28) & 0x1FFFFFFF | ((2 * sdram->emc_cmd_mapping_cmd0_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd0_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd0_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd0_0 & 0x7F | (pmc->secure_scratch13 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch14 = (sdram->mc_video_protect_write_access << 30 >> 31 << 31) | (2 * ((sdram->mc_video_protect_write_access << 30) | ((sdram->mc_video_protect_bom_adr_hi << 30 >> 2) | ((2 * sdram->emc_cmd_mapping_cmd0_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd0_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd0_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd0_1 & 0x7F | (pmc->secure_scratch14 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch14 = (sdram->mc_video_protect_write_access << 30 >> 31 << 31) | (2 * ((sdram->mc_video_protect_write_access << 30) | ((sdram->mc_video_protect_bom_adr_hi << 30 >> 2) | ((2 * sdram->emc_cmd_mapping_cmd0_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd0_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd0_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd0_1 & 0x7F | (pmc->secure_scratch14 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch15 = ((u16)(sdram->mc_mts_carveout_adr_hi) << 30) | (4 * ((sdram->mc_sec_carveout_adr_hi << 28) | ((2 * sdram->emc_cmd_mapping_cmd1_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd1_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd1_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd1_0 & 0x7F | (pmc->secure_scratch15 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->secure_scratch15 = ((u16)(sdram->mc_mts_carveout_adr_hi) << 30) | (4 * ((sdram->mc_sec_carveout_adr_hi << 28) | ((2 * sdram->emc_cmd_mapping_cmd1_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd1_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd1_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd1_0 & 0x7F | (pmc->secure_scratch15 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->secure_scratch16 = (sdram->mc_generalized_carveout3_bom_hi << 30) | (4 * ((sdram->mc_generalized_carveout5_bom_hi << 28) | ((2 * sdram->emc_cmd_mapping_cmd1_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd1_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd1_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd1_1 & 0x7F | (pmc->secure_scratch16 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->secure_scratch16 = (sdram->mc_generalized_carveout3_bom_hi << 30) | (4 * ((sdram->mc_generalized_carveout5_bom_hi << 28) | ((2 * sdram->emc_cmd_mapping_cmd1_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd1_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd1_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd1_1 & 0x7F | (pmc->secure_scratch16 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->secure_scratch17 = ((u16)(sdram->mc_generalized_carveout4_bom_hi) << 30) | (4 * (((u16)(sdram->mc_generalized_carveout2_bom_hi) << 28) | ((2 * sdram->emc_cmd_mapping_cmd2_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd2_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd2_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd2_0 & 0x7F | (pmc->secure_scratch17 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) >> 2);
|
// pmc->secure_scratch17 = ((u16)(sdram->mc_generalized_carveout4_bom_hi) << 30) | (4 * (((u16)(sdram->mc_generalized_carveout2_bom_hi) << 28) | ((2 * sdram->emc_cmd_mapping_cmd2_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd2_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd2_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd2_0 & 0x7F | (pmc->secure_scratch17 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) >> 2);
|
||||||
pmc->secure_scratch18 = (sdram->emc_fbio_cfg8 << 16 >> 31 << 31) | (2 * (((u16)(sdram->emc_fbio_spare) << 30 >> 31 << 30) | ((sdram->mc_generalized_carveout1_bom_hi << 30 >> 2) | ((2 * sdram->emc_cmd_mapping_cmd2_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd2_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd2_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd2_1 & 0x7F | (pmc->secure_scratch18 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch18 = (sdram->emc_fbio_cfg8 << 16 >> 31 << 31) | (2 * (((u16)(sdram->emc_fbio_spare) << 30 >> 31 << 30) | ((sdram->mc_generalized_carveout1_bom_hi << 30 >> 2) | ((2 * sdram->emc_cmd_mapping_cmd2_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd2_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd2_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd2_1 & 0x7F | (pmc->secure_scratch18 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xCFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch19 = (sdram->mc_video_protect_vpr_override << 31) | (2 * (((u16)(sdram->mc_mts_carveout_reg_ctrl) << 30) | ((sdram->mc_sec_carveout_protect_write_access << 31 >> 2) | (((u16)(sdram->mc_emem_adr_cfg) << 28) & 0x1FFFFFFF | ((2 * sdram->emc_cmd_mapping_cmd3_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd3_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd3_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd3_0 & 0x7F | (pmc->secure_scratch19 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch19 = (sdram->mc_video_protect_vpr_override << 31) | (2 * (((u16)(sdram->mc_mts_carveout_reg_ctrl) << 30) | ((sdram->mc_sec_carveout_protect_write_access << 31 >> 2) | (((u16)(sdram->mc_emem_adr_cfg) << 28) & 0x1FFFFFFF | ((2 * sdram->emc_cmd_mapping_cmd3_0 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd3_0 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd3_0 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd3_0 & 0x7F | (pmc->secure_scratch19 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch20 = (sdram->mc_generalized_carveout2_cfg0 << 25 >> 28 << 28) | ((2 * sdram->emc_cmd_mapping_cmd3_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd3_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd3_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd3_1 & 0x7F | (pmc->secure_scratch20 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xFFFFFFF;
|
// pmc->secure_scratch20 = (sdram->mc_generalized_carveout2_cfg0 << 25 >> 28 << 28) | ((2 * sdram->emc_cmd_mapping_cmd3_1 >> 25 << 21) | ((sdram->emc_cmd_mapping_cmd3_1 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd3_1 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd3_1 & 0x7F | (pmc->secure_scratch20 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xF01FFFFF) & 0xFFFFFFF;
|
||||||
pmc->secure_scratch39 = (sdram->mc_video_protect_vpr_override << 30 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout2_cfg0 << 21 >> 28 << 27) | ((32 * sdram->mc_generalized_carveout4_cfg0 >> 31 << 26) | ((sdram->mc_generalized_carveout4_cfg0 << 6 >> 31 << 25) | ((sdram->mc_generalized_carveout4_cfg0 << 7 >> 31 << 24) | ((sdram->mc_generalized_carveout4_cfg0 << 8 >> 31 << 23) | ((sdram->mc_generalized_carveout4_cfg0 << 9 >> 31 << 22) | ((sdram->mc_generalized_carveout4_cfg0 << 10 >> 28 << 18) | ((sdram->mc_generalized_carveout4_cfg0 << 14 >> 28 << 14) | ((sdram->mc_generalized_carveout4_cfg0 << 18 >> 29 << 11) | ((sdram->mc_generalized_carveout4_cfg0 << 21 >> 28 << 7) | (8 * (sdram->mc_generalized_carveout4_cfg0 << 25 >> 28) | (4 * (sdram->mc_generalized_carveout4_cfg0 << 29 >> 31) | (2 * (sdram->mc_generalized_carveout4_cfg0 << 30 >> 31) | (sdram->mc_generalized_carveout4_cfg0 & 1 | 2 * (pmc->secure_scratch39 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFF87) & 0xFFFFF87F) & 0xFFFFC7FF) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0x87FFFFFF) >> 1);
|
// pmc->secure_scratch39 = (sdram->mc_video_protect_vpr_override << 30 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout2_cfg0 << 21 >> 28 << 27) | ((32 * sdram->mc_generalized_carveout4_cfg0 >> 31 << 26) | ((sdram->mc_generalized_carveout4_cfg0 << 6 >> 31 << 25) | ((sdram->mc_generalized_carveout4_cfg0 << 7 >> 31 << 24) | ((sdram->mc_generalized_carveout4_cfg0 << 8 >> 31 << 23) | ((sdram->mc_generalized_carveout4_cfg0 << 9 >> 31 << 22) | ((sdram->mc_generalized_carveout4_cfg0 << 10 >> 28 << 18) | ((sdram->mc_generalized_carveout4_cfg0 << 14 >> 28 << 14) | ((sdram->mc_generalized_carveout4_cfg0 << 18 >> 29 << 11) | ((sdram->mc_generalized_carveout4_cfg0 << 21 >> 28 << 7) | (8 * (sdram->mc_generalized_carveout4_cfg0 << 25 >> 28) | (4 * (sdram->mc_generalized_carveout4_cfg0 << 29 >> 31) | (2 * (sdram->mc_generalized_carveout4_cfg0 << 30 >> 31) | (sdram->mc_generalized_carveout4_cfg0 & 1 | 2 * (pmc->secure_scratch39 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFF87) & 0xFFFFF87F) & 0xFFFFC7FF) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0x87FFFFFF) >> 1);
|
||||||
pmc->secure_scratch40 = (sdram->mc_video_protect_vpr_override << 29 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout2_cfg0 << 14 >> 28 << 27) | ((32 * sdram->mc_generalized_carveout5_cfg0 >> 31 << 26) | ((sdram->mc_generalized_carveout5_cfg0 << 6 >> 31 << 25) | ((sdram->mc_generalized_carveout5_cfg0 << 7 >> 31 << 24) | ((sdram->mc_generalized_carveout5_cfg0 << 8 >> 31 << 23) | ((sdram->mc_generalized_carveout5_cfg0 << 9 >> 31 << 22) | ((sdram->mc_generalized_carveout5_cfg0 << 10 >> 28 << 18) | ((sdram->mc_generalized_carveout5_cfg0 << 14 >> 28 << 14) | ((sdram->mc_generalized_carveout5_cfg0 << 18 >> 29 << 11) | ((sdram->mc_generalized_carveout5_cfg0 << 21 >> 28 << 7) | (8 * (sdram->mc_generalized_carveout5_cfg0 << 25 >> 28) | (4 * (sdram->mc_generalized_carveout5_cfg0 << 29 >> 31) | (2 * (sdram->mc_generalized_carveout5_cfg0 << 30 >> 31) | (sdram->mc_generalized_carveout5_cfg0 & 1 | 2 * (pmc->secure_scratch40 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFF87) & 0xFFFFF87F) & 0xFFFFC7FF) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0x87FFFFFF) >> 1);
|
// pmc->secure_scratch40 = (sdram->mc_video_protect_vpr_override << 29 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout2_cfg0 << 14 >> 28 << 27) | ((32 * sdram->mc_generalized_carveout5_cfg0 >> 31 << 26) | ((sdram->mc_generalized_carveout5_cfg0 << 6 >> 31 << 25) | ((sdram->mc_generalized_carveout5_cfg0 << 7 >> 31 << 24) | ((sdram->mc_generalized_carveout5_cfg0 << 8 >> 31 << 23) | ((sdram->mc_generalized_carveout5_cfg0 << 9 >> 31 << 22) | ((sdram->mc_generalized_carveout5_cfg0 << 10 >> 28 << 18) | ((sdram->mc_generalized_carveout5_cfg0 << 14 >> 28 << 14) | ((sdram->mc_generalized_carveout5_cfg0 << 18 >> 29 << 11) | ((sdram->mc_generalized_carveout5_cfg0 << 21 >> 28 << 7) | (8 * (sdram->mc_generalized_carveout5_cfg0 << 25 >> 28) | (4 * (sdram->mc_generalized_carveout5_cfg0 << 29 >> 31) | (2 * (sdram->mc_generalized_carveout5_cfg0 << 30 >> 31) | (sdram->mc_generalized_carveout5_cfg0 & 1 | 2 * (pmc->secure_scratch40 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFF87) & 0xFFFFF87F) & 0xFFFFC7FF) & 0xFFFC3FFF) & 0xFFC3FFFF) & 0xFFBFFFFF) & 0xFF7FFFFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0x87FFFFFF) >> 1);
|
||||||
pmc->secure_scratch41 = (sdram->mc_generalized_carveout2_cfg0 << 18 >> 29 << 29) | ((sdram->mc_generalized_carveout2_cfg0 << 10 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd0_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd0_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd0_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd0_2 & 0x7F | (pmc->secure_scratch41 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0x1FFFFFFF;
|
// pmc->secure_scratch41 = (sdram->mc_generalized_carveout2_cfg0 << 18 >> 29 << 29) | ((sdram->mc_generalized_carveout2_cfg0 << 10 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd0_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd0_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd0_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd0_2 & 0x7F | (pmc->secure_scratch41 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->secure_scratch42 = ((u16)(sdram->mc_generalized_carveout1_cfg0) << 18 >> 29 << 29) | (((u16)(sdram->mc_generalized_carveout1_cfg0) << 25 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd1_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd1_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd1_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd1_2 & 0x7F | (pmc->secure_scratch42 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0x1FFFFFFF;
|
// pmc->secure_scratch42 = ((u16)(sdram->mc_generalized_carveout1_cfg0) << 18 >> 29 << 29) | (((u16)(sdram->mc_generalized_carveout1_cfg0) << 25 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd1_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd1_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd1_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd1_2 & 0x7F | (pmc->secure_scratch42 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->secure_scratch43 = ((u16)(sdram->mc_generalized_carveout3_cfg0) << 18 >> 29 << 29) | (((u16)(sdram->mc_generalized_carveout1_cfg0) << 21 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd2_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd2_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd2_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd2_2 & 0x7F | (pmc->secure_scratch43 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0x1FFFFFFF;
|
// pmc->secure_scratch43 = ((u16)(sdram->mc_generalized_carveout3_cfg0) << 18 >> 29 << 29) | (((u16)(sdram->mc_generalized_carveout1_cfg0) << 21 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd2_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd2_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd2_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd2_2 & 0x7F | (pmc->secure_scratch43 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0x1FFFFFFF;
|
||||||
pmc->secure_scratch44 = (sdram->mc_video_protect_vpr_override << 24 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 25 >> 31 << 30) | ((sdram->mc_video_protect_vpr_override << 28 >> 31 << 29) | ((sdram->mc_generalized_carveout1_cfg0 << 14 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd3_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd3_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd3_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd3_2 & 0x7F | (pmc->secure_scratch44 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch44 = (sdram->mc_video_protect_vpr_override << 24 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 25 >> 31 << 30) | ((sdram->mc_video_protect_vpr_override << 28 >> 31 << 29) | ((sdram->mc_generalized_carveout1_cfg0 << 14 >> 28 << 25) | ((16 * sdram->emc_cmd_mapping_cmd3_2 >> 28 << 21) | ((sdram->emc_cmd_mapping_cmd3_2 << 9 >> 25 << 14) | ((sdram->emc_cmd_mapping_cmd3_2 << 17 >> 25 << 7) | (sdram->emc_cmd_mapping_cmd3_2 & 0x7F | (pmc->secure_scratch44 >> 7 << 7)) & 0xFFFFC07F) & 0xFFE03FFF) & 0xFE1FFFFF) & 0xE1FFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
s(mc_emem_adr_cfg_channel_mask, 31:9, secure_scratch45, 22:0);
|
// s(mc_emem_adr_cfg_channel_mask, 31:9, secure_scratch45, 22:0);
|
||||||
s(mc_emem_adr_cfg_dev0, 2:0, secure_scratch45, 25:23);
|
// s(mc_emem_adr_cfg_dev0, 2:0, secure_scratch45, 25:23);
|
||||||
s(mc_emem_adr_cfg_dev0, 9:8, secure_scratch45, 27:26);
|
// s(mc_emem_adr_cfg_dev0, 9:8, secure_scratch45, 27:26);
|
||||||
s(mc_emem_adr_cfg_dev0, 19:16, secure_scratch45, 31:28);
|
// s(mc_emem_adr_cfg_dev0, 19:16, secure_scratch45, 31:28);
|
||||||
pmc->secure_scratch46 = (sdram->mc_video_protect_vpr_override << 23 >> 31 << 31) | (2 * ((sdram->mc_emem_adr_cfg_dev1 << 12 >> 28 << 27) | ((sdram->mc_emem_adr_cfg_dev1 << 22 >> 30 << 25) | ((sdram->mc_emem_adr_cfg_dev1 << 22) & 0x1FFFFFF | ((sdram->mc_emem_adr_cfg_bank_mask0 >> 10) | (pmc->secure_scratch46 >> 22 << 22)) & 0xFE3FFFFF) & 0xF9FFFFFF) & 0x87FFFFFF) >> 1);
|
// pmc->secure_scratch46 = (sdram->mc_video_protect_vpr_override << 23 >> 31 << 31) | (2 * ((sdram->mc_emem_adr_cfg_dev1 << 12 >> 28 << 27) | ((sdram->mc_emem_adr_cfg_dev1 << 22 >> 30 << 25) | ((sdram->mc_emem_adr_cfg_dev1 << 22) & 0x1FFFFFF | ((sdram->mc_emem_adr_cfg_bank_mask0 >> 10) | (pmc->secure_scratch46 >> 22 << 22)) & 0xFE3FFFFF) & 0xF9FFFFFF) & 0x87FFFFFF) >> 1);
|
||||||
pmc->secure_scratch47 = (sdram->mc_video_protect_vpr_override << 20 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 22 >> 31 << 30) | (((u8)(sdram->mc_generalized_carveout3_cfg0) << 25 >> 28 << 26) | ((sdram->mc_generalized_carveout1_cfg0 << 10 >> 28 << 22) | ((sdram->mc_emem_adr_cfg_bank_mask1 >> 10) | (pmc->secure_scratch47 >> 22 << 22)) & 0xFC3FFFFF) & 0xC3FFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch47 = (sdram->mc_video_protect_vpr_override << 20 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 22 >> 31 << 30) | (((u8)(sdram->mc_generalized_carveout3_cfg0) << 25 >> 28 << 26) | ((sdram->mc_generalized_carveout1_cfg0 << 10 >> 28 << 22) | ((sdram->mc_emem_adr_cfg_bank_mask1 >> 10) | (pmc->secure_scratch47 >> 22 << 22)) & 0xFC3FFFFF) & 0xC3FFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch48 = (sdram->mc_video_protect_vpr_override << 16 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 17 >> 31 << 30) | ((sdram->mc_generalized_carveout3_cfg0 << 14 >> 28 << 26) | ((sdram->mc_generalized_carveout3_cfg0 << 21 >> 28 << 22) | ((sdram->mc_emem_adr_cfg_bank_mask2 >> 10) | (pmc->secure_scratch48 >> 22 << 22)) & 0xFC3FFFFF) & 0xC3FFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch48 = (sdram->mc_video_protect_vpr_override << 16 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 17 >> 31 << 30) | ((sdram->mc_generalized_carveout3_cfg0 << 14 >> 28 << 26) | ((sdram->mc_generalized_carveout3_cfg0 << 21 >> 28 << 22) | ((sdram->mc_emem_adr_cfg_bank_mask2 >> 10) | (pmc->secure_scratch48 >> 22 << 22)) & 0xFC3FFFFF) & 0xC3FFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch49 = (sdram->mc_video_protect_vpr_override << 14 >> 31 << 31) | (2 * ((sdram->mc_emem_cfg >> 31 << 30) | ((sdram->mc_emem_cfg << 18 >> 2) | (sdram->mc_video_protect_gpu_override1 & 0xFFFF | (pmc->secure_scratch49 >> 16 << 16)) & 0xC000FFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch49 = (sdram->mc_video_protect_vpr_override << 14 >> 31 << 31) | (2 * ((sdram->mc_emem_cfg >> 31 << 30) | ((sdram->mc_emem_cfg << 18 >> 2) | (sdram->mc_video_protect_gpu_override1 & 0xFFFF | (pmc->secure_scratch49 >> 16 << 16)) & 0xC000FFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch50 = (sdram->mc_video_protect_vpr_override << 12 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 13 >> 31 << 30) | ((sdram->mc_generalized_carveout1_bom >> 17 << 15) | ((sdram->mc_generalized_carveout3_bom >> 17) | (pmc->secure_scratch50 >> 15 << 15)) & 0xC0007FFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch50 = (sdram->mc_video_protect_vpr_override << 12 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 13 >> 31 << 30) | ((sdram->mc_generalized_carveout1_bom >> 17 << 15) | ((sdram->mc_generalized_carveout3_bom >> 17) | (pmc->secure_scratch50 >> 15 << 15)) & 0xC0007FFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch51 = (sdram->mc_video_protect_vpr_override << 10 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 11 >> 31 << 30) | ((sdram->mc_generalized_carveout2_bom >> 17 << 15) | ((sdram->mc_generalized_carveout4_bom >> 17) | (pmc->secure_scratch51 >> 15 << 15)) & 0xC0007FFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch51 = (sdram->mc_video_protect_vpr_override << 10 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override << 11 >> 31 << 30) | ((sdram->mc_generalized_carveout2_bom >> 17 << 15) | ((sdram->mc_generalized_carveout4_bom >> 17) | (pmc->secure_scratch51 >> 15 << 15)) & 0xC0007FFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch52 = (sdram->mc_video_protect_vpr_override << 9 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout3_cfg0 << 10 >> 28 << 27) | ((sdram->mc_video_protect_bom >> 20 << 15) | ((sdram->mc_generalized_carveout5_bom >> 17) | (pmc->secure_scratch52 >> 15 << 15)) & 0xF8007FFF) & 0x87FFFFFF) >> 1);
|
// pmc->secure_scratch52 = (sdram->mc_video_protect_vpr_override << 9 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout3_cfg0 << 10 >> 28 << 27) | ((sdram->mc_video_protect_bom >> 20 << 15) | ((sdram->mc_generalized_carveout5_bom >> 17) | (pmc->secure_scratch52 >> 15 << 15)) & 0xF8007FFF) & 0x87FFFFFF) >> 1);
|
||||||
pmc->secure_scratch53 = (sdram->mc_video_protect_vpr_override1 << 27 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override1 << 30 >> 31 << 30) | ((sdram->mc_video_protect_vpr_override1 << 31 >> 2) | ((sdram->mc_video_protect_vpr_override >> 31 << 28) | ((2 * sdram->mc_video_protect_vpr_override >> 31 << 27) | ((4 * sdram->mc_video_protect_vpr_override >> 31 << 26) | ((32 * sdram->mc_video_protect_vpr_override >> 31 << 25) | ((sdram->mc_video_protect_vpr_override << 8 >> 31 << 24) | ((sdram->mc_sec_carveout_bom >> 20 << 12) | (sdram->mc_video_protect_size_mb & 0xFFF | (pmc->secure_scratch53 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch53 = (sdram->mc_video_protect_vpr_override1 << 27 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override1 << 30 >> 31 << 30) | ((sdram->mc_video_protect_vpr_override1 << 31 >> 2) | ((sdram->mc_video_protect_vpr_override >> 31 << 28) | ((2 * sdram->mc_video_protect_vpr_override >> 31 << 27) | ((4 * sdram->mc_video_protect_vpr_override >> 31 << 26) | ((32 * sdram->mc_video_protect_vpr_override >> 31 << 25) | ((sdram->mc_video_protect_vpr_override << 8 >> 31 << 24) | ((sdram->mc_sec_carveout_bom >> 20 << 12) | (sdram->mc_video_protect_size_mb & 0xFFF | (pmc->secure_scratch53 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch54 = (sdram->mc_video_protect_vpr_override1 << 19 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override1 << 20 >> 31 << 30) | ((sdram->mc_video_protect_vpr_override1 << 21 >> 31 << 29) | ((sdram->mc_video_protect_vpr_override1 << 22 >> 31 << 28) | ((sdram->mc_video_protect_vpr_override1 << 23 >> 31 << 27) | ((sdram->mc_video_protect_vpr_override1 << 24 >> 31 << 26) | ((sdram->mc_video_protect_vpr_override1 << 25 >> 31 << 25) | ((sdram->mc_video_protect_vpr_override1 << 26 >> 31 << 24) | ((sdram->mc_mts_carveout_bom >> 20 << 12) | (sdram->mc_sec_carveout_size_mb & 0xFFF | (pmc->secure_scratch54 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch54 = (sdram->mc_video_protect_vpr_override1 << 19 >> 31 << 31) | (2 * ((sdram->mc_video_protect_vpr_override1 << 20 >> 31 << 30) | ((sdram->mc_video_protect_vpr_override1 << 21 >> 31 << 29) | ((sdram->mc_video_protect_vpr_override1 << 22 >> 31 << 28) | ((sdram->mc_video_protect_vpr_override1 << 23 >> 31 << 27) | ((sdram->mc_video_protect_vpr_override1 << 24 >> 31 << 26) | ((sdram->mc_video_protect_vpr_override1 << 25 >> 31 << 25) | ((sdram->mc_video_protect_vpr_override1 << 26 >> 31 << 24) | ((sdram->mc_mts_carveout_bom >> 20 << 12) | (sdram->mc_sec_carveout_size_mb & 0xFFF | (pmc->secure_scratch54 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch55 = (sdram->mc_generalized_carveout2_cfg0 << 30 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout2_cfg0 << 30) | ((32 * sdram->mc_video_protect_vpr_override1 >> 31 << 29) | ((sdram->mc_video_protect_vpr_override1 << 6 >> 31 << 28) | ((sdram->mc_video_protect_vpr_override1 << 15 >> 31 << 27) | ((sdram->mc_video_protect_vpr_override1 << 16 >> 31 << 26) | ((sdram->mc_video_protect_vpr_override1 << 17 >> 31 << 25) | ((sdram->mc_video_protect_vpr_override1 << 18 >> 31 << 24) | (((u16)(sdram->mc_generalized_carveout4_size_128kb) << 12) & 0xFFFFFF | (sdram->mc_mts_carveout_size_mb & 0xFFF | (pmc->secure_scratch55 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch55 = (sdram->mc_generalized_carveout2_cfg0 << 30 >> 31 << 31) | (2 * ((sdram->mc_generalized_carveout2_cfg0 << 30) | ((32 * sdram->mc_video_protect_vpr_override1 >> 31 << 29) | ((sdram->mc_video_protect_vpr_override1 << 6 >> 31 << 28) | ((sdram->mc_video_protect_vpr_override1 << 15 >> 31 << 27) | ((sdram->mc_video_protect_vpr_override1 << 16 >> 31 << 26) | ((sdram->mc_video_protect_vpr_override1 << 17 >> 31 << 25) | ((sdram->mc_video_protect_vpr_override1 << 18 >> 31 << 24) | (((u16)(sdram->mc_generalized_carveout4_size_128kb) << 12) & 0xFFFFFF | (sdram->mc_mts_carveout_size_mb & 0xFFF | (pmc->secure_scratch55 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch56 = ((u16)(sdram->mc_generalized_carveout1_cfg0) << 30 >> 31 << 31) | (2 * (((u16)(sdram->mc_generalized_carveout1_cfg0) << 30) | ((32 * sdram->mc_generalized_carveout2_cfg0 >> 31 << 29) | ((sdram->mc_generalized_carveout2_cfg0 << 6 >> 31 << 28) | ((sdram->mc_generalized_carveout2_cfg0 << 7 >> 31 << 27) | ((sdram->mc_generalized_carveout2_cfg0 << 8 >> 31 << 26) | ((sdram->mc_generalized_carveout2_cfg0 << 9 >> 31 << 25) | ((sdram->mc_generalized_carveout2_cfg0 << 29 >> 31 << 24) | (((u16)(sdram->mc_generalized_carveout2_size_128kb) << 12) & 0xFFFFFF | (sdram->mc_generalized_carveout3_size_128kb & 0xFFF | (pmc->secure_scratch56 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch56 = ((u16)(sdram->mc_generalized_carveout1_cfg0) << 30 >> 31 << 31) | (2 * (((u16)(sdram->mc_generalized_carveout1_cfg0) << 30) | ((32 * sdram->mc_generalized_carveout2_cfg0 >> 31 << 29) | ((sdram->mc_generalized_carveout2_cfg0 << 6 >> 31 << 28) | ((sdram->mc_generalized_carveout2_cfg0 << 7 >> 31 << 27) | ((sdram->mc_generalized_carveout2_cfg0 << 8 >> 31 << 26) | ((sdram->mc_generalized_carveout2_cfg0 << 9 >> 31 << 25) | ((sdram->mc_generalized_carveout2_cfg0 << 29 >> 31 << 24) | (((u16)(sdram->mc_generalized_carveout2_size_128kb) << 12) & 0xFFFFFF | (sdram->mc_generalized_carveout3_size_128kb & 0xFFF | (pmc->secure_scratch56 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
pmc->secure_scratch57 = ((u8)(sdram->mc_generalized_carveout3_cfg0) << 30 >> 31 << 31) | (2 * (((u8)(sdram->mc_generalized_carveout3_cfg0) << 30) | ((32 * sdram->mc_generalized_carveout1_cfg0 >> 31 << 29) | ((sdram->mc_generalized_carveout1_cfg0 << 6 >> 31 << 28) | ((sdram->mc_generalized_carveout1_cfg0 << 7 >> 31 << 27) | ((sdram->mc_generalized_carveout1_cfg0 << 8 >> 31 << 26) | ((sdram->mc_generalized_carveout1_cfg0 << 9 >> 31 << 25) | ((sdram->mc_generalized_carveout1_cfg0 << 29 >> 31 << 24) | ((sdram->mc_generalized_carveout5_size_128kb << 12) & 0xFFFFFF | (sdram->mc_generalized_carveout1_size_128kb & 0xFFF | (pmc->secure_scratch57 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
// pmc->secure_scratch57 = ((u8)(sdram->mc_generalized_carveout3_cfg0) << 30 >> 31 << 31) | (2 * (((u8)(sdram->mc_generalized_carveout3_cfg0) << 30) | ((32 * sdram->mc_generalized_carveout1_cfg0 >> 31 << 29) | ((sdram->mc_generalized_carveout1_cfg0 << 6 >> 31 << 28) | ((sdram->mc_generalized_carveout1_cfg0 << 7 >> 31 << 27) | ((sdram->mc_generalized_carveout1_cfg0 << 8 >> 31 << 26) | ((sdram->mc_generalized_carveout1_cfg0 << 9 >> 31 << 25) | ((sdram->mc_generalized_carveout1_cfg0 << 29 >> 31 << 24) | ((sdram->mc_generalized_carveout5_size_128kb << 12) & 0xFFFFFF | (sdram->mc_generalized_carveout1_size_128kb & 0xFFF | (pmc->secure_scratch57 >> 12 << 12)) & 0xFF000FFF) & 0xFEFFFFFF) & 0xFDFFFFFF) & 0xFBFFFFFF) & 0xF7FFFFFF) & 0xEFFFFFFF) & 0xDFFFFFFF) & 0xBFFFFFFF) >> 1);
|
||||||
|
|
||||||
s32(mc_generalized_carveout1_access0, secure_scratch59);
|
// s32(mc_generalized_carveout1_access0, secure_scratch59);
|
||||||
s32(mc_generalized_carveout1_access1, secure_scratch60);
|
// s32(mc_generalized_carveout1_access1, secure_scratch60);
|
||||||
s32(mc_generalized_carveout1_access2, secure_scratch61);
|
// s32(mc_generalized_carveout1_access2, secure_scratch61);
|
||||||
s32(mc_generalized_carveout1_access3, secure_scratch62);
|
// s32(mc_generalized_carveout1_access3, secure_scratch62);
|
||||||
s32(mc_generalized_carveout1_access4, secure_scratch63);
|
// s32(mc_generalized_carveout1_access4, secure_scratch63);
|
||||||
s32(mc_generalized_carveout2_access0, secure_scratch64);
|
// s32(mc_generalized_carveout2_access0, secure_scratch64);
|
||||||
s32(mc_generalized_carveout2_access1, secure_scratch65);
|
// s32(mc_generalized_carveout2_access1, secure_scratch65);
|
||||||
s32(mc_generalized_carveout2_access2, secure_scratch66);
|
// s32(mc_generalized_carveout2_access2, secure_scratch66);
|
||||||
s32(mc_generalized_carveout2_access3, secure_scratch67);
|
// s32(mc_generalized_carveout2_access3, secure_scratch67);
|
||||||
s32(mc_generalized_carveout2_access4, secure_scratch68);
|
// s32(mc_generalized_carveout2_access4, secure_scratch68);
|
||||||
s32(mc_generalized_carveout3_access0, secure_scratch69);
|
// s32(mc_generalized_carveout3_access0, secure_scratch69);
|
||||||
s32(mc_generalized_carveout3_access1, secure_scratch70);
|
// s32(mc_generalized_carveout3_access1, secure_scratch70);
|
||||||
s32(mc_generalized_carveout3_access2, secure_scratch71);
|
// s32(mc_generalized_carveout3_access2, secure_scratch71);
|
||||||
s32(mc_generalized_carveout3_access3, secure_scratch72);
|
// s32(mc_generalized_carveout3_access3, secure_scratch72);
|
||||||
s32(mc_generalized_carveout3_access4, secure_scratch73);
|
// s32(mc_generalized_carveout3_access4, secure_scratch73);
|
||||||
s32(mc_generalized_carveout4_access0, secure_scratch74);
|
// s32(mc_generalized_carveout4_access0, secure_scratch74);
|
||||||
s32(mc_generalized_carveout4_access1, secure_scratch75);
|
// s32(mc_generalized_carveout4_access1, secure_scratch75);
|
||||||
s32(mc_generalized_carveout4_access2, secure_scratch76);
|
// s32(mc_generalized_carveout4_access2, secure_scratch76);
|
||||||
s32(mc_generalized_carveout4_access3, secure_scratch77);
|
// s32(mc_generalized_carveout4_access3, secure_scratch77);
|
||||||
s32(mc_generalized_carveout4_access4, secure_scratch78);
|
// s32(mc_generalized_carveout4_access4, secure_scratch78);
|
||||||
s32(mc_generalized_carveout5_access0, secure_scratch79);
|
// s32(mc_generalized_carveout5_access0, secure_scratch79);
|
||||||
s32(mc_generalized_carveout5_access1, secure_scratch80);
|
// s32(mc_generalized_carveout5_access1, secure_scratch80);
|
||||||
s32(mc_generalized_carveout5_access2, secure_scratch81);
|
// s32(mc_generalized_carveout5_access2, secure_scratch81);
|
||||||
s32(mc_generalized_carveout5_access3, secure_scratch82);
|
// s32(mc_generalized_carveout5_access3, secure_scratch82);
|
||||||
s32(mc_generalized_carveout1_force_internal_access0, secure_scratch84);
|
// s32(mc_generalized_carveout1_force_internal_access0, secure_scratch84);
|
||||||
s32(mc_generalized_carveout1_force_internal_access1, secure_scratch85);
|
// s32(mc_generalized_carveout1_force_internal_access1, secure_scratch85);
|
||||||
s32(mc_generalized_carveout1_force_internal_access2, secure_scratch86);
|
// s32(mc_generalized_carveout1_force_internal_access2, secure_scratch86);
|
||||||
s32(mc_generalized_carveout1_force_internal_access3, secure_scratch87);
|
// s32(mc_generalized_carveout1_force_internal_access3, secure_scratch87);
|
||||||
s32(mc_generalized_carveout1_force_internal_access4, secure_scratch88);
|
// s32(mc_generalized_carveout1_force_internal_access4, secure_scratch88);
|
||||||
s32(mc_generalized_carveout2_force_internal_access0, secure_scratch89);
|
// s32(mc_generalized_carveout2_force_internal_access0, secure_scratch89);
|
||||||
s32(mc_generalized_carveout2_force_internal_access1, secure_scratch90);
|
// s32(mc_generalized_carveout2_force_internal_access1, secure_scratch90);
|
||||||
s32(mc_generalized_carveout2_force_internal_access2, secure_scratch91);
|
// s32(mc_generalized_carveout2_force_internal_access2, secure_scratch91);
|
||||||
s32(mc_generalized_carveout2_force_internal_access3, secure_scratch92);
|
// s32(mc_generalized_carveout2_force_internal_access3, secure_scratch92);
|
||||||
s32(mc_generalized_carveout2_force_internal_access4, secure_scratch93);
|
// s32(mc_generalized_carveout2_force_internal_access4, secure_scratch93);
|
||||||
s32(mc_generalized_carveout3_force_internal_access0, secure_scratch94);
|
// s32(mc_generalized_carveout3_force_internal_access0, secure_scratch94);
|
||||||
s32(mc_generalized_carveout3_force_internal_access1, secure_scratch95);
|
// s32(mc_generalized_carveout3_force_internal_access1, secure_scratch95);
|
||||||
s32(mc_generalized_carveout3_force_internal_access2, secure_scratch96);
|
// s32(mc_generalized_carveout3_force_internal_access2, secure_scratch96);
|
||||||
s32(mc_generalized_carveout3_force_internal_access3, secure_scratch97);
|
// s32(mc_generalized_carveout3_force_internal_access3, secure_scratch97);
|
||||||
s32(mc_generalized_carveout3_force_internal_access4, secure_scratch98);
|
// s32(mc_generalized_carveout3_force_internal_access4, secure_scratch98);
|
||||||
s32(mc_generalized_carveout4_force_internal_access0, secure_scratch99);
|
// s32(mc_generalized_carveout4_force_internal_access0, secure_scratch99);
|
||||||
s32(mc_generalized_carveout4_force_internal_access1, secure_scratch100);
|
// s32(mc_generalized_carveout4_force_internal_access1, secure_scratch100);
|
||||||
s32(mc_generalized_carveout4_force_internal_access2, secure_scratch101);
|
// s32(mc_generalized_carveout4_force_internal_access2, secure_scratch101);
|
||||||
s32(mc_generalized_carveout4_force_internal_access3, secure_scratch102);
|
// s32(mc_generalized_carveout4_force_internal_access3, secure_scratch102);
|
||||||
s32(mc_generalized_carveout4_force_internal_access4, secure_scratch103);
|
// s32(mc_generalized_carveout4_force_internal_access4, secure_scratch103);
|
||||||
s32(mc_generalized_carveout5_force_internal_access0, secure_scratch104);
|
// s32(mc_generalized_carveout5_force_internal_access0, secure_scratch104);
|
||||||
s32(mc_generalized_carveout5_force_internal_access1, secure_scratch105);
|
// s32(mc_generalized_carveout5_force_internal_access1, secure_scratch105);
|
||||||
s32(mc_generalized_carveout5_force_internal_access2, secure_scratch106);
|
// s32(mc_generalized_carveout5_force_internal_access2, secure_scratch106);
|
||||||
s32(mc_generalized_carveout5_force_internal_access3, secure_scratch107);
|
// s32(mc_generalized_carveout5_force_internal_access3, secure_scratch107);
|
||||||
|
|
||||||
pmc->secure_scratch58 = 32 * (32 * sdram->mc_generalized_carveout3_cfg0 >> 31) | (16 * (sdram->mc_generalized_carveout3_cfg0 << 6 >> 31) | (8 * (sdram->mc_generalized_carveout3_cfg0 << 7 >> 31) | (4 * (sdram->mc_generalized_carveout3_cfg0 << 8 >> 31) | (2 * (sdram->mc_generalized_carveout3_cfg0 << 9 >> 31) | ((sdram->mc_generalized_carveout3_cfg0 << 29 >> 31) | 2 * (pmc->secure_scratch58 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF;
|
// pmc->secure_scratch58 = 32 * (32 * sdram->mc_generalized_carveout3_cfg0 >> 31) | (16 * (sdram->mc_generalized_carveout3_cfg0 << 6 >> 31) | (8 * (sdram->mc_generalized_carveout3_cfg0 << 7 >> 31) | (4 * (sdram->mc_generalized_carveout3_cfg0 << 8 >> 31) | (2 * (sdram->mc_generalized_carveout3_cfg0 << 9 >> 31) | ((sdram->mc_generalized_carveout3_cfg0 << 29 >> 31) | 2 * (pmc->secure_scratch58 >> 1)) & 0xFFFFFFFD) & 0xFFFFFFFB) & 0xFFFFFFF7) & 0xFFFFFFEF) & 0xFFFFFFDF;
|
||||||
|
|
||||||
c32(0, scratch2);
|
// c32(0, scratch2);
|
||||||
s(pllm_input_divider, 7:0, scratch2, 7:0);
|
// s(pllm_input_divider, 7:0, scratch2, 7:0);
|
||||||
s(pllm_feedback_divider, 7:0, scratch2, 15:8);
|
// s(pllm_feedback_divider, 7:0, scratch2, 15:8);
|
||||||
s(pllm_post_divider, 4:0, scratch2, 20:16);
|
// s(pllm_post_divider, 4:0, scratch2, 20:16);
|
||||||
s(pllm_kvco, 0:0, scratch2, 17:17);
|
// s(pllm_kvco, 0:0, scratch2, 17:17);
|
||||||
s(pllm_kcp, 1:0, scratch2, 19:18);
|
// s(pllm_kcp, 1:0, scratch2, 19:18);
|
||||||
|
|
||||||
c32(0, scratch35);
|
// c32(0, scratch35);
|
||||||
s(pllm_setup_control, 15:0, scratch35, 15:0);
|
// s(pllm_setup_control, 15:0, scratch35, 15:0);
|
||||||
|
|
||||||
c32(0, scratch3);
|
// c32(0, scratch3);
|
||||||
s(pllm_input_divider, 7:0, scratch3, 7:0);
|
// s(pllm_input_divider, 7:0, scratch3, 7:0);
|
||||||
c(0x3e, scratch3, 15:8);
|
// c(0x3e, scratch3, 15:8);
|
||||||
c(0, scratch3, 20:16);
|
// c(0, scratch3, 20:16);
|
||||||
s(pllm_kvco, 0:0, scratch3, 21:21);
|
// s(pllm_kvco, 0:0, scratch3, 21:21);
|
||||||
s(pllm_kcp, 1:0, scratch3, 23:22);
|
// s(pllm_kcp, 1:0, scratch3, 23:22);
|
||||||
|
|
||||||
c32(0, scratch36);
|
// c32(0, scratch36);
|
||||||
s(pllm_setup_control, 23:0, scratch36, 23:0);
|
// s(PllMSetupControl, 23:0, scratch36, 23:0);
|
||||||
|
|
||||||
c32(0, scratch4);
|
// c32(0, scratch4);
|
||||||
s(pllm_stable_time, 9:0, scratch4, 9:0); // s32(pllm_stable_time, scratch4);, s(pllm_stable_time, 31:0, scratch4, 31:10);
|
// s(pllm_stable_time, 9:0, scratch4, 9:0); // s32(pllm_stable_time, scratch4);, s(pllm_stable_time, 31:0, scratch4, 31:10);
|
||||||
s(pllm_stable_time, 31:0, scratch4, 31:10);
|
// s(pllm_stable_time, 31:0, scratch4, 31:10);
|
||||||
}
|
// }
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
void sdram_lp0_save_params(const void *params)
|
void sdram_lp0_save_params(const void *params)
|
||||||
{
|
{
|
||||||
u32 chip_id = (APB_MISC(APB_MISC_GP_HIDREV) >> 4) & 0xF;
|
// u32 chip_id = (APB_MISC(APB_MISC_GP_HIDREV) >> 4) & 0xF;
|
||||||
|
|
||||||
if (chip_id != GP_HIDREV_MAJOR_T210B01)
|
// if (chip_id != GP_HIDREV_MAJOR_T210B01)
|
||||||
_sdram_lp0_save_params_t210(params);
|
_sdram_lp0_save_params_t210(params);
|
||||||
else
|
// else
|
||||||
_sdram_lp0_save_params_t210b01(params);
|
// _sdram_lp0_save_params_t210b01(params);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ u8 smmu_payload[] __attribute__((aligned(16))) = {
|
|||||||
void *page_alloc(u32 num)
|
void *page_alloc(u32 num)
|
||||||
{
|
{
|
||||||
u8 *res = _pageheap;
|
u8 *res = _pageheap;
|
||||||
_pageheap += SZ_PAGE * num;
|
_pageheap += 0x1000 * num;
|
||||||
memset(res, 0, SZ_PAGE * num);
|
memset(res, 0, 0x1000 * num);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,8 +150,8 @@ void smmu_map(u32 *pdir, u32 addr, u32 page, int cnt, u32 attr)
|
|||||||
{
|
{
|
||||||
u32 *pte = smmu_get_pte(pdir, addr);
|
u32 *pte = smmu_get_pte(pdir, addr);
|
||||||
*pte = SMMU_ADDR_TO_PFN(page) | attr;
|
*pte = SMMU_ADDR_TO_PFN(page) | attr;
|
||||||
addr += SZ_PAGE;
|
addr += 0x1000;
|
||||||
page += SZ_PAGE;
|
page += 0x1000;
|
||||||
}
|
}
|
||||||
smmu_flush_all();
|
smmu_flush_all();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
#define MC_SMMU_TLB_FLUSH 0x30
|
#define MC_SMMU_TLB_FLUSH 0x30
|
||||||
#define MC_SMMU_PTC_FLUSH 0x34
|
#define MC_SMMU_PTC_FLUSH 0x34
|
||||||
#define MC_SMMU_ASID_SECURITY 0x38
|
#define MC_SMMU_ASID_SECURITY 0x38
|
||||||
#define MC_SMMU_AVPC_ASID 0x23C
|
|
||||||
#define MC_SMMU_TSEC_ASID 0x294
|
#define MC_SMMU_TSEC_ASID 0x294
|
||||||
#define MC_SMMU_TRANSLATION_ENABLE_0 0x228
|
#define MC_SMMU_TRANSLATION_ENABLE_0 0x228
|
||||||
#define MC_SMMU_TRANSLATION_ENABLE_1 0x22c
|
#define MC_SMMU_TRANSLATION_ENABLE_1 0x22c
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -19,11 +19,11 @@
|
|||||||
|
|
||||||
//#define IPL_STACK_TOP 0x4003FF00
|
//#define IPL_STACK_TOP 0x4003FF00
|
||||||
/* --- BIT/BCT: 0x40000000 - 0x40003000 --- */
|
/* --- BIT/BCT: 0x40000000 - 0x40003000 --- */
|
||||||
/* --- IPL: 0x40008000 - 0x40028000 --- */
|
/* --- IPL: 0x40003000 - 0x40028000 --- */
|
||||||
#define LDR_LOAD_ADDR 0x40007000
|
#define LDR_LOAD_ADDR 0x40007000
|
||||||
|
|
||||||
#define IPL_LOAD_ADDR 0x40008000
|
#define IPL_LOAD_ADDR 0x40003000
|
||||||
#define IPL_SZ_MAX SZ_128K
|
#define IPL_SZ_MAX 0x20000 // 128KB.
|
||||||
|
|
||||||
/* --- XUSB EP context and TRB ring buffers --- */
|
/* --- XUSB EP context and TRB ring buffers --- */
|
||||||
#define XUSB_RING_ADDR 0x40020000
|
#define XUSB_RING_ADDR 0x40020000
|
||||||
@@ -35,50 +35,45 @@
|
|||||||
|
|
||||||
/* --- DRAM START --- */
|
/* --- DRAM START --- */
|
||||||
#define DRAM_START 0x80000000
|
#define DRAM_START 0x80000000
|
||||||
#define HOS_RSVD SZ_16M // Do not write anything in this area.
|
#define HOS_RSVD 0x1000000 // Do not write anything in this area.
|
||||||
|
|
||||||
#define NYX_LOAD_ADDR 0x81000000
|
#define NYX_LOAD_ADDR 0x81000000
|
||||||
#define NYX_SZ_MAX SZ_16M
|
#define NYX_SZ_MAX 0x1000000 // 16MB
|
||||||
/* --- Gap: 0x82000000 - 0x82FFFFFF --- */
|
/* --- Gap: 0x82000000 - 0x82FFFFFF --- */
|
||||||
|
|
||||||
/* Stack theoretical max: 33MB */
|
/* Stack theoretical max: 33MB */
|
||||||
#define IPL_STACK_TOP 0x83100000
|
#define IPL_STACK_TOP 0x83100000
|
||||||
#define IPL_HEAP_START 0x84000000
|
#define IPL_HEAP_START 0x84000000
|
||||||
#define IPL_HEAP_SZ SZ_512M
|
#define IPL_HEAP_SZ 0x20000000 // 512MB.
|
||||||
/* --- Gap: 1040MB 0xA4000000 - 0xE4FFFFFF --- */
|
/* --- Gap: 1040MB 0xA4000000 - 0xE4FFFFFF --- */
|
||||||
|
|
||||||
// Virtual disk / Chainloader buffers.
|
// Virtual disk / Chainloader buffers.
|
||||||
#define RAM_DISK_ADDR 0xA4000000
|
#define RAM_DISK_ADDR 0xA4000000
|
||||||
#define RAM_DISK_SZ 0x41000000 // 1040MB.
|
#define NX_BIS_CACHE_ADDR RAM_DISK_ADDR
|
||||||
#define RAM_DISK2_SZ 0x21000000 // 528MB.
|
#define RAM_DISK_SZ 0x41000000 // 1040MB.
|
||||||
|
|
||||||
// NX BIS driver sector cache.
|
|
||||||
#define NX_BIS_CACHE_ADDR 0xC5000000
|
|
||||||
#define NX_BIS_CACHE_SZ 0x10020000 // 256MB.
|
|
||||||
#define NX_BIS_LOOKUP_ADDR 0xD6000000
|
|
||||||
#define NX_BIS_LOOKUP_SZ 0xF000000 // 240MB.
|
|
||||||
|
|
||||||
// L4T Kernel Panic Storage (PSTORE).
|
// L4T Kernel Panic Storage (PSTORE).
|
||||||
#define PSTORE_ADDR 0xB0000000
|
#define PSTORE_ADDR 0xB0000000
|
||||||
#define PSTORE_SZ SZ_2M
|
#define PSTORE_SZ 0x200000 // 2MB.
|
||||||
|
|
||||||
//#define DRAM_LIB_ADDR 0xE0000000
|
//#define DRAM_LIB_ADDR 0xE0000000
|
||||||
/* --- Chnldr: 252MB 0xC03C0000 - 0xCFFFFFFF --- */ //! Only used when chainloading.
|
/* --- Chnldr: 252MB 0xC03C0000 - 0xCFFFFFFF --- */ //! Only used when chainloading.
|
||||||
|
|
||||||
// SDMMC DMA buffers 1
|
// SDMMC DMA buffers 1
|
||||||
#define SDMMC_UPPER_BUFFER 0xE5000000
|
#define SDMMC_UPPER_BUFFER 0xE5000000
|
||||||
#define SDMMC_UP_BUF_SZ SZ_128M
|
#define SDMMC_UP_BUF_SZ 0x8000000 // 128MB.
|
||||||
|
|
||||||
// Nyx buffers.
|
// Nyx buffers.
|
||||||
#define NYX_STORAGE_ADDR 0xED000000
|
#define NYX_STORAGE_ADDR 0xED000000
|
||||||
#define NYX_RES_ADDR 0xEE000000
|
#define NYX_RES_ADDR 0xEE000000
|
||||||
#define NYX_RES_SZ SZ_16M
|
#define NYX_RES_SZ 0x1000000 // 16MB.
|
||||||
|
|
||||||
// SDMMC DMA buffers 2
|
// SDMMC DMA buffers 2
|
||||||
#define SDXC_BUF_ALIGNED 0xEF000000
|
#define SDXC_BUF_ALIGNED 0xEF000000
|
||||||
#define MIXD_BUF_ALIGNED 0xF0000000
|
#define MIXD_BUF_ALIGNED 0xF0000000
|
||||||
|
#define TITLEKEY_BUF_ADR MIXD_BUF_ALIGNED
|
||||||
#define EMMC_BUF_ALIGNED MIXD_BUF_ALIGNED
|
#define EMMC_BUF_ALIGNED MIXD_BUF_ALIGNED
|
||||||
#define SDMMC_DMA_BUF_SZ SZ_16M // 4MB currently used.
|
#define SDMMC_DMA_BUF_SZ 0x1000000 // 16MB (4MB currently used).
|
||||||
|
|
||||||
// Nyx LvGL buffers.
|
// Nyx LvGL buffers.
|
||||||
#define NYX_LV_VDB_ADR 0xF1000000
|
#define NYX_LV_VDB_ADR 0xF1000000
|
||||||
@@ -96,17 +91,22 @@
|
|||||||
#define NYX_FB_SZ 0x384000 // 1280 x 720 x 4.
|
#define NYX_FB_SZ 0x384000 // 1280 x 720 x 4.
|
||||||
|
|
||||||
#define DRAM_MEM_HOLE_ADR 0xF6A00000
|
#define DRAM_MEM_HOLE_ADR 0xF6A00000
|
||||||
|
#define NX_BIS_LOOKUP_ADR DRAM_MEM_HOLE_ADR
|
||||||
#define DRAM_MEM_HOLE_SZ 0x8140000
|
#define DRAM_MEM_HOLE_SZ 0x8140000
|
||||||
/* --- Hole: 129MB 0xF6A00000 - 0xFEB3FFFF --- */
|
/* --- Hole: 129MB 0xF6A00000 - 0xFEB3FFFF --- */
|
||||||
#define DRAM_START2 0xFEB40000
|
#define DRAM_START2 0xFEB40000
|
||||||
|
|
||||||
|
// NX BIS driver sector cache.
|
||||||
|
// #define NX_BIS_CACHE_ADDR 0xFEE00000
|
||||||
|
// #define NX_BIS_CACHE_SZ 0x100000
|
||||||
|
|
||||||
// USB buffers.
|
// USB buffers.
|
||||||
#define USBD_ADDR 0xFEF00000
|
#define USBD_ADDR 0xFEF00000
|
||||||
#define USB_DESCRIPTOR_ADDR 0xFEF40000
|
#define USB_DESCRIPTOR_ADDR 0xFEF40000
|
||||||
#define USB_EP_CONTROL_BUF_ADDR 0xFEF80000
|
#define USB_EP_CONTROL_BUF_ADDR 0xFEF80000
|
||||||
#define USB_EP_BULK_IN_BUF_ADDR 0xFF000000
|
#define USB_EP_BULK_IN_BUF_ADDR 0xFF000000
|
||||||
#define USB_EP_BULK_OUT_BUF_ADDR 0xFF800000
|
#define USB_EP_BULK_OUT_BUF_ADDR 0xFF800000
|
||||||
#define USB_EP_BULK_OUT_MAX_XFER SZ_8M
|
#define USB_EP_BULK_OUT_MAX_XFER 0x800000
|
||||||
|
|
||||||
// #define EXT_PAYLOAD_ADDR 0xC0000000
|
// #define EXT_PAYLOAD_ADDR 0xC0000000
|
||||||
// #define RCM_PAYLOAD_ADDR (EXT_PAYLOAD_ADDR + ALIGN(PATCHED_RELOC_SZ, 0x10))
|
// #define RCM_PAYLOAD_ADDR (EXT_PAYLOAD_ADDR + ALIGN(PATCHED_RELOC_SZ, 0x10))
|
||||||
|
|||||||
@@ -21,13 +21,10 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
|
|
||||||
#define IANOS_EXT0 0x304E4149
|
|
||||||
|
|
||||||
// Module Callback
|
// Module Callback
|
||||||
typedef void (*cbMainModule_t)(const char *s);
|
typedef void (*cbMainModule_t)(const char *s);
|
||||||
typedef void (*memcpy_t)(void *, void *, size_t);
|
typedef void (*memcpy_t)(void *, void *, size_t);
|
||||||
typedef void (*memset_t)(void *, int, size_t);
|
typedef void (*memset_t)(void *, int, size_t);
|
||||||
typedef int (*reg_voltage_set_t)(u32, u32);
|
|
||||||
|
|
||||||
typedef struct _bdkParams_t
|
typedef struct _bdkParams_t
|
||||||
{
|
{
|
||||||
@@ -36,8 +33,6 @@ typedef struct _bdkParams_t
|
|||||||
heap_t *sharedHeap;
|
heap_t *sharedHeap;
|
||||||
memcpy_t memcpy;
|
memcpy_t memcpy;
|
||||||
memset_t memset;
|
memset_t memset;
|
||||||
u32 extension_magic;
|
|
||||||
reg_voltage_set_t reg_voltage_set;
|
|
||||||
} *bdkParams_t;
|
} *bdkParams_t;
|
||||||
|
|
||||||
// Module Entrypoint
|
// Module Entrypoint
|
||||||
|
|||||||
@@ -95,9 +95,9 @@
|
|||||||
#define MAX77620_IRQSD_PFI_SD1 BIT(6)
|
#define MAX77620_IRQSD_PFI_SD1 BIT(6)
|
||||||
#define MAX77620_IRQSD_PFI_SD0 BIT(7)
|
#define MAX77620_IRQSD_PFI_SD0 BIT(7)
|
||||||
|
|
||||||
#define MAX77620_REG_IRQ_LVL2_L0_7 0x08 // LDO number that irq occurred.
|
#define MAX77620_REG_IRQ_LVL2_L0_7 0x08 // LDO number that irq occured.
|
||||||
#define MAX77620_REG_IRQ_MSK_L0_7 0x10
|
#define MAX77620_REG_IRQ_MSK_L0_7 0x10
|
||||||
#define MAX77620_REG_IRQ_LVL2_L8 0x09 // LDO number that irq occurred. Only bit0: LDO8 is valid.
|
#define MAX77620_REG_IRQ_LVL2_L8 0x09 // LDO number that irq occured. Only bit0: LDO8 is valid.
|
||||||
#define MAX77620_REG_IRQ_MSK_L8 0x11
|
#define MAX77620_REG_IRQ_MSK_L8 0x11
|
||||||
#define MAX77620_REG_IRQ_LVL2_GPIO 0x0A // Edge detection interrupt.
|
#define MAX77620_REG_IRQ_LVL2_GPIO 0x0A // Edge detection interrupt.
|
||||||
|
|
||||||
@@ -139,8 +139,8 @@
|
|||||||
#define MAX77620_REG_DVSSD0 0x1B
|
#define MAX77620_REG_DVSSD0 0x1B
|
||||||
#define MAX77620_REG_DVSSD1 0x1C
|
#define MAX77620_REG_DVSSD1 0x1C
|
||||||
#define MAX77620_SDX_VOLT_MASK 0xFF
|
#define MAX77620_SDX_VOLT_MASK 0xFF
|
||||||
#define MAX77620_SD0_VOLT_MASK 0x7F // Max is 0x40.
|
#define MAX77620_SD0_VOLT_MASK 0x3F
|
||||||
#define MAX77620_SD1_VOLT_MASK 0x7F // Max is 0x4C.
|
#define MAX77620_SD1_VOLT_MASK 0x7F
|
||||||
#define MAX77620_LDO_VOLT_MASK 0x3F
|
#define MAX77620_LDO_VOLT_MASK 0x3F
|
||||||
|
|
||||||
#define MAX77620_REG_SD0_CFG 0x1D
|
#define MAX77620_REG_SD0_CFG 0x1D
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ typedef struct _max77620_regulator_t
|
|||||||
|
|
||||||
static const max77620_regulator_t _pmic_regulators[] = {
|
static const max77620_regulator_t _pmic_regulators[] = {
|
||||||
{ "sd0", 12500, 600000, 625000, 1400000, REGULATOR_SD, MAX77620_REG_SD0, MAX77620_REG_SD0_CFG, MAX77620_SD0_VOLT_MASK, {{ MAX77620_REG_FPS_SD0, 1, 7, 1 }} },
|
{ "sd0", 12500, 600000, 625000, 1400000, REGULATOR_SD, MAX77620_REG_SD0, MAX77620_REG_SD0_CFG, MAX77620_SD0_VOLT_MASK, {{ MAX77620_REG_FPS_SD0, 1, 7, 1 }} },
|
||||||
{ "sd1", 12500, 600000, 1125000, 1250000, REGULATOR_SD, MAX77620_REG_SD1, MAX77620_REG_SD1_CFG, MAX77620_SD1_VOLT_MASK, {{ MAX77620_REG_FPS_SD1, 0, 1, 5 }} },
|
{ "sd1", 12500, 600000, 1125000, 1125000, REGULATOR_SD, MAX77620_REG_SD1, MAX77620_REG_SD1_CFG, MAX77620_SD1_VOLT_MASK, {{ MAX77620_REG_FPS_SD1, 0, 1, 5 }} },
|
||||||
{ "sd2", 12500, 600000, 1325000, 1350000, REGULATOR_SD, MAX77620_REG_SD2, MAX77620_REG_SD2_CFG, MAX77620_SDX_VOLT_MASK, {{ MAX77620_REG_FPS_SD2, 1, 5, 2 }} },
|
{ "sd2", 12500, 600000, 1325000, 1350000, REGULATOR_SD, MAX77620_REG_SD2, MAX77620_REG_SD2_CFG, MAX77620_SDX_VOLT_MASK, {{ MAX77620_REG_FPS_SD2, 1, 5, 2 }} },
|
||||||
{ "sd3", 12500, 600000, 1800000, 1800000, REGULATOR_SD, MAX77620_REG_SD3, MAX77620_REG_SD3_CFG, MAX77620_SDX_VOLT_MASK, {{ MAX77620_REG_FPS_SD3, 0, 3, 3 }} },
|
{ "sd3", 12500, 600000, 1800000, 1800000, REGULATOR_SD, MAX77620_REG_SD3, MAX77620_REG_SD3_CFG, MAX77620_SDX_VOLT_MASK, {{ MAX77620_REG_FPS_SD3, 0, 3, 3 }} },
|
||||||
{ "ldo0", 25000, 800000, 1200000, 1200000, REGULATOR_LDO, MAX77620_REG_LDO0_CFG, MAX77620_REG_LDO0_CFG2, MAX77620_LDO_VOLT_MASK, {{ MAX77620_REG_FPS_LDO0, 3, 7, 0 }} },
|
{ "ldo0", 25000, 800000, 1200000, 1200000, REGULATOR_LDO, MAX77620_REG_LDO0_CFG, MAX77620_REG_LDO0_CFG2, MAX77620_LDO_VOLT_MASK, {{ MAX77620_REG_FPS_LDO0, 3, 7, 0 }} },
|
||||||
@@ -328,7 +328,6 @@ void max77620_config_default()
|
|||||||
_max7762x_set_reg(MAX77620_I2C_ADDR, MAX77620_REG_SD_CFG2, MAX77620_SD_CNF2_ROVS_EN_SD0);
|
_max7762x_set_reg(MAX77620_I2C_ADDR, MAX77620_REG_SD_CFG2, MAX77620_SD_CNF2_ROVS_EN_SD0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stock HOS: disabled.
|
|
||||||
void max77620_low_battery_monitor_config(bool enable)
|
void max77620_low_battery_monitor_config(bool enable)
|
||||||
{
|
{
|
||||||
_max7762x_set_reg(MAX77620_I2C_ADDR, MAX77620_REG_CNFGGLBL1,
|
_max7762x_set_reg(MAX77620_I2C_ADDR, MAX77620_REG_CNFGGLBL1,
|
||||||
|
|||||||
@@ -20,14 +20,6 @@
|
|||||||
|
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* SDx actual min is 625 mV. Multipliers 0/1 reserved.
|
|
||||||
* SD0 max is 1400 mV
|
|
||||||
* SD1 max is 1550 mV
|
|
||||||
* SD2 max is 3787.5 mV
|
|
||||||
* SD3 max is 3787.5 mV
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Switch Power domains (max77620):
|
* Switch Power domains (max77620):
|
||||||
* Name | Usage | uV step | uV min | uV default | uV max | Init
|
* Name | Usage | uV step | uV min | uV default | uV max | Init
|
||||||
@@ -40,11 +32,11 @@
|
|||||||
* ldo1 | XUSB, PCIE | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv)
|
* ldo1 | XUSB, PCIE | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv)
|
||||||
* ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 |
|
* ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 |
|
||||||
* ldo3 | GC ASIC | 50000 | 800000 | 3100000 | 3100000 | 3.1V (pcv)
|
* ldo3 | GC ASIC | 50000 | 800000 | 3100000 | 3100000 | 3.1V (pcv)
|
||||||
* ldo4 | RTC | 12500 | 800000 | 850000 | 850000 | 0.85V (AO, pcv)
|
* ldo4 | RTC | 12500 | 800000 | 850000 | 850000 |
|
||||||
* ldo5 | GC Card | 50000 | 800000 | 1800000 | 1800000 | 1.8V (pcv)
|
* ldo5 | GC Card | 50000 | 800000 | 1800000 | 1800000 | 1.8V (pcv)
|
||||||
* ldo6 | Touch, ALS | 50000 | 800000 | 2900000 | 2900000 | 2.9V (pcv)
|
* ldo6 | Touch, ALS | 50000 | 800000 | 2900000 | 2900000 | 2.9V
|
||||||
* ldo7 | XUSB | 50000 | 800000 | 1050000 | 1050000 | 1.05V (pcv)
|
* ldo7 | XUSB | 50000 | 800000 | 1050000 | 1050000 |
|
||||||
* ldo8 | XUSB, DP, MCU | 50000 | 800000 | 1050000 | 2800000 | 1.05V/2.8V (pcv)
|
* ldo8 | XUSB, DC | 50000 | 800000 | 1050000 | 1050000 |
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -143,10 +135,10 @@
|
|||||||
#define MAX77621_CTRL_HOS_CFG 0
|
#define MAX77621_CTRL_HOS_CFG 0
|
||||||
#define MAX77621_CTRL_POR_CFG 1
|
#define MAX77621_CTRL_POR_CFG 1
|
||||||
|
|
||||||
int max77620_regulator_get_status(u32 id);
|
int max77620_regulator_get_status(u32 id);
|
||||||
int max77620_regulator_config_fps(u32 id);
|
int max77620_regulator_config_fps(u32 id);
|
||||||
int max7762x_regulator_set_voltage(u32 id, u32 mv);
|
int max7762x_regulator_set_voltage(u32 id, u32 mv);
|
||||||
int max7762x_regulator_enable(u32 id, bool enable);
|
int max7762x_regulator_enable(u32 id, bool enable);
|
||||||
void max77620_config_gpio(u32 id, bool enable);
|
void max77620_config_gpio(u32 id, bool enable);
|
||||||
void max77620_config_default();
|
void max77620_config_default();
|
||||||
void max77620_low_battery_monitor_config(bool enable);
|
void max77620_low_battery_monitor_config(bool enable);
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
#ifndef _MAX77812_H_
|
#ifndef _MAX77812_H_
|
||||||
#define _MAX77812_H_
|
#define _MAX77812_H_
|
||||||
|
|
||||||
#define MAX77812_PHASE31_CPU_I2C_ADDR 0x31 // High power GPU. 2 Outputs: 3-phase M1 + 1-phase M4.
|
#define MAX77812_PHASE31_CPU_I2C_ADDR 0x31 // 2 Outputs: 3-phase M1 + 1-phase M4.
|
||||||
#define MAX77812_PHASE211_CPU_I2C_ADDR 0x33 // Low power GPU. 3 Outputs: 2-phase M1 + 1-phase M3 + 1-phase M4.
|
#define MAX77812_PHASE211_CPU_I2C_ADDR 0x33 // 3 Outputs: 2-phase M1 + 1-phase M3 + 1-phase M4.
|
||||||
|
|
||||||
#define MAX77812_REG_RSET 0x00
|
#define MAX77812_REG_RSET 0x00
|
||||||
#define MAX77812_REG_INT_SRC 0x01
|
#define MAX77812_REG_INT_SRC 0x01
|
||||||
@@ -74,14 +74,14 @@
|
|||||||
#define MAX77812_REG_GLB_CFG2 0x34
|
#define MAX77812_REG_GLB_CFG2 0x34
|
||||||
#define MAX77812_REG_GLB_CFG3 0x35
|
#define MAX77812_REG_GLB_CFG3 0x35
|
||||||
|
|
||||||
/*! Protected area and settings only for MAX77812_ES2_VERSION */
|
/*! Protected area and settings only for MAX77812_REG_VERSION 4 */
|
||||||
#define MAX77812_REG_GLB_CFG4 0x36
|
#define MAX77812_REG_GLB_CFG4 0x36
|
||||||
#define MAX77812_REG_GLB_CFG5 0x37
|
#define MAX77812_REG_GLB_CFG5 0x37
|
||||||
#define MAX77812_REG_GLB_CFG6 0x38
|
#define MAX77812_REG_GLB_CFG6 0x38
|
||||||
#define MAX77812_REG_GLB_CFG7 0x39
|
#define MAX77812_REG_GLB_CFG7 0x39
|
||||||
#define MAX77812_REG_GLB_CFG8 0x3A
|
#define MAX77812_REG_GLB_CFG8 0x3A
|
||||||
#define MAX77812_REG_PROT_ACCESS 0xFD
|
#define MAX77812_REG_PROT_ACCESS 0xFD
|
||||||
#define MAX77812_REG_MAX 0xFD
|
#define MAX77812_REG_MAX 0xFE
|
||||||
|
|
||||||
#define MAX77812_REG_EN_CTRL_MASK(n) BIT(n)
|
#define MAX77812_REG_EN_CTRL_MASK(n) BIT(n)
|
||||||
#define MAX77812_START_SLEW_RATE_MASK 0x07
|
#define MAX77812_START_SLEW_RATE_MASK 0x07
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -14,52 +14,37 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <soc/fuse.h>
|
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include <soc/hw_init.h>
|
|
||||||
#include <soc/pinmux.h>
|
#include <soc/pinmux.h>
|
||||||
#include <soc/pmc.h>
|
#include <soc/pmc.h>
|
||||||
#include <soc/t210.h>
|
#include <soc/t210.h>
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
static u8 reg_5v_dev = 0;
|
static u8 reg_5v_dev = 0;
|
||||||
static bool usb_src = false;
|
static bool batt_src = false;
|
||||||
|
|
||||||
void regulator_5v_enable(u8 dev)
|
void regulator_5v_enable(u8 dev)
|
||||||
{
|
{
|
||||||
// The power supply selection from battery or USB is automatic.
|
// The power supply selection from battery or USB is automatic.
|
||||||
if (!reg_5v_dev)
|
if (!reg_5v_dev)
|
||||||
{
|
{
|
||||||
// Fan and Rail power from battery 5V regulator.
|
// Fan and Rail power from internal 5V regulator (battery).
|
||||||
PINMUX_AUX(PINMUX_AUX_SATA_LED_ACTIVE) = 1;
|
PINMUX_AUX(PINMUX_AUX_SATA_LED_ACTIVE) = 1;
|
||||||
gpio_config(GPIO_PORT_A, GPIO_PIN_5, GPIO_MODE_GPIO);
|
gpio_config(GPIO_PORT_A, GPIO_PIN_5, GPIO_MODE_GPIO);
|
||||||
gpio_output_enable(GPIO_PORT_A, GPIO_PIN_5, GPIO_OUTPUT_ENABLE);
|
gpio_output_enable(GPIO_PORT_A, GPIO_PIN_5, GPIO_OUTPUT_ENABLE);
|
||||||
gpio_write(GPIO_PORT_A, GPIO_PIN_5, GPIO_HIGH);
|
gpio_write(GPIO_PORT_A, GPIO_PIN_5, GPIO_HIGH);
|
||||||
|
batt_src = true;
|
||||||
|
|
||||||
// Only Icosa and Iowa have USB 5V VBUS rails. Skip on Hoag/Aula.
|
// Fan and Rail power from USB 5V VDD.
|
||||||
u32 hw_type = fuse_read_hw_type();
|
PINMUX_AUX(PINMUX_AUX_USB_VBUS_EN0) = PINMUX_LPDR | 1;
|
||||||
if (hw_type == FUSE_NX_HW_TYPE_ICOSA ||
|
gpio_config(GPIO_PORT_CC, GPIO_PIN_4, GPIO_MODE_GPIO);
|
||||||
hw_type == FUSE_NX_HW_TYPE_IOWA)
|
gpio_output_enable(GPIO_PORT_CC, GPIO_PIN_4, GPIO_OUTPUT_ENABLE);
|
||||||
{
|
gpio_write(GPIO_PORT_CC, GPIO_PIN_4, GPIO_HIGH);
|
||||||
// Fan and Rail power from USB 5V VBUS.
|
|
||||||
PINMUX_AUX(PINMUX_AUX_USB_VBUS_EN0) = PINMUX_LPDR | 1;
|
|
||||||
gpio_config(GPIO_PORT_CC, GPIO_PIN_4, GPIO_MODE_GPIO);
|
|
||||||
gpio_output_enable(GPIO_PORT_CC, GPIO_PIN_4, GPIO_OUTPUT_ENABLE);
|
|
||||||
gpio_write(GPIO_PORT_CC, GPIO_PIN_4, GPIO_LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable GPIO AO IO rail for T210.
|
// Make sure GPIO power is enabled.
|
||||||
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210)
|
PMC(APBDEV_PMC_NO_IOPOWER) &= ~PMC_NO_IOPOWER_GPIO_IO_EN;
|
||||||
{
|
// Override power detect for GPIO AO IO rails.
|
||||||
// Make sure GPIO power is enabled.
|
PMC(APBDEV_PMC_PWR_DET_VAL) &= ~PMC_PWR_DET_GPIO_IO_EN;
|
||||||
PMC(APBDEV_PMC_NO_IOPOWER) &= ~PMC_NO_IOPOWER_GPIO_IO_EN;
|
|
||||||
(void)PMC(APBDEV_PMC_NO_IOPOWER); // Commit write.
|
|
||||||
|
|
||||||
// Override power detect for GPIO AO IO rails.
|
|
||||||
PMC(APBDEV_PMC_PWR_DET_VAL) &= ~PMC_PWR_DET_GPIO_IO_EN;
|
|
||||||
(void)PMC(APBDEV_PMC_PWR_DET_VAL); // Commit write.
|
|
||||||
}
|
|
||||||
usb_src = false;
|
|
||||||
}
|
}
|
||||||
reg_5v_dev |= dev;
|
reg_5v_dev |= dev;
|
||||||
}
|
}
|
||||||
@@ -70,32 +55,21 @@ void regulator_5v_disable(u8 dev)
|
|||||||
|
|
||||||
if (!reg_5v_dev)
|
if (!reg_5v_dev)
|
||||||
{
|
{
|
||||||
// Rail power from battery 5V regulator.
|
// Rail power from internal 5V regulator (battery).
|
||||||
gpio_write(GPIO_PORT_A, GPIO_PIN_5, GPIO_LOW);
|
gpio_write(GPIO_PORT_A, GPIO_PIN_5, GPIO_LOW);
|
||||||
gpio_output_enable(GPIO_PORT_A, GPIO_PIN_5, GPIO_OUTPUT_DISABLE);
|
gpio_output_enable(GPIO_PORT_A, GPIO_PIN_5, GPIO_OUTPUT_DISABLE);
|
||||||
gpio_config(GPIO_PORT_A, GPIO_PIN_5, GPIO_MODE_SPIO);
|
gpio_config(GPIO_PORT_A, GPIO_PIN_5, GPIO_MODE_SPIO);
|
||||||
PINMUX_AUX(PINMUX_AUX_SATA_LED_ACTIVE) = PINMUX_PARKED | PINMUX_INPUT_ENABLE;
|
PINMUX_AUX(PINMUX_AUX_SATA_LED_ACTIVE) = PINMUX_PARKED | PINMUX_INPUT_ENABLE;
|
||||||
|
batt_src = false;
|
||||||
|
|
||||||
// Only Icosa and Iowa have USB 5V VBUS rails. Skip on Hoag/Aula.
|
// Rail power from USB 5V VDD.
|
||||||
u32 hw_type = fuse_read_hw_type();
|
gpio_write(GPIO_PORT_CC, GPIO_PIN_4, GPIO_LOW);
|
||||||
if (hw_type == FUSE_NX_HW_TYPE_ICOSA ||
|
gpio_output_enable(GPIO_PORT_CC, GPIO_PIN_4, GPIO_OUTPUT_DISABLE);
|
||||||
hw_type == FUSE_NX_HW_TYPE_IOWA)
|
gpio_config(GPIO_PORT_CC, GPIO_PIN_4, GPIO_MODE_SPIO);
|
||||||
{
|
PINMUX_AUX(PINMUX_AUX_USB_VBUS_EN0) = PINMUX_IO_HV | PINMUX_LPDR | PINMUX_PARKED | PINMUX_INPUT_ENABLE;
|
||||||
// Rail power from USB 5V VBUS.
|
|
||||||
gpio_write(GPIO_PORT_CC, GPIO_PIN_4, GPIO_LOW);
|
|
||||||
gpio_output_enable(GPIO_PORT_CC, GPIO_PIN_4, GPIO_OUTPUT_DISABLE);
|
|
||||||
gpio_config(GPIO_PORT_CC, GPIO_PIN_4, GPIO_MODE_SPIO);
|
|
||||||
PINMUX_AUX(PINMUX_AUX_USB_VBUS_EN0) = PINMUX_IO_HV | PINMUX_LPDR | PINMUX_PARKED | PINMUX_INPUT_ENABLE;
|
|
||||||
usb_src = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// GPIO AO IO rails.
|
// GPIO AO IO rails.
|
||||||
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210)
|
PMC(APBDEV_PMC_PWR_DET_VAL) |= PMC_PWR_DET_GPIO_IO_EN;
|
||||||
{
|
|
||||||
PMC(APBDEV_PMC_PWR_DET_VAL) |= PMC_PWR_DET_GPIO_IO_EN;
|
|
||||||
(void)PMC(APBDEV_PMC_PWR_DET_VAL); // Commit write.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,22 +78,10 @@ bool regulator_5v_get_dev_enabled(u8 dev)
|
|||||||
return (reg_5v_dev & dev);
|
return (reg_5v_dev & dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void regulator_5v_usb_src_enable(bool enable)
|
void regulator_5v_batt_src_enable(bool enable)
|
||||||
{
|
{
|
||||||
// Only for Icosa/Iowa. Skip on Hoag/Aula.
|
if (enable && !batt_src)
|
||||||
u32 hw_type = fuse_read_hw_type();
|
gpio_write(GPIO_PORT_A, GPIO_PIN_5, GPIO_HIGH);
|
||||||
if (hw_type != FUSE_NX_HW_TYPE_ICOSA &&
|
else if (!enable && batt_src)
|
||||||
hw_type != FUSE_NX_HW_TYPE_IOWA)
|
gpio_write(GPIO_PORT_A, GPIO_PIN_5, GPIO_LOW);
|
||||||
return;
|
|
||||||
|
|
||||||
if (enable && !usb_src)
|
|
||||||
{
|
|
||||||
gpio_write(GPIO_PORT_CC, GPIO_PIN_4, GPIO_HIGH);
|
|
||||||
usb_src = true;
|
|
||||||
}
|
|
||||||
else if (!enable && usb_src)
|
|
||||||
{
|
|
||||||
gpio_write(GPIO_PORT_CC, GPIO_PIN_4, GPIO_LOW);
|
|
||||||
usb_src = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,6 @@ enum
|
|||||||
void regulator_5v_enable(u8 dev);
|
void regulator_5v_enable(u8 dev);
|
||||||
void regulator_5v_disable(u8 dev);
|
void regulator_5v_disable(u8 dev);
|
||||||
bool regulator_5v_get_dev_enabled(u8 dev);
|
bool regulator_5v_get_dev_enabled(u8 dev);
|
||||||
void regulator_5v_usb_src_enable(bool enable);
|
void regulator_5v_batt_src_enable(bool enable);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
786
bdk/sec/se.c
786
bdk/sec/se.c
File diff suppressed because it is too large
Load Diff
66
bdk/sec/se.h
66
bdk/sec/se.h
@@ -1,48 +1,52 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2019-2022 CTCaer
|
*
|
||||||
*
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* under the terms and conditions of the GNU General Public License,
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* version 2, as published by the Free Software Foundation.
|
||||||
* version 2, as published by the Free Software Foundation.
|
*
|
||||||
*
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* more details.
|
||||||
* more details.
|
*
|
||||||
*
|
* You should have received a copy of the GNU General Public License
|
||||||
* You should have received a copy of the GNU General Public License
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*/
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _SE_H_
|
#ifndef _SE_H_
|
||||||
#define _SE_H_
|
#define _SE_H_
|
||||||
|
|
||||||
#include "se_t210.h"
|
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
void se_rsa_acc_ctrl(u32 rs, u32 flags);
|
void se_rsa_acc_ctrl(u32 rs, u32 flags);
|
||||||
|
void se_rsa_key_set(u32 ks, const void *mod, u32 mod_size, const void *exp, u32 exp_size);
|
||||||
|
void se_rsa_key_clear(u32 ks);
|
||||||
|
int se_rsa_exp_mod(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size);
|
||||||
void se_key_acc_ctrl(u32 ks, u32 flags);
|
void se_key_acc_ctrl(u32 ks, u32 flags);
|
||||||
u32 se_key_acc_ctrl_get(u32 ks);
|
u32 se_key_acc_ctrl_get(u32 ks);
|
||||||
void se_get_aes_keys(u8 *buf, u8 *keys, u32 keysize);
|
void se_aes_key_set(u32 ks, const void *key, u32 size);
|
||||||
void se_aes_key_set(u32 ks, void *key, u32 size);
|
void se_aes_iv_set(u32 ks, const void *iv);
|
||||||
void se_aes_iv_set(u32 ks, void *iv);
|
void se_aes_key_partial_set(u32 ks, u32 index, u32 data);
|
||||||
void se_aes_key_get(u32 ks, void *key, u32 size);
|
void se_aes_key_get(u32 ks, void *key, u32 size);
|
||||||
void se_aes_key_clear(u32 ks);
|
void se_aes_key_clear(u32 ks);
|
||||||
void se_aes_iv_clear(u32 ks);
|
void se_aes_iv_clear(u32 ks);
|
||||||
int se_aes_unwrap_key(u32 ks_dst, u32 ks_src, const void *input);
|
int se_initialize_rng();
|
||||||
int se_aes_crypt_cbc(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size);
|
int se_generate_random(void *dst, u32 size);
|
||||||
int se_aes_crypt_ecb(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size);
|
int se_generate_random_key(u32 ks_dst, u32 ks_src);
|
||||||
int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src);
|
int se_aes_unwrap_key(u32 ks_dst, u32 ks_src, const void *input);
|
||||||
int se_aes_xts_crypt_sec(u32 tweak_ks, u32 crypt_ks, u32 enc, u64 sec, void *dst, void *src, u32 secsize);
|
int se_aes_crypt_ecb(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size);
|
||||||
int se_aes_xts_crypt_sec_nx(u32 tweak_ks, u32 crypt_ks, u32 enc, u64 sec, u8 *tweak, bool regen_tweak, u32 tweak_exp, void *dst, void *src, u32 sec_size);
|
int se_aes_crypt_block_ecb(u32 ks, u32 enc, void *dst, const void *src);
|
||||||
int se_aes_xts_crypt(u32 tweak_ks, u32 crypt_ks, u32 enc, u64 sec, void *dst, void *src, u32 secsize, u32 num_secs);
|
int se_aes_crypt_ctr(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size, void *ctr);
|
||||||
int se_aes_crypt_ctr(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size, void *ctr);
|
int se_aes_crypt_cbc(u32 ks, u32 enc, void *dst, u32 dst_size, const void *src, u32 src_size);
|
||||||
int se_calc_sha256(void *hash, u32 *msg_left, const void *src, u32 src_size, u64 total_size, u32 sha_cfg, bool is_oneshot);
|
int se_aes_xts_crypt_sec(u32 tweak_ks, u32 crypt_ks, u32 enc, u64 sec, void *dst, const void *src, u32 sec_size);
|
||||||
int se_calc_sha256_oneshot(void *hash, const void *src, u32 src_size);
|
int se_aes_xts_crypt(u32 tweak_ks, u32 crypt_ks, u32 enc, u64 sec, void *dst, const void *src, u32 sec_size, u32 num_secs);
|
||||||
int se_calc_sha256_finalize(void *hash, u32 *msg_left);
|
|
||||||
int se_gen_prng128(void *dst);
|
|
||||||
int se_aes_cmac(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size);
|
int se_aes_cmac(u32 ks, void *dst, u32 dst_size, const void *src, u32 src_size);
|
||||||
|
int se_calc_sha256(void *hash, u32 *msg_left, const void *src, u32 src_size, u64 total_size, u32 sha_cfg, bool is_oneshot);
|
||||||
|
int se_calc_sha256_oneshot(void *hash, const void *src, u32 src_size);
|
||||||
|
int se_calc_sha256_finalize(void *hash, u32 *msg_left);
|
||||||
int se_calc_hmac_sha256(void *dst, const void *src, u32 src_size, const void *key, u32 key_size);
|
int se_calc_hmac_sha256(void *dst, const void *src, u32 src_size, const void *key, u32 key_size);
|
||||||
|
u32 se_rsa_oaep_decode(void *dst, u32 dst_size, const void *label_digest, u32 label_digest_size, u8 *buf, u32 buf_size);
|
||||||
|
void se_get_aes_keys(u8 *buf, u8 *keys, u32 keysize);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,328 +1,400 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Driver for Tegra Security Engine
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
*
|
||||||
*
|
* Copyright (c) 2011-2013, NVIDIA Corporation. All Rights Reserved.
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
*
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* version 2, as published by the Free Software Foundation.
|
* it under the terms of the GNU General Public License as published by
|
||||||
*
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* (at your option) any later version.
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
*
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
* more details.
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
*
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* You should have received a copy of the GNU General Public License
|
* more details.
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*
|
||||||
*/
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef _SE_T210_H
|
#ifndef _CRYPTO_TEGRA_SE_H
|
||||||
#define _SE_T210_H
|
#define _CRYPTO_TEGRA_SE_H
|
||||||
|
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
#define SE_CRYPTO_QUEUE_LENGTH 50
|
#define TEGRA_SE_CRA_PRIORITY 300
|
||||||
#define SE_MAX_SRC_SG_COUNT 50
|
#define TEGRA_SE_COMPOSITE_PRIORITY 400
|
||||||
#define SE_MAX_DST_SG_COUNT 50
|
#define TEGRA_SE_CRYPTO_QUEUE_LENGTH 50
|
||||||
|
#define SE_MAX_SRC_SG_COUNT 50
|
||||||
|
#define SE_MAX_DST_SG_COUNT 50
|
||||||
|
|
||||||
#define SE_AES_KEYSLOT_COUNT 16
|
#define TEGRA_SE_KEYSLOT_COUNT 16
|
||||||
#define SE_RSA_KEYSLOT_COUNT 2
|
#define SE_MAX_LAST_BLOCK_SIZE 0xFFFFF
|
||||||
#define SE_MAX_LAST_BLOCK_SIZE 0xFFFFF
|
|
||||||
|
|
||||||
#define SE_AES_BLOCK_SIZE 16
|
|
||||||
#define SE_AES_IV_SIZE 16
|
|
||||||
#define SE_AES_MIN_KEY_SIZE 16
|
|
||||||
#define SE_AES_MAX_KEY_SIZE 32
|
|
||||||
#define SE_KEY_128_SIZE 16
|
|
||||||
#define SE_KEY_192_SIZE 24
|
|
||||||
#define SE_KEY_256_SIZE 32
|
|
||||||
#define SE_SHA_192_SIZE 24
|
|
||||||
#define SE_SHA_256_SIZE 32
|
|
||||||
#define SE_SHA_384_SIZE 48
|
|
||||||
#define SE_SHA_512_SIZE 64
|
|
||||||
#define SE_RNG_IV_SIZE 16
|
|
||||||
#define SE_RNG_DT_SIZE 16
|
|
||||||
#define SE_RNG_KEY_SIZE 16
|
|
||||||
#define SE_RNG_SEED_SIZE (SE_RNG_IV_SIZE + SE_RNG_KEY_SIZE + SE_RNG_DT_SIZE)
|
|
||||||
|
|
||||||
#define SE_AES_CMAC_DIGEST_SIZE 16
|
|
||||||
#define SE_RSA512_DIGEST_SIZE 64
|
|
||||||
#define SE_RSA1024_DIGEST_SIZE 128
|
|
||||||
#define SE_RSA1536_DIGEST_SIZE 192
|
|
||||||
#define SE_RSA2048_DIGEST_SIZE 256
|
|
||||||
|
|
||||||
#define DECRYPT 0
|
|
||||||
#define ENCRYPT 1
|
|
||||||
|
|
||||||
/* SE register definitions */
|
/* SE register definitions */
|
||||||
#define SE_SE_SECURITY_REG 0x000
|
#define SE_SECURITY_0 0x000
|
||||||
#define SE_HARD_SETTING BIT(0)
|
#define SE_KEY_SCHED_READ_SHIFT 3
|
||||||
#define SE_ENG_DIS BIT(1)
|
|
||||||
#define SE_PERKEY_SETTING BIT(2)
|
|
||||||
#define SE_SOFT_SETTING BIT(16)
|
|
||||||
|
|
||||||
#define SE_TZRAM_SECURITY_REG 0x004
|
#define SE_TZRAM_SECURITY_0 0x004
|
||||||
#define SE_TZRAM_HARD_SETTING BIT(0)
|
|
||||||
#define SE_TZRAM_ENG_DIS BIT(1)
|
|
||||||
|
|
||||||
#define SE_OPERATION_REG 0x008
|
#define SE_CONFIG_REG_OFFSET 0x014
|
||||||
#define SE_OP_ABORT 0
|
#define SE_CONFIG_ENC_ALG_SHIFT 12
|
||||||
#define SE_OP_START 1
|
#define SE_CONFIG_DEC_ALG_SHIFT 8
|
||||||
#define SE_OP_RESTART_OUT 2
|
#define ALG_AES_ENC 1
|
||||||
#define SE_OP_CTX_SAVE 3
|
#define ALG_RNG 2
|
||||||
#define SE_OP_RESTART_IN 4
|
#define ALG_SHA 3
|
||||||
|
#define ALG_RSA 4
|
||||||
|
#define ALG_NOP 0
|
||||||
|
#define ALG_AES_DEC 1
|
||||||
|
#define SE_CONFIG_ENC_ALG(x) ((x) << SE_CONFIG_ENC_ALG_SHIFT)
|
||||||
|
#define SE_CONFIG_DEC_ALG(x) ((x) << SE_CONFIG_DEC_ALG_SHIFT)
|
||||||
|
#define SE_CONFIG_DST_SHIFT 2
|
||||||
|
#define DST_MEMORY 0
|
||||||
|
#define DST_HASHREG 1
|
||||||
|
#define DST_KEYTAB 2
|
||||||
|
#define DST_SRK 3
|
||||||
|
#define DST_RSAREG 4
|
||||||
|
#define SE_CONFIG_DST(x) ((x) << SE_CONFIG_DST_SHIFT)
|
||||||
|
#define SE_CONFIG_ENC_MODE_SHIFT 24
|
||||||
|
#define SE_CONFIG_DEC_MODE_SHIFT 16
|
||||||
|
#define MODE_KEY128 0
|
||||||
|
#define MODE_KEY192 1
|
||||||
|
#define MODE_KEY256 2
|
||||||
|
#define MODE_SHA1 0
|
||||||
|
#define MODE_SHA224 4
|
||||||
|
#define MODE_SHA256 5
|
||||||
|
#define MODE_SHA384 6
|
||||||
|
#define MODE_SHA512 7
|
||||||
|
#define SE_CONFIG_ENC_MODE(x) ((x) << SE_CONFIG_ENC_MODE_SHIFT)
|
||||||
|
#define SE_CONFIG_DEC_MODE(x) ((x) << SE_CONFIG_DEC_MODE_SHIFT)
|
||||||
|
|
||||||
#define SE_INT_ENABLE_REG 0x00C
|
#define SE_RNG_CONFIG_REG_OFFSET 0x340
|
||||||
#define SE_INT_STATUS_REG 0x010
|
#define RNG_MODE_SHIFT 0
|
||||||
#define SE_INT_IN_LL_BUF_RD BIT(0)
|
#define RNG_MODE_NORMAL 0
|
||||||
#define SE_INT_IN_DONE BIT(1)
|
#define RNG_MODE_FORCE_INSTANTION 1
|
||||||
#define SE_INT_OUT_LL_BUF_WR BIT(2)
|
#define RNG_MODE_FORCE_RESEED 2
|
||||||
#define SE_INT_OUT_DONE BIT(3)
|
#define SE_RNG_CONFIG_MODE(x) ((x) << RNG_MODE_SHIFT)
|
||||||
#define SE_INT_OP_DONE BIT(4)
|
#define RNG_SRC_SHIFT 2
|
||||||
#define SE_INT_RESEED_NEEDED BIT(5)
|
#define RNG_SRC_NONE 0
|
||||||
#define SE_INT_ERR_STAT BIT(16)
|
#define RNG_SRC_ENTROPY 1
|
||||||
|
#define RNG_SRC_LFSR 2
|
||||||
|
#define SE_RNG_CONFIG_SRC(x) ((x) << RNG_SRC_SHIFT)
|
||||||
|
|
||||||
#define SE_CONFIG_REG 0x014
|
#define SE_RNG_SRC_CONFIG_REG_OFFSET 0x344
|
||||||
#define DST_MEMORY 0
|
#define RNG_SRC_RO_ENT_SHIFT 1
|
||||||
#define DST_HASHREG 1
|
#define RNG_SRC_RO_ENT_ENABLE 1
|
||||||
#define DST_KEYTABLE 2
|
#define RNG_SRC_RO_ENT_DISABLE 0
|
||||||
#define DST_SRK 3
|
#define SE_RNG_SRC_CONFIG_ENT_SRC(x) ((x) << RNG_SRC_RO_ENT_SHIFT)
|
||||||
#define DST_RSAREG 4
|
#define RNG_SRC_RO_ENT_LOCK_SHIFT 0
|
||||||
#define SE_CONFIG_DST(x) ((x) << 2)
|
#define RNG_SRC_RO_ENT_LOCK_ENABLE 1
|
||||||
#define ALG_NOP 0
|
#define RNG_SRC_RO_ENT_LOCK_DISABLE 0
|
||||||
#define ALG_AES_DEC 1
|
#define SE_RNG_SRC_CONFIG_ENT_SRC_LOCK(x) ((x) << RNG_SRC_RO_ENT_LOCK_SHIFT)
|
||||||
#define SE_CONFIG_DEC_ALG(x) ((x) << 8)
|
|
||||||
#define ALG_NOP 0
|
|
||||||
#define ALG_AES_ENC 1
|
|
||||||
#define ALG_RNG 2
|
|
||||||
#define ALG_SHA 3
|
|
||||||
#define ALG_RSA 4
|
|
||||||
#define SE_CONFIG_ENC_ALG(x) ((x) << 12)
|
|
||||||
#define MODE_KEY128 0
|
|
||||||
#define MODE_KEY192 1
|
|
||||||
#define MODE_KEY256 2
|
|
||||||
#define MODE_SHA1 0
|
|
||||||
#define MODE_SHA224 4
|
|
||||||
#define MODE_SHA256 5
|
|
||||||
#define MODE_SHA384 6
|
|
||||||
#define MODE_SHA512 7
|
|
||||||
#define SE_CONFIG_DEC_MODE(x) ((x) << 16)
|
|
||||||
#define SE_CONFIG_ENC_MODE(x) ((x) << 24)
|
|
||||||
|
|
||||||
#define SE_IN_LL_ADDR_REG 0x018
|
#define SE_RNG_RESEED_INTERVAL_REG_OFFSET 0x348
|
||||||
#define SE_IN_CUR_BYTE_ADDR_REG 0x01C
|
|
||||||
#define SE_IN_CUR_LL_ID_REG 0x020
|
|
||||||
#define SE_OUT_LL_ADDR_REG 0x024
|
|
||||||
#define SE_OUT_CUR_BYTE_ADDR_REG 0x028
|
|
||||||
#define SE_OUT_CUR_LL_ID_REG 0x02C
|
|
||||||
|
|
||||||
#define SE_HASH_RESULT_REG 0x030
|
#define SE_KEYTABLE_REG_OFFSET 0x31c
|
||||||
#define SE_HASH_RESULT_REG_COUNT 16
|
#define SE_KEYTABLE_SLOT_SHIFT 4
|
||||||
|
#define SE_KEYTABLE_SLOT(x) ((x) << SE_KEYTABLE_SLOT_SHIFT)
|
||||||
|
#define SE_KEYTABLE_QUAD_SHIFT 2
|
||||||
|
#define QUAD_KEYS_128 0
|
||||||
|
#define QUAD_KEYS_192 1
|
||||||
|
#define QUAD_KEYS_256 1
|
||||||
|
#define QUAD_ORG_IV 2
|
||||||
|
#define QUAD_UPDTD_IV 3
|
||||||
|
#define SE_KEYTABLE_QUAD(x) ((x) << SE_KEYTABLE_QUAD_SHIFT)
|
||||||
|
#define SE_KEYTABLE_OP_TYPE_SHIFT 9
|
||||||
|
#define OP_READ 0
|
||||||
|
#define OP_WRITE 1
|
||||||
|
#define SE_KEYTABLE_OP_TYPE(x) ((x) << SE_KEYTABLE_OP_TYPE_SHIFT)
|
||||||
|
#define SE_KEYTABLE_TABLE_SEL_SHIFT 8
|
||||||
|
#define TABLE_KEYIV 0
|
||||||
|
#define TABLE_SCHEDULE 1
|
||||||
|
#define SE_KEYTABLE_TABLE_SEL(x) ((x) << SE_KEYTABLE_TABLE_SEL_SHIFT)
|
||||||
|
#define SE_KEYTABLE_PKT_SHIFT 0
|
||||||
|
#define SE_KEYTABLE_PKT(x) ((x) << SE_KEYTABLE_PKT_SHIFT)
|
||||||
|
|
||||||
#define SE_CONTEXT_SAVE_CONFIG_REG 0x070
|
#define SE_OP_DONE_SHIFT 4
|
||||||
#define KEYS_0_3 0
|
#define OP_DONE 1
|
||||||
#define KEYS_4_7 1
|
#define SE_OP_DONE(x, y) ((x) && ((y) << SE_OP_DONE_SHIFT))
|
||||||
#define ORIGINAL_IV 2
|
|
||||||
#define UPDATED_IV 3
|
|
||||||
#define SE_CONTEXT_AES_WORD_QUAD(x) ((x) << 0)
|
|
||||||
#define SE_CONTEXT_AES_KEY_INDEX(x) ((x) << 8)
|
|
||||||
#define KEYS_0_3 0
|
|
||||||
#define KEYS_4_7 1
|
|
||||||
#define KEYS_8_11 2
|
|
||||||
#define KEYS_12_15 3
|
|
||||||
#define SE_CONTEXT_RSA_WORD_QUAD(x) ((x) << 12)
|
|
||||||
#define SLOT0_EXPONENT 0
|
|
||||||
#define SLOT0_MODULUS 1
|
|
||||||
#define SLOT1_EXPONENT 2
|
|
||||||
#define SLOT1_MODULUS 3
|
|
||||||
#define SE_CONTEXT_RSA_KEY_INDEX(x) ((x) << 16)
|
|
||||||
#define STICKY_0_3 0
|
|
||||||
#define STICKY_4_7 1
|
|
||||||
#define SE_CONTEXT_STICKY_WORD_QUAD(x) ((x) << 24)
|
|
||||||
#define STICKY_BITS 0
|
|
||||||
#define RSA_KEYTABLE 1
|
|
||||||
#define AES_KEYTABLE 2
|
|
||||||
#define MEM 4
|
|
||||||
#define SRK 6
|
|
||||||
#define SE_CONTEXT_SRC(x) ((x) << 29)
|
|
||||||
|
|
||||||
#define SE_CTX_SAVE_AUTO_T210B01_REG 0x074
|
#define SE_CRYPTO_LAST_BLOCK 0x080
|
||||||
#define SE_CTX_SAVE_AUTO_ENABLE BIT(0)
|
|
||||||
#define SE_CTX_SAVE_AUTO_LOCK BIT(8)
|
|
||||||
#define SE_CTX_SAVE_AUTO_CURR_CNT_MASK (0x3FF << 16)
|
|
||||||
|
|
||||||
#define SE_CRYPTO_LAST_BLOCK 0x080
|
#define SE_CRYPTO_REG_OFFSET 0x304
|
||||||
|
#define SE_CRYPTO_HASH_SHIFT 0
|
||||||
|
#define HASH_DISABLE 0
|
||||||
|
#define HASH_ENABLE 1
|
||||||
|
#define SE_CRYPTO_HASH(x) ((x) << SE_CRYPTO_HASH_SHIFT)
|
||||||
|
#define SE_CRYPTO_XOR_POS_SHIFT 1
|
||||||
|
#define XOR_BYPASS 0
|
||||||
|
#define XOR_TOP 2
|
||||||
|
#define XOR_BOTTOM 3
|
||||||
|
#define SE_CRYPTO_XOR_POS(x) ((x) << SE_CRYPTO_XOR_POS_SHIFT)
|
||||||
|
#define SE_CRYPTO_INPUT_SEL_SHIFT 3
|
||||||
|
#define INPUT_AHB 0
|
||||||
|
#define INPUT_RANDOM 1
|
||||||
|
#define INPUT_AESOUT 2
|
||||||
|
#define INPUT_LNR_CTR 3
|
||||||
|
#define SE_CRYPTO_INPUT_SEL(x) ((x) << SE_CRYPTO_INPUT_SEL_SHIFT)
|
||||||
|
#define SE_CRYPTO_VCTRAM_SEL_SHIFT 5
|
||||||
|
#define VCTRAM_AHB 0
|
||||||
|
#define VCTRAM_AESOUT 2
|
||||||
|
#define VCTRAM_PREVAHB 3
|
||||||
|
#define SE_CRYPTO_VCTRAM_SEL(x) ((x) << SE_CRYPTO_VCTRAM_SEL_SHIFT)
|
||||||
|
#define SE_CRYPTO_IV_SEL_SHIFT 7
|
||||||
|
#define IV_ORIGINAL 0
|
||||||
|
#define IV_UPDATED 1
|
||||||
|
#define SE_CRYPTO_IV_SEL(x) ((x) << SE_CRYPTO_IV_SEL_SHIFT)
|
||||||
|
#define SE_CRYPTO_CORE_SEL_SHIFT 8
|
||||||
|
#define CORE_DECRYPT 0
|
||||||
|
#define CORE_ENCRYPT 1
|
||||||
|
#define SE_CRYPTO_CORE_SEL(x) ((x) << SE_CRYPTO_CORE_SEL_SHIFT)
|
||||||
|
#define SE_CRYPTO_CTR_VAL_SHIFT 11
|
||||||
|
#define SE_CRYPTO_CTR_VAL(x) ((x) << SE_CRYPTO_CTR_VAL_SHIFT)
|
||||||
|
#define SE_CRYPTO_KEY_INDEX_SHIFT 24
|
||||||
|
#define SE_CRYPTO_KEY_INDEX(x) ((x) << SE_CRYPTO_KEY_INDEX_SHIFT)
|
||||||
|
#define SE_CRYPTO_CTR_CNTN_SHIFT 11
|
||||||
|
#define SE_CRYPTO_CTR_CNTN(x) ((x) << SE_CRYPTO_CTR_CNTN_SHIFT)
|
||||||
|
|
||||||
#define SE_SHA_CONFIG_REG 0x200
|
#define SE_CRYPTO_CTR_REG_COUNT 4
|
||||||
|
#define SE_CRYPTO_CTR_REG_OFFSET 0x308
|
||||||
|
|
||||||
|
#define SE_OPERATION_REG_OFFSET 0x008
|
||||||
|
#define SE_OPERATION_SHIFT 0
|
||||||
|
#define OP_ABORT 0
|
||||||
|
#define OP_START 1
|
||||||
|
#define OP_RESTART 2
|
||||||
|
#define OP_CTX_SAVE 3
|
||||||
|
#define OP_RESTART_IN 4
|
||||||
|
#define SE_OPERATION(x) ((x) << SE_OPERATION_SHIFT)
|
||||||
|
|
||||||
|
#define SE_CONTEXT_SAVE_CONFIG_REG_OFFSET 0x070
|
||||||
|
#define SE_CONTEXT_SAVE_WORD_QUAD_SHIFT 0
|
||||||
|
#define KEYS_0_3 0
|
||||||
|
#define KEYS_4_7 1
|
||||||
|
#define ORIG_IV 2
|
||||||
|
#define UPD_IV 3
|
||||||
|
#define SE_CONTEXT_SAVE_WORD_QUAD(x) ((x) << SE_CONTEXT_SAVE_WORD_QUAD_SHIFT)
|
||||||
|
|
||||||
|
#define SE_CONTEXT_SAVE_KEY_INDEX_SHIFT 8
|
||||||
|
#define SE_CONTEXT_SAVE_KEY_INDEX(x) ((x) << SE_CONTEXT_SAVE_KEY_INDEX_SHIFT)
|
||||||
|
|
||||||
|
#define SE_CONTEXT_SAVE_STICKY_WORD_QUAD_SHIFT 24
|
||||||
|
#define STICKY_0_3 0
|
||||||
|
#define STICKY_4_7 1
|
||||||
|
#define SE_CONTEXT_SAVE_STICKY_WORD_QUAD(x) \
|
||||||
|
((x) << SE_CONTEXT_SAVE_STICKY_WORD_QUAD_SHIFT)
|
||||||
|
|
||||||
|
#define SE_CONTEXT_SAVE_SRC_SHIFT 29
|
||||||
|
#define STICKY_BITS 0
|
||||||
|
#define KEYTABLE 2
|
||||||
|
#define MEM 4
|
||||||
|
#define SRK 6
|
||||||
|
|
||||||
|
#define RSA_KEYTABLE 1
|
||||||
|
#define AES_KEYTABLE 2
|
||||||
|
#define SE_CONTEXT_SAVE_SRC(x) ((x) << SE_CONTEXT_SAVE_SRC_SHIFT)
|
||||||
|
|
||||||
|
#define SE_CONTEXT_SAVE_RSA_KEY_INDEX_SHIFT 16
|
||||||
|
#define SE_CONTEXT_SAVE_RSA_KEY_INDEX(x) \
|
||||||
|
((x) << SE_CONTEXT_SAVE_RSA_KEY_INDEX_SHIFT)
|
||||||
|
|
||||||
|
#define SE_CONTEXT_RSA_WORD_QUAD_SHIFT 12
|
||||||
|
#define SE_CONTEXT_RSA_WORD_QUAD(x) \
|
||||||
|
((x) << SE_CONTEXT_RSA_WORD_QUAD_SHIFT)
|
||||||
|
|
||||||
|
#define SE_CTX_SAVE_AUTO 0x074
|
||||||
|
#define CTX_SAVE_AUTO_ENABLE BIT(0)
|
||||||
|
#define CTX_SAVE_AUTO_LOCK BIT(8)
|
||||||
|
#define CTX_SAVE_AUTO_CURR_CNT_MASK (0x3FF << 16)
|
||||||
|
|
||||||
|
#define SE_INT_ENABLE_REG_OFFSET 0x00c
|
||||||
|
#define SE_INT_STATUS_REG_OFFSET 0x010
|
||||||
|
#define INT_DISABLE 0
|
||||||
|
#define INT_ENABLE 1
|
||||||
|
#define INT_UNSET 0
|
||||||
|
#define INT_SET 1
|
||||||
|
#define SE_INT_OP_DONE_SHIFT 4
|
||||||
|
#define SE_INT_OP_DONE(x) ((x) << SE_INT_OP_DONE_SHIFT)
|
||||||
|
#define SE_INT_ERROR_SHIFT 16
|
||||||
|
#define SE_INT_ERROR(x) ((x) << SE_INT_ERROR_SHIFT)
|
||||||
|
|
||||||
|
#define SE_STATUS_0 0x800
|
||||||
|
#define SE_STATUS_0_STATE_WAIT_IN 3
|
||||||
|
|
||||||
|
#define SE_ERR_STATUS_0 0x804
|
||||||
|
#define SE_ERR_STATUS_0_SE_NS_ACCESS_CLEAR 0
|
||||||
|
|
||||||
|
#define SE_CRYPTO_KEYTABLE_DST_REG_OFFSET 0X330
|
||||||
|
#define SE_CRYPTO_KEYTABLE_DST_WORD_QUAD_SHIFT 0
|
||||||
|
#define SE_CRYPTO_KEYTABLE_DST_WORD_QUAD(x) \
|
||||||
|
((x) << SE_CRYPTO_KEYTABLE_DST_WORD_QUAD_SHIFT)
|
||||||
|
|
||||||
|
#define SE_KEY_INDEX_SHIFT 8
|
||||||
|
#define SE_CRYPTO_KEYTABLE_DST_KEY_INDEX(x) ((x) << SE_KEY_INDEX_SHIFT)
|
||||||
|
|
||||||
|
#define SE_IN_LL_ADDR_REG_OFFSET 0x018
|
||||||
|
#define SE_OUT_LL_ADDR_REG_OFFSET 0x024
|
||||||
|
|
||||||
|
#define SE_KEYTABLE_DATA0_REG_OFFSET 0x320
|
||||||
|
#define SE_KEYTABLE_REG_MAX_DATA 16
|
||||||
|
|
||||||
|
#define SE_BLOCK_COUNT_REG_OFFSET 0x318
|
||||||
|
|
||||||
|
#define SE_SPARE_0_REG_OFFSET 0x80c
|
||||||
|
|
||||||
|
#define SE_SHA_CONFIG_REG_OFFSET 0x200
|
||||||
#define SHA_CONTINUE 0
|
#define SHA_CONTINUE 0
|
||||||
#define SHA_INIT_HASH 1
|
#define SHA_INIT_HASH 1
|
||||||
|
|
||||||
#define SE_SHA_MSG_LENGTH_0_REG 0x204
|
#define SE_SHA_MSG_LENGTH_0_REG_OFFSET 0x204
|
||||||
#define SE_SHA_MSG_LENGTH_1_REG 0x208
|
#define SE_SHA_MSG_LENGTH_1_REG_OFFSET 0x208
|
||||||
#define SE_SHA_MSG_LENGTH_2_REG 0x20C
|
#define SE_SHA_MSG_LENGTH_2_REG_OFFSET 0x20C
|
||||||
#define SE_SHA_MSG_LENGTH_3_REG 0x210
|
#define SE_SHA_MSG_LENGTH_3_REG_OFFSET 0x210
|
||||||
#define SE_SHA_MSG_LEFT_0_REG 0x214
|
#define SE_SHA_MSG_LEFT_0_REG_OFFSET 0x214
|
||||||
#define SE_SHA_MSG_LEFT_1_REG 0x218
|
#define SE_SHA_MSG_LEFT_1_REG_OFFSET 0x218
|
||||||
#define SE_SHA_MSG_LEFT_2_REG 0x21C
|
#define SE_SHA_MSG_LEFT_2_REG_OFFSET 0x21C
|
||||||
#define SE_SHA_MSG_LEFT_3_REG 0x220
|
#define SE_SHA_MSG_LEFT_3_REG_OFFSET 0x220
|
||||||
|
|
||||||
#define SE_CRYPTO_SECURITY_PERKEY_REG 0x280
|
#define SE_HASH_RESULT_REG_COUNT 16
|
||||||
#define SE_KEY_LOCK_FLAG 0x80
|
#define SE_HASH_RESULT_REG_OFFSET 0x030
|
||||||
#define SE_CRYPTO_KEYTABLE_ACCESS_REG 0x284
|
#define TEGRA_SE_KEY_256_SIZE 32
|
||||||
#define SE_CRYPTO_KEYTABLE_ACCESS_REG_COUNT 16
|
#define TEGRA_SE_KEY_192_SIZE 24
|
||||||
#define SE_KEY_TBL_DIS_KEYREAD_FLAG BIT(0)
|
#define TEGRA_SE_KEY_128_SIZE 16
|
||||||
#define SE_KEY_TBL_DIS_KEYUPDATE_FLAG BIT(1)
|
#define TEGRA_SE_AES_BLOCK_SIZE 16
|
||||||
#define SE_KEY_TBL_DIS_OIVREAD_FLAG BIT(2)
|
#define TEGRA_SE_AES_MIN_KEY_SIZE 16
|
||||||
#define SE_KEY_TBL_DIS_OIVUPDATE_FLAG BIT(3)
|
#define TEGRA_SE_AES_MAX_KEY_SIZE 32
|
||||||
#define SE_KEY_TBL_DIS_UIVREAD_FLAG BIT(4)
|
#define TEGRA_SE_AES_IV_SIZE 16
|
||||||
#define SE_KEY_TBL_DIS_UIVUPDATE_FLAG BIT(5)
|
#define TEGRA_SE_SHA_512_SIZE 64
|
||||||
#define SE_KEY_TBL_DIS_KEYUSE_FLAG BIT(6)
|
#define TEGRA_SE_SHA_384_SIZE 48
|
||||||
#define SE_KEY_TBL_DIS_KEY_ACCESS_FLAG 0x7F
|
#define TEGRA_SE_SHA_256_SIZE 32
|
||||||
|
#define TEGRA_SE_SHA_192_SIZE 24
|
||||||
|
#define TEGRA_SE_RNG_IV_SIZE 16
|
||||||
|
#define TEGRA_SE_RNG_DT_SIZE 16
|
||||||
|
#define TEGRA_SE_RNG_KEY_SIZE 16
|
||||||
|
#define TEGRA_SE_RNG_SEED_SIZE (TEGRA_SE_RNG_IV_SIZE + \
|
||||||
|
TEGRA_SE_RNG_KEY_SIZE + \
|
||||||
|
TEGRA_SE_RNG_DT_SIZE)
|
||||||
|
|
||||||
#define SE_CRYPTO_CONFIG_REG 0x304
|
#define TEGRA_SE_AES_CMAC_DIGEST_SIZE 16
|
||||||
#define HASH_DISABLE 0
|
#define TEGRA_SE_RSA512_DIGEST_SIZE 64
|
||||||
#define HASH_ENABLE 1
|
#define TEGRA_SE_RSA1024_DIGEST_SIZE 128
|
||||||
#define SE_CRYPTO_HASH(x) ((x) << 0)
|
#define TEGRA_SE_RSA1536_DIGEST_SIZE 192
|
||||||
#define XOR_BYPASS 0
|
#define TEGRA_SE_RSA2048_DIGEST_SIZE 256
|
||||||
#define XOR_TOP 2
|
|
||||||
#define XOR_BOTTOM 3
|
|
||||||
#define SE_CRYPTO_XOR_POS(x) ((x) << 1)
|
|
||||||
#define INPUT_MEMORY 0
|
|
||||||
#define INPUT_RANDOM 1
|
|
||||||
#define INPUT_AESOUT 2
|
|
||||||
#define INPUT_LNR_CTR 3
|
|
||||||
#define SE_CRYPTO_INPUT_SEL(x) ((x) << 3)
|
|
||||||
#define VCTRAM_MEM 0
|
|
||||||
#define VCTRAM_AESOUT 2
|
|
||||||
#define VCTRAM_PREVMEM 3
|
|
||||||
#define SE_CRYPTO_VCTRAM_SEL(x) ((x) << 5)
|
|
||||||
#define IV_ORIGINAL 0
|
|
||||||
#define IV_UPDATED 1
|
|
||||||
#define SE_CRYPTO_IV_SEL(x) ((x) << 7)
|
|
||||||
#define CORE_DECRYPT 0
|
|
||||||
#define CORE_ENCRYPT 1
|
|
||||||
#define SE_CRYPTO_CORE_SEL(x) ((x) << 8)
|
|
||||||
#define SE_CRYPTO_KEYSCH_BYPASS BIT(10)
|
|
||||||
#define SE_CRYPTO_CTR_CNTN(x) ((x) << 11)
|
|
||||||
#define SE_CRYPTO_KEY_INDEX(x) ((x) << 24)
|
|
||||||
#define MEMIF_AHB 0
|
|
||||||
#define MEMIF_MCCIF 1
|
|
||||||
#define SE_CRYPTO_MEMIF(x) ((x) << 31)
|
|
||||||
|
|
||||||
#define SE_CRYPTO_LINEAR_CTR_REG 0x308
|
#define SE_KEY_TABLE_ACCESS_LOCK_OFFSET 0x280
|
||||||
#define SE_CRYPTO_LINEAR_CTR_REG_COUNT 4
|
#define SE_KEY_TBL_DIS_KEY_LOCK_FLAG 0x80
|
||||||
|
|
||||||
#define SE_CRYPTO_BLOCK_COUNT_REG 0x318
|
#define SE_KEY_TABLE_ACCESS_REG_OFFSET 0x284
|
||||||
|
#define SE_KEY_TBL_DIS_KEYREAD_FLAG BIT(0)
|
||||||
|
#define SE_KEY_TBL_DIS_KEYUPDATE_FLAG BIT(1)
|
||||||
|
#define SE_KEY_TBL_DIS_OIVREAD_FLAG BIT(2)
|
||||||
|
#define SE_KEY_TBL_DIS_OIVUPDATE_FLAG BIT(3)
|
||||||
|
#define SE_KEY_TBL_DIS_UIVREAD_FLAG BIT(4)
|
||||||
|
#define SE_KEY_TBL_DIS_UIVUPDATE_FLAG BIT(5)
|
||||||
|
#define SE_KEY_TBL_DIS_KEYUSE_FLAG BIT(6)
|
||||||
|
#define SE_KEY_TBL_DIS_KEY_ACCESS_FLAG 0x7F
|
||||||
|
|
||||||
#define SE_CRYPTO_KEYTABLE_ADDR_REG 0x31C
|
#define SE_KEY_READ_DISABLE_SHIFT 0
|
||||||
#define SE_KEYTABLE_PKT(x) ((x) << 0)
|
#define SE_KEY_UPDATE_DISABLE_SHIFT 1
|
||||||
#define KEYS_0_3 0
|
|
||||||
#define KEYS_4_7 1
|
|
||||||
#define ORIGINAL_IV 2
|
|
||||||
#define UPDATED_IV 3
|
|
||||||
#define SE_KEYTABLE_QUAD(x) ((x) << 2)
|
|
||||||
#define SE_KEYTABLE_SLOT(x) ((x) << 4)
|
|
||||||
|
|
||||||
#define SE_CRYPTO_KEYTABLE_DATA_REG 0x320
|
#define SE_CONTEXT_BUFER_SIZE 1072
|
||||||
|
#define SE_CONTEXT_DRBG_BUFER_SIZE 2112
|
||||||
|
|
||||||
#define SE_CRYPTO_KEYTABLE_DST_REG 0x330
|
#define SE_CONTEXT_SAVE_RANDOM_DATA_OFFSET 0
|
||||||
#define KEYS_0_3 0
|
#define SE_CONTEXT_SAVE_RANDOM_DATA_SIZE 16
|
||||||
#define KEYS_4_7 1
|
#define SE_CONTEXT_SAVE_STICKY_BITS_OFFSET \
|
||||||
#define ORIGINAL_IV 2
|
(SE_CONTEXT_SAVE_RANDOM_DATA_OFFSET + SE_CONTEXT_SAVE_RANDOM_DATA_SIZE)
|
||||||
#define UPDATED_IV 3
|
#define SE_CONTEXT_SAVE_STICKY_BITS_SIZE 16
|
||||||
#define SE_KEYTABLE_DST_WORD_QUAD(x) ((x) << 0)
|
|
||||||
#define SE_KEYTABLE_DST_KEY_INDEX(x) ((x) << 8)
|
|
||||||
|
|
||||||
#define SE_RNG_CONFIG_REG 0x340
|
#define SE_CONTEXT_SAVE_KEYS_OFFSET (SE_CONTEXT_SAVE_STICKY_BITS_OFFSET + \
|
||||||
#define MODE_NORMAL 0
|
SE_CONTEXT_SAVE_STICKY_BITS_SIZE)
|
||||||
#define MODE_FORCE_INSTANTION 1
|
#define SE11_CONTEXT_SAVE_KEYS_OFFSET (SE_CONTEXT_SAVE_STICKY_BITS_OFFSET + \
|
||||||
#define MODE_FORCE_RESEED 2
|
SE_CONTEXT_SAVE_STICKY_BITS_SIZE + \
|
||||||
#define SE_RNG_CONFIG_MODE(x) ((x) << 0)
|
SE_CONTEXT_SAVE_STICKY_BITS_SIZE)
|
||||||
#define SRC_NONE 0
|
|
||||||
#define SRC_ENTROPY 1
|
|
||||||
#define SRC_LFSR 2
|
|
||||||
#define SE_RNG_CONFIG_SRC(x) ((x) << 2)
|
|
||||||
|
|
||||||
#define SE_RNG_SRC_CONFIG_REG 0x344
|
#define SE_CONTEXT_SAVE_KEY_LENGTH 512
|
||||||
#define RO_ENTR_LOCK_DISABLE 0
|
#define SE_CONTEXT_ORIGINAL_IV_OFFSET (SE_CONTEXT_SAVE_KEYS_OFFSET + \
|
||||||
#define RO_ENTR_LOCK_ENABLE 1
|
SE_CONTEXT_SAVE_KEY_LENGTH)
|
||||||
#define SE_RNG_SRC_CONFIG_ENTR_SRC_LOCK(x) ((x) << 0)
|
#define SE11_CONTEXT_ORIGINAL_IV_OFFSET (SE11_CONTEXT_SAVE_KEYS_OFFSET + \
|
||||||
#define RO_ENTR_DISABLE 0
|
SE_CONTEXT_SAVE_KEY_LENGTH)
|
||||||
#define RO_ENTR_ENABLE 1
|
|
||||||
#define SE_RNG_SRC_CONFIG_ENTR_SRC(x) ((x) << 1)
|
|
||||||
#define RO_HW_DIS_CYA_DISABLE 0
|
|
||||||
#define RO_HW_DIS_CYA_ENABLE 1
|
|
||||||
#define SE_RNG_SRC_CONFIG_HW_DIS_CYA(x) ((x) << 2)
|
|
||||||
#define SE_RNG_SRC_CONFIG_ENTR_SUBSMPL(x) ((x) << 4)
|
|
||||||
#define SE_RNG_SRC_CONFIG_ENTR_DATA_FLUSH BIT(8)
|
|
||||||
|
|
||||||
#define SE_RNG_RESEED_INTERVAL_REG 0x348
|
#define SE_CONTEXT_ORIGINAL_IV_LENGTH 256
|
||||||
|
|
||||||
#define SE_RSA_CONFIG 0x400
|
#define SE_CONTEXT_UPDATED_IV_OFFSET (SE_CONTEXT_ORIGINAL_IV_OFFSET + \
|
||||||
#define RSA_KEY_SLOT_ONE 0
|
SE_CONTEXT_ORIGINAL_IV_LENGTH)
|
||||||
#define RSA_KEY_SLOT_TW0 1
|
#define SE11_CONTEXT_UPDATED_IV_OFFSET (SE11_CONTEXT_ORIGINAL_IV_OFFSET + \
|
||||||
#define RSA_KEY_SLOT(x) ((x) << 24)
|
SE_CONTEXT_ORIGINAL_IV_LENGTH)
|
||||||
|
|
||||||
#define SE_RSA_KEY_SIZE_REG 0x404
|
#define SE_CONTEXT_UPDATED_IV_LENGTH 256
|
||||||
#define RSA_KEY_WIDTH_512 0
|
|
||||||
#define RSA_KEY_WIDTH_1024 1
|
|
||||||
#define RSA_KEY_WIDTH_1536 2
|
|
||||||
#define RSA_KEY_WIDTH_2048 3
|
|
||||||
|
|
||||||
#define SE_RSA_EXP_SIZE_REG 0x408
|
#define SE_CONTEXT_SAVE_KNOWN_PATTERN_OFFSET (SE_CONTEXT_UPDATED_IV_OFFSET + \
|
||||||
|
SE_CONTEXT_UPDATED_IV_LENGTH)
|
||||||
|
#define SE11_CONTEXT_SAVE_KNOWN_PATTERN_OFFSET \
|
||||||
|
(SE11_CONTEXT_UPDATED_IV_OFFSET + \
|
||||||
|
SE_CONTEXT_UPDATED_IV_LENGTH)
|
||||||
|
|
||||||
#define SE_RSA_SECURITY_PERKEY_REG 0x40C
|
#define SE_CONTEXT_SAVE_RSA_KEYS_OFFSET SE11_CONTEXT_SAVE_KNOWN_PATTERN_OFFSET
|
||||||
#define SE_RSA_KEY_LOCK_FLAG 0x80
|
|
||||||
#define SE_RSA_KEYTABLE_ACCESS_REG 0x410
|
|
||||||
#define SE_RSA_KEY_TBL_DIS_KEYREAD_FLAG BIT(0)
|
|
||||||
#define SE_RSA_KEY_TBL_DIS_KEYUPDATE_FLAG BIT(1)
|
|
||||||
#define SE_RSA_KEY_TBL_DIS_KEYUSE_FLAG BIT(2)
|
|
||||||
#define SE_RSA_KEY_TBL_DIS_KEY_ACCESS_FLAG 0x7F
|
|
||||||
#define SE_RSA_KEY_TBL_DIS_KEY_READ_UPDATE_FLAG (SE_RSA_KEY_TBL_DIS_KEYREAD_FLAG | SE_RSA_KEY_TBL_DIS_KEYUPDATE_FLAG)
|
|
||||||
#define SE_RSA_KEY_TBL_DIS_KEY_READ_UPDATE_USE_FLAG (SE_RSA_KEY_TBL_DIS_KEYREAD_FLAG | SE_RSA_KEY_TBL_DIS_KEYUPDATE_FLAG | SE_RSA_KEY_TBL_DIS_KEYUSE_FLAG)
|
|
||||||
|
|
||||||
#define SE_RSA_KEYTABLE_ADDR_REG 0x420
|
#define SE_CONTEXT_SAVE_RSA_KEY_LENGTH 1024
|
||||||
#define SE_RSA_KEYTABLE_PKT(x) ((x) << 0)
|
|
||||||
#define RSA_KEY_TYPE_EXP 0
|
|
||||||
#define RSA_KEY_TYPE_MOD 1
|
|
||||||
#define SE_RSA_KEYTABLE_TYPE(x) ((x) << 6)
|
|
||||||
#define RSA_KEY_NUM(x) ((x) << 7)
|
|
||||||
#define RSA_KEY_INPUT_MODE_REG 0
|
|
||||||
#define RSA_KEY_INPUT_MODE_DMA 1
|
|
||||||
#define SE_RSA_KEYTABLE_INPUT_MODE(x) ((x) << 8)
|
|
||||||
#define RSA_KEY_READ 0
|
|
||||||
#define RSA_KEY_WRITE 1
|
|
||||||
#define SE_RSA_KEY_OP(x) ((x) << 10)
|
|
||||||
|
|
||||||
#define SE_RSA_KEYTABLE_DATA_REG 0x424
|
#define SE_CONTEXT_SAVE_RSA_KNOWN_PATTERN_OFFSET \
|
||||||
|
(SE_CONTEXT_SAVE_RSA_KEYS_OFFSET + SE_CONTEXT_SAVE_RSA_KEY_LENGTH)
|
||||||
|
|
||||||
#define SE_RSA_OUTPUT_REG 0x428
|
#define SE_CONTEXT_KNOWN_PATTERN_SIZE 16
|
||||||
#define SE_RSA_OUTPUT_REG_COUNT 64
|
|
||||||
|
|
||||||
#define SE_STATUS_REG 0x800
|
#define TEGRA_SE_RSA_KEYSLOT_COUNT 2
|
||||||
#define SE_STATUS_STATE_IDLE 0
|
|
||||||
#define SE_STATUS_STATE_BUSY 1
|
|
||||||
#define SE_STATUS_STATE_WAIT_OUT 2
|
|
||||||
#define SE_STATUS_STATE_WAIT_IN 3
|
|
||||||
#define SE_STATUS_STATE_MASK 3
|
|
||||||
#define SE_STATUS_MEM_IF_IDLE (0 << 2)
|
|
||||||
#define SE_STATUS_MEM_IF_BUSY BIT(2)
|
|
||||||
|
|
||||||
#define SE_ERR_STATUS_REG 0x804
|
#define SE_RSA_KEYTABLE_ACCESS_LOCK_OFFSET 0x40C
|
||||||
#define SE_ERR_STATUS_SE_NS_ACCESS BIT(0)
|
#define SE_RSA_KEY_TBL_DIS_KEY_LOCK_FLAG 0x80
|
||||||
#define SE_ERR_STATUS_BUSY_REG_WR BIT(1)
|
|
||||||
#define SE_ERR_STATUS_DST BIT(2)
|
|
||||||
#define SE_ERR_STATUS_SRK_USAGE_LIMIT BIT(3)
|
|
||||||
#define SE_ERR_STATUS_TZRAM_NS_ACCESS BIT(24)
|
|
||||||
#define SE_ERR_STATUS_TZRAM_ADDRESS BIT(25)
|
|
||||||
|
|
||||||
#define SE_MISC_REG 0x808
|
#define SE_RSA_KEYTABLE_ACCESS_REG_OFFSET 0x410
|
||||||
#define SE_ENTROPY_NEXT_192BIT BIT(0)
|
#define SE_RSA_KEY_TBL_DIS_KEYREAD_FLAG BIT(0)
|
||||||
#define SE_ENTROPY_VN_BYPASS BIT(1)
|
#define SE_RSA_KEY_TBL_DIS_KEYUPDATE_FLAG BIT(1)
|
||||||
#define SE_CLK_OVR_ON BIT(2)
|
#define SE_RSA_KEY_TBL_DIS_KEY_READ_UPDATE_FLAG (SE_RSA_KEY_TBL_DIS_KEYREAD_FLAG | SE_RSA_KEY_TBL_DIS_KEYUPDATE_FLAG)
|
||||||
|
#define SE_RSA_KEY_TBL_DIS_KEYUSE_FLAG BIT(2)
|
||||||
|
#define SE_RSA_KEY_TBL_DIS_KEYUSE_FLAG_SHIFT BIT(2)
|
||||||
|
#define SE_RSA_KEY_TBL_DIS_KEY_ALL_COMMON_FLAG 7
|
||||||
|
#define SE_RSA_KEY_TBL_DIS_KEY_ALL_FLAG 0x7F
|
||||||
|
|
||||||
#define SE_SPARE_REG 0x80C
|
#define SE_RSA_KEYTABLE_ADDR 0x420
|
||||||
#define SE_ERRATA_FIX_DISABLE 0
|
#define SE_RSA_KEYTABLE_DATA 0x424
|
||||||
#define SE_ERRATA_FIX_ENABLE 1
|
#define SE_RSA_OUTPUT 0x428
|
||||||
#define SE_ECO(x) ((x) << 0)
|
|
||||||
|
|
||||||
#endif
|
#define RSA_KEY_READ 0
|
||||||
|
#define RSA_KEY_WRITE 1
|
||||||
|
#define SE_RSA_KEY_OP_SHIFT 10
|
||||||
|
#define SE_RSA_KEY_OP(x) ((x) << SE_RSA_KEY_OP_SHIFT)
|
||||||
|
|
||||||
|
#define RSA_KEY_INPUT_MODE_REG 0
|
||||||
|
#define RSA_KEY_INPUT_MODE_DMA 1
|
||||||
|
#define RSA_KEY_INPUT_MODE_SHIFT 8
|
||||||
|
#define RSA_KEY_INPUT_MODE(x) ((x) << RSA_KEY_INPUT_MODE_SHIFT)
|
||||||
|
|
||||||
|
#define RSA_KEY_SLOT_ONE 0
|
||||||
|
#define RSA_KEY_SLOT_TW0 1
|
||||||
|
#define RSA_KEY_NUM_SHIFT 7
|
||||||
|
#define RSA_KEY_NUM(x) ((x) << RSA_KEY_NUM_SHIFT)
|
||||||
|
|
||||||
|
#define RSA_KEY_TYPE_EXP 0
|
||||||
|
#define RSA_KEY_TYPE_MOD 1
|
||||||
|
#define RSA_KEY_TYPE_SHIFT 6
|
||||||
|
#define RSA_KEY_TYPE(x) ((x) << RSA_KEY_TYPE_SHIFT)
|
||||||
|
|
||||||
|
#define SE_RSA_KEY_SIZE_REG_OFFSET 0x404
|
||||||
|
#define SE_RSA_EXP_SIZE_REG_OFFSET 0x408
|
||||||
|
|
||||||
|
#define RSA_KEY_SLOT_SHIFT 24
|
||||||
|
#define RSA_KEY_SLOT(x) ((x) << RSA_KEY_SLOT_SHIFT)
|
||||||
|
#define SE_RSA_CONFIG 0x400
|
||||||
|
|
||||||
|
#define RSA_KEY_PKT_WORD_ADDR_SHIFT 0
|
||||||
|
#define RSA_KEY_PKT_WORD_ADDR(x) ((x) << RSA_KEY_PKT_WORD_ADDR_SHIFT)
|
||||||
|
|
||||||
|
#define RSA_KEY_WORD_ADDR_SHIFT 0
|
||||||
|
#define RSA_KEY_WORD_ADDR(x) ((x) << RSA_KEY_WORD_ADDR_SHIFT)
|
||||||
|
|
||||||
|
#define SE_RSA_KEYTABLE_PKT_SHIFT 0
|
||||||
|
#define SE_RSA_KEYTABLE_PKT(x) ((x) << SE_RSA_KEYTABLE_PKT_SHIFT)
|
||||||
|
|
||||||
|
#endif /* _CRYPTO_TEGRA_SE_H */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
* Copyright (c) 2018 balika011
|
* Copyright (c) 2018 balika011
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
#include <soc/bpmp.h>
|
#include <soc/bpmp.h>
|
||||||
#include <soc/clock.h>
|
#include <soc/clock.h>
|
||||||
#include <soc/kfuse.h>
|
#include <soc/kfuse.h>
|
||||||
#include <soc/pmc.h>
|
|
||||||
#include <soc/t210.h>
|
#include <soc/t210.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include <mem/mc.h>
|
#include <mem/mc.h>
|
||||||
@@ -34,8 +33,7 @@
|
|||||||
// #include <gfx_utils.h>
|
// #include <gfx_utils.h>
|
||||||
|
|
||||||
#define PKG11_MAGIC 0x31314B50
|
#define PKG11_MAGIC 0x31314B50
|
||||||
|
#define KB_TSEC_FW_EMU_COMPAT 6 // KB ID for HOS 6.2.0.
|
||||||
#define TSEC_HOS_KB_620 6
|
|
||||||
|
|
||||||
static int _tsec_dma_wait_idle()
|
static int _tsec_dma_wait_idle()
|
||||||
{
|
{
|
||||||
@@ -64,16 +62,15 @@ static int _tsec_dma_pa_to_internal_100(int not_imem, int i_offset, int pa_offse
|
|||||||
return _tsec_dma_wait_idle();
|
return _tsec_dma_wait_idle();
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
u8 *fwbuf = NULL;
|
u8 *fwbuf = NULL;
|
||||||
u32 type = tsec_ctxt->type;
|
|
||||||
u32 *pdir, *car, *fuse, *pmc, *flowctrl, *se, *mc, *iram, *evec;
|
u32 *pdir, *car, *fuse, *pmc, *flowctrl, *se, *mc, *iram, *evec;
|
||||||
u32 *pkg11_magic_off;
|
u32 *pkg11_magic_off;
|
||||||
|
|
||||||
bpmp_mmu_disable();
|
bpmp_mmu_disable();
|
||||||
bpmp_freq_t prev_fid = bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
||||||
|
|
||||||
// Enable clocks.
|
// Enable clocks.
|
||||||
clock_enable_host1x();
|
clock_enable_host1x();
|
||||||
@@ -86,19 +83,7 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
|
|
||||||
kfuse_wait_ready();
|
kfuse_wait_ready();
|
||||||
|
|
||||||
if (type == TSEC_FW_TYPE_NEW)
|
//Configure Falcon.
|
||||||
{
|
|
||||||
// Disable all CCPLEX core rails.
|
|
||||||
pmc_enable_partition(POWER_RAIL_CE0, DISABLE);
|
|
||||||
pmc_enable_partition(POWER_RAIL_CE1, DISABLE);
|
|
||||||
pmc_enable_partition(POWER_RAIL_CE2, DISABLE);
|
|
||||||
pmc_enable_partition(POWER_RAIL_CE3, DISABLE);
|
|
||||||
|
|
||||||
// Enable AHB aperture and set it to full mmio.
|
|
||||||
mc_enable_ahb_redirect(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure Falcon.
|
|
||||||
TSEC(TSEC_DMACTL) = 0;
|
TSEC(TSEC_DMACTL) = 0;
|
||||||
TSEC(TSEC_IRQMSET) =
|
TSEC(TSEC_IRQMSET) =
|
||||||
TSEC_IRQMSET_EXT(0xFF) |
|
TSEC_IRQMSET_EXT(0xFF) |
|
||||||
@@ -120,12 +105,12 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load firmware or emulate memio environment for newer TSEC fw.
|
//Load firmware or emulate memio environment for newer TSEC fw.
|
||||||
if (type == TSEC_FW_TYPE_EMU)
|
if (kb == KB_TSEC_FW_EMU_COMPAT)
|
||||||
TSEC(TSEC_DMATRFBASE) = (u32)tsec_ctxt->fw >> 8;
|
TSEC(TSEC_DMATRFBASE) = (u32)tsec_ctxt->fw >> 8;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fwbuf = (u8 *)malloc(SZ_16K);
|
fwbuf = (u8 *)malloc(0x4000);
|
||||||
u8 *fwbuf_aligned = (u8 *)ALIGN((u32)fwbuf, 0x100);
|
u8 *fwbuf_aligned = (u8 *)ALIGN((u32)fwbuf, 0x100);
|
||||||
memcpy(fwbuf_aligned, tsec_ctxt->fw, tsec_ctxt->size);
|
memcpy(fwbuf_aligned, tsec_ctxt->fw, tsec_ctxt->size);
|
||||||
TSEC(TSEC_DMATRFBASE) = (u32)fwbuf_aligned >> 8;
|
TSEC(TSEC_DMATRFBASE) = (u32)fwbuf_aligned >> 8;
|
||||||
@@ -140,27 +125,27 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == TSEC_FW_TYPE_EMU)
|
if (kb == KB_TSEC_FW_EMU_COMPAT)
|
||||||
{
|
{
|
||||||
// Init SMMU translation for TSEC.
|
// Init SMMU translation for TSEC.
|
||||||
pdir = smmu_init_for_tsec();
|
pdir = smmu_init_for_tsec();
|
||||||
smmu_init(tsec_ctxt->secmon_base);
|
smmu_init(0x4002B000);
|
||||||
// Enable SMMU
|
// Enable SMMU
|
||||||
if (!smmu_is_used())
|
if (!smmu_is_used())
|
||||||
smmu_enable();
|
smmu_enable();
|
||||||
|
|
||||||
// Clock reset controller.
|
// Clock reset controller.
|
||||||
car = page_alloc(1);
|
car = page_alloc(1);
|
||||||
memcpy(car, (void *)CLOCK_BASE, SZ_PAGE);
|
memcpy(car, (void *)CLOCK_BASE, 0x1000);
|
||||||
car[CLK_RST_CONTROLLER_CLK_SOURCE_TSEC / 4] = 2;
|
car[CLK_RST_CONTROLLER_CLK_SOURCE_TSEC / 4] = 2;
|
||||||
smmu_map(pdir, CLOCK_BASE, (u32)car, 1, _WRITABLE | _READABLE | _NONSECURE);
|
smmu_map(pdir, CLOCK_BASE, (u32)car, 1, _WRITABLE | _READABLE | _NONSECURE);
|
||||||
|
|
||||||
// Fuse driver.
|
// Fuse driver.
|
||||||
fuse = page_alloc(1);
|
fuse = page_alloc(1);
|
||||||
memcpy((void *)&fuse[0x800/4], (void *)FUSE_BASE, SZ_1K);
|
memcpy((void *)&fuse[0x800/4], (void *)FUSE_BASE, 0x400);
|
||||||
fuse[0x82C / 4] = 0;
|
fuse[0x82C / 4] = 0;
|
||||||
fuse[0x9E0 / 4] = (1 << (TSEC_HOS_KB_620 + 2)) - 1;
|
fuse[0x9E0 / 4] = (1 << (kb + 2)) - 1;
|
||||||
fuse[0x9E4 / 4] = (1 << (TSEC_HOS_KB_620 + 2)) - 1;
|
fuse[0x9E4 / 4] = (1 << (kb + 2)) - 1;
|
||||||
smmu_map(pdir, (FUSE_BASE - 0x800), (u32)fuse, 1, _READABLE | _NONSECURE);
|
smmu_map(pdir, (FUSE_BASE - 0x800), (u32)fuse, 1, _READABLE | _NONSECURE);
|
||||||
|
|
||||||
// Power management controller.
|
// Power management controller.
|
||||||
@@ -173,12 +158,12 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
|
|
||||||
// Security engine.
|
// Security engine.
|
||||||
se = page_alloc(1);
|
se = page_alloc(1);
|
||||||
memcpy(se, (void *)SE_BASE, SZ_PAGE);
|
memcpy(se, (void *)SE_BASE, 0x1000);
|
||||||
smmu_map(pdir, SE_BASE, (u32)se, 1, _READABLE | _WRITABLE | _NONSECURE);
|
smmu_map(pdir, SE_BASE, (u32)se, 1, _READABLE | _WRITABLE | _NONSECURE);
|
||||||
|
|
||||||
// Memory controller.
|
// Memory controller.
|
||||||
mc = page_alloc(1);
|
mc = page_alloc(1);
|
||||||
memcpy(mc, (void *)MC_BASE, SZ_PAGE);
|
memcpy(mc, (void *)MC_BASE, 0x1000);
|
||||||
mc[MC_IRAM_BOM / 4] = 0;
|
mc[MC_IRAM_BOM / 4] = 0;
|
||||||
mc[MC_IRAM_TOM / 4] = 0x80000000;
|
mc[MC_IRAM_TOM / 4] = 0x80000000;
|
||||||
smmu_map(pdir, MC_BASE, (u32)mc, 1, _READABLE | _NONSECURE);
|
smmu_map(pdir, MC_BASE, (u32)mc, 1, _READABLE | _NONSECURE);
|
||||||
@@ -187,7 +172,7 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
iram = page_alloc(0x30);
|
iram = page_alloc(0x30);
|
||||||
memcpy(iram, tsec_ctxt->pkg1, 0x30000);
|
memcpy(iram, tsec_ctxt->pkg1, 0x30000);
|
||||||
// PKG1.1 magic offset.
|
// PKG1.1 magic offset.
|
||||||
pkg11_magic_off = (u32 *)(iram + ((tsec_ctxt->pkg11_off + 0x20) / 4));
|
pkg11_magic_off = (u32 *)(iram + (0x7000 / 4));
|
||||||
smmu_map(pdir, 0x40010000, (u32)iram, 0x30, _READABLE | _WRITABLE | _NONSECURE);
|
smmu_map(pdir, 0x40010000, (u32)iram, 0x30, _READABLE | _WRITABLE | _NONSECURE);
|
||||||
|
|
||||||
// Exception vectors
|
// Exception vectors
|
||||||
@@ -195,17 +180,17 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
smmu_map(pdir, EXCP_VEC_BASE, (u32)evec, 1, _READABLE | _WRITABLE | _NONSECURE);
|
smmu_map(pdir, EXCP_VEC_BASE, (u32)evec, 1, _READABLE | _WRITABLE | _NONSECURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute firmware.
|
//Execute firmware.
|
||||||
HOST1X(HOST1X_CH0_SYNC_SYNCPT_160) = 0x34C2E1DA;
|
HOST1X(HOST1X_CH0_SYNC_SYNCPT_160) = 0x34C2E1DA;
|
||||||
TSEC(TSEC_STATUS) = 0;
|
TSEC(TSEC_STATUS) = 0;
|
||||||
TSEC(TSEC_BOOTKEYVER) = 1; // HOS uses key version 1.
|
TSEC(TSEC_BOOTKEYVER) = 1; // HOS uses key version 1.
|
||||||
TSEC(TSEC_BOOTVEC) = 0;
|
TSEC(TSEC_BOOTVEC) = 0;
|
||||||
TSEC(TSEC_CPUCTL) = TSEC_CPUCTL_STARTCPU;
|
TSEC(TSEC_CPUCTL) = TSEC_CPUCTL_STARTCPU;
|
||||||
|
|
||||||
if (type == TSEC_FW_TYPE_EMU)
|
if (kb == KB_TSEC_FW_EMU_COMPAT)
|
||||||
{
|
{
|
||||||
u32 start = get_tmr_us();
|
u32 start = get_tmr_us();
|
||||||
u32 k = se[SE_CRYPTO_KEYTABLE_DATA_REG / 4];
|
u32 k = se[SE_KEYTABLE_DATA0_REG_OFFSET / 4];
|
||||||
u32 key[16] = {0};
|
u32 key[16] = {0};
|
||||||
u32 kidx = 0;
|
u32 kidx = 0;
|
||||||
|
|
||||||
@@ -213,9 +198,9 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
{
|
{
|
||||||
smmu_flush_all();
|
smmu_flush_all();
|
||||||
|
|
||||||
if (k != se[SE_CRYPTO_KEYTABLE_DATA_REG / 4])
|
if (k != se[SE_KEYTABLE_DATA0_REG_OFFSET / 4])
|
||||||
{
|
{
|
||||||
k = se[SE_CRYPTO_KEYTABLE_DATA_REG / 4];
|
k = se[SE_KEYTABLE_DATA0_REG_OFFSET / 4];
|
||||||
key[kidx++] = k;
|
key[kidx++] = k;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,7 +257,7 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch result.
|
//Fetch result.
|
||||||
HOST1X(HOST1X_CH0_SYNC_SYNCPT_160) = 0;
|
HOST1X(HOST1X_CH0_SYNC_SYNCPT_160) = 0;
|
||||||
u32 buf[4];
|
u32 buf[4];
|
||||||
buf[0] = SOR1(SOR_NV_PDISP_SOR_DP_HDCP_BKSV_LSB);
|
buf[0] = SOR1(SOR_NV_PDISP_SOR_DP_HDCP_BKSV_LSB);
|
||||||
@@ -284,7 +269,7 @@ int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt)
|
|||||||
SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_MSB) = 0;
|
SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_MSB) = 0;
|
||||||
SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_LSB) = 0;
|
SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_LSB) = 0;
|
||||||
|
|
||||||
memcpy(tsec_keys, &buf, SE_KEY_128_SIZE);
|
memcpy(tsec_keys, &buf, 0x10);
|
||||||
}
|
}
|
||||||
|
|
||||||
out_free:;
|
out_free:;
|
||||||
@@ -292,18 +277,14 @@ out_free:;
|
|||||||
|
|
||||||
out:;
|
out:;
|
||||||
|
|
||||||
// Disable clocks.
|
//Disable clocks.
|
||||||
clock_disable_kfuse();
|
clock_disable_kfuse();
|
||||||
clock_disable_sor1();
|
clock_disable_sor1();
|
||||||
clock_disable_sor0();
|
clock_disable_sor0();
|
||||||
clock_disable_sor_safe();
|
clock_disable_sor_safe();
|
||||||
clock_disable_tsec();
|
clock_disable_tsec();
|
||||||
bpmp_mmu_enable();
|
bpmp_mmu_enable();
|
||||||
bpmp_clk_rate_set(prev_fid);
|
bpmp_clk_rate_set(BPMP_CLK_DEFAULT_BOOST);
|
||||||
|
|
||||||
// Disable AHB aperture.
|
|
||||||
if (type == TSEC_FW_TYPE_NEW)
|
|
||||||
mc_disable_ahb_redirect();
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -20,24 +20,32 @@
|
|||||||
|
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
enum tsec_fw_type
|
#define TSEC_KEY_DATA_OFFSET 0x300
|
||||||
{
|
|
||||||
// Retail Hovi Keygen.
|
|
||||||
TSEC_FW_TYPE_OLD = 0, // 1.0.0 - 6.1.0.
|
|
||||||
TSEC_FW_TYPE_EMU = 1, // 6.2.0 emulated enviroment.
|
|
||||||
TSEC_FW_TYPE_NEW = 2, // 7.0.0+.
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct _tsec_ctxt_t
|
typedef struct _tsec_ctxt_t
|
||||||
{
|
{
|
||||||
void *fw;
|
void *fw;
|
||||||
u32 size;
|
u32 size;
|
||||||
u32 type;
|
|
||||||
void *pkg1;
|
void *pkg1;
|
||||||
u32 pkg11_off;
|
|
||||||
u32 secmon_base;
|
|
||||||
} tsec_ctxt_t;
|
} tsec_ctxt_t;
|
||||||
|
|
||||||
int tsec_query(void *tsec_keys, tsec_ctxt_t *tsec_ctxt);
|
typedef struct _tsec_key_data_t
|
||||||
|
{
|
||||||
|
u8 debug_key[0x10];
|
||||||
|
u8 blob0_auth_hash[0x10];
|
||||||
|
u8 blob1_auth_hash[0x10];
|
||||||
|
u8 blob2_auth_hash[0x10];
|
||||||
|
u8 blob2_aes_iv[0x10];
|
||||||
|
u8 hovi_eks_seed[0x10];
|
||||||
|
u8 hovi_common_seed[0x10];
|
||||||
|
u32 blob0_size;
|
||||||
|
u32 blob1_size;
|
||||||
|
u32 blob2_size;
|
||||||
|
u32 blob3_size;
|
||||||
|
u32 blob4_size;
|
||||||
|
u8 reserved[0x7C];
|
||||||
|
} tsec_key_data_t;
|
||||||
|
|
||||||
|
int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
173
bdk/soc/actmon.c
173
bdk/soc/actmon.c
@@ -1,173 +0,0 @@
|
|||||||
/*
|
|
||||||
* Activity Monitor driver for Tegra X1
|
|
||||||
*
|
|
||||||
* Copyright (c) 2021 CTCaer
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "actmon.h"
|
|
||||||
#include "clock.h"
|
|
||||||
#include "t210.h"
|
|
||||||
|
|
||||||
/* Global registers */
|
|
||||||
#define ACTMON_GLB_STATUS 0x0
|
|
||||||
#define ACTMON_MCCPU_MON_ACT BIT(8)
|
|
||||||
#define ACTMON_MCALL_MON_ACT BIT(9)
|
|
||||||
#define ACTMON_CPU_FREQ_MON_ACT BIT(10)
|
|
||||||
#define ACTMON_APB_MON_ACT BIT(12)
|
|
||||||
#define ACTMON_AHB_MON_ACT BIT(13)
|
|
||||||
#define ACTMON_BPMP_MON_ACT BIT(14)
|
|
||||||
#define ACTMON_CPU_MON_ACT BIT(15)
|
|
||||||
#define ACTMON_MCCPU_INTR BIT(25)
|
|
||||||
#define ACTMON_MCALL_INTR BIT(26)
|
|
||||||
#define ACTMON_CPU_FREQ_INTR BIT(27)
|
|
||||||
#define ACTMON_APB_INTR BIT(28)
|
|
||||||
#define ACTMON_AHB_INTR BIT(29)
|
|
||||||
#define ACTMON_BPMP_INTR BIT(30)
|
|
||||||
#define ACTMON_CPU_INTR BIT(31)
|
|
||||||
#define ACTMON_GLB_PERIOD_CTRL 0x4
|
|
||||||
#define ACTMON_GLB_PERIOD_USEC BIT(8)
|
|
||||||
#define ACTMON_GLB_PERIOD_SAMPLE(n) (((n) - 1) & 0xFF)
|
|
||||||
|
|
||||||
/* Device Registers */
|
|
||||||
#define ACTMON_DEV_BASE ACTMON_BASE + 0x80
|
|
||||||
#define ACTMON_DEV_SIZE 0x40
|
|
||||||
/* CTRL */
|
|
||||||
#define ACTMON_DEV_CTRL_K_VAL(k) (((k) & 7) << 10)
|
|
||||||
#define ACTMON_DEV_CTRL_ENB_PERIODIC BIT(18)
|
|
||||||
#define ACTMON_DEV_CTRL_AT_END_EN BIT(19)
|
|
||||||
#define ACTMON_DEV_CTRL_AVG_BELOW_WMARK_EN BIT(20)
|
|
||||||
#define ACTMON_DEV_CTRL_AVG_ABOVE_WMARK_EN BIT(21)
|
|
||||||
#define ACTMON_DEV_CTRL_WHEN_OVERFLOW_EN BIT(22)
|
|
||||||
#define ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_NUM(n) (((n) & 7) << 23)
|
|
||||||
#define ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_NUM(n) (((n) & 7) << 26)
|
|
||||||
#define ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN BIT(29)
|
|
||||||
#define ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN BIT(30)
|
|
||||||
#define ACTMON_DEV_CTRL_ENB BIT(31)
|
|
||||||
/* INTR_STATUS */
|
|
||||||
#define ACTMON_DEV_ISTS_AVG_ABOVE_WMARK BIT(24)
|
|
||||||
#define ACTMON_DEV_ISTS_AVG_BELOW_WMARK BIT(25)
|
|
||||||
#define ACTMON_DEV_ISTS_WHEN_OVERFLOW BIT(26)
|
|
||||||
#define ACTMON_DEV_ISTS_AT_END BIT(29)
|
|
||||||
#define ACTMON_DEV_ISTS_CONSECUTIVE_LOWER BIT(30)
|
|
||||||
#define ACTMON_DEV_ISTS_CONSECUTIVE_UPPER BIT(31)
|
|
||||||
|
|
||||||
/* Histogram Registers */
|
|
||||||
#define ACTMON_HISTOGRAM_CONFIG 0x300
|
|
||||||
#define ACTMON_HIST_CFG_ACTIVE BIT(0)
|
|
||||||
#define ACTMON_HIST_CFG_LINEAR_MODE BIT(1)
|
|
||||||
#define ACTMON_HIST_CFG_NO_UNDERFLOW_BUCKET BIT(2)
|
|
||||||
#define ACTMON_HIST_CFG_STALL_ON_SINGLE_SATURATE BIT(3)
|
|
||||||
#define ACTMON_HIST_CFG_SHIFT(s) (((s) & 0x1F) << 4)
|
|
||||||
#define ACTMON_HIST_CFG_SOURCE(s) (((s) & 0xF) << 12)
|
|
||||||
#define ACTMON_HISTOGRAM_CTRL 0x304
|
|
||||||
#define ACTMON_HIST_CTRL_CLEAR_ALL BIT(0)
|
|
||||||
#define ACTMON_HISTOGRAM_DATA_BASE 0x380
|
|
||||||
#define ACTMON_HISTOGRAM_DATA_NUM 32
|
|
||||||
|
|
||||||
#define ACTMON_FREQ 19200000
|
|
||||||
|
|
||||||
typedef struct _actmon_dev_reg_t
|
|
||||||
{
|
|
||||||
vu32 ctrl;
|
|
||||||
vu32 upper_wnark;
|
|
||||||
vu32 lower_wmark;
|
|
||||||
vu32 init_avg;
|
|
||||||
vu32 avg_upper_wmark;
|
|
||||||
vu32 avg_lower_wmark;
|
|
||||||
vu32 count_weight;
|
|
||||||
vu32 count;
|
|
||||||
vu32 avg_count;
|
|
||||||
vu32 intr_status;
|
|
||||||
vu32 ctrl2;
|
|
||||||
vu32 unk[5];
|
|
||||||
} actmon_dev_reg_t;
|
|
||||||
|
|
||||||
u32 sample_period = 0;
|
|
||||||
|
|
||||||
void actmon_hist_enable(actmon_hist_src_t src)
|
|
||||||
{
|
|
||||||
ACTMON(ACTMON_HISTOGRAM_CONFIG) = ACTMON_HIST_CFG_SOURCE(src) | ACTMON_HIST_CFG_ACTIVE;
|
|
||||||
ACTMON(ACTMON_HISTOGRAM_CTRL) = ACTMON_HIST_CTRL_CLEAR_ALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void actmon_hist_disable()
|
|
||||||
{
|
|
||||||
ACTMON(ACTMON_HISTOGRAM_CONFIG) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void actmon_hist_get(u32 *histogram)
|
|
||||||
{
|
|
||||||
if (histogram)
|
|
||||||
{
|
|
||||||
for (u32 i = 0; i < ACTMON_HISTOGRAM_DATA_NUM; i++)
|
|
||||||
histogram[i] = ACTMON(ACTMON_HISTOGRAM_DATA_BASE + i * sizeof(u32));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void actmon_dev_enable(actmon_dev_t dev)
|
|
||||||
{
|
|
||||||
actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE));
|
|
||||||
|
|
||||||
regs->init_avg = 0;
|
|
||||||
regs->count_weight = 5;
|
|
||||||
|
|
||||||
regs->ctrl = ACTMON_DEV_CTRL_ENB | ACTMON_DEV_CTRL_ENB_PERIODIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
void actmon_dev_disable(actmon_dev_t dev)
|
|
||||||
{
|
|
||||||
actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE));
|
|
||||||
|
|
||||||
regs->ctrl = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 actmon_dev_get_load(actmon_dev_t dev)
|
|
||||||
{
|
|
||||||
actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE));
|
|
||||||
|
|
||||||
// Get load-based sampling. 1 decimal point precision.
|
|
||||||
u32 load = regs->count / (ACTMON_FREQ / 1000);
|
|
||||||
|
|
||||||
return load;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 actmon_dev_get_load_avg(actmon_dev_t dev)
|
|
||||||
{
|
|
||||||
actmon_dev_reg_t *regs = (actmon_dev_reg_t *)(ACTMON_DEV_BASE + (dev * ACTMON_DEV_SIZE));
|
|
||||||
|
|
||||||
// Get load-based sampling. 1 decimal point precision.
|
|
||||||
u32 avg_load = regs->avg_count / (ACTMON_FREQ / 1000);
|
|
||||||
|
|
||||||
return avg_load;
|
|
||||||
}
|
|
||||||
|
|
||||||
void atmon_dev_all_disable()
|
|
||||||
{
|
|
||||||
// TODO: do a global reset?
|
|
||||||
}
|
|
||||||
|
|
||||||
void actmon_init()
|
|
||||||
{
|
|
||||||
clock_enable_actmon();
|
|
||||||
|
|
||||||
// Set period to 200ms.
|
|
||||||
ACTMON(ACTMON_GLB_PERIOD_CTRL) &= ~ACTMON_GLB_PERIOD_USEC;
|
|
||||||
ACTMON(ACTMON_GLB_PERIOD_CTRL) |= ACTMON_GLB_PERIOD_SAMPLE(200);
|
|
||||||
}
|
|
||||||
|
|
||||||
void actmon_end()
|
|
||||||
{
|
|
||||||
clock_disable_actmon();
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* Activity Monitor driver for Tegra X1
|
|
||||||
*
|
|
||||||
* Copyright (c) 2021 CTCaer
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __ACTMON_H_
|
|
||||||
#define __ACTMON_H_
|
|
||||||
|
|
||||||
#include <utils/types.h>
|
|
||||||
|
|
||||||
typedef enum _actmon_dev_t
|
|
||||||
{
|
|
||||||
ACTMON_DEV_CPU,
|
|
||||||
ACTMON_DEV_BPMP,
|
|
||||||
ACTMON_DEV_AHB,
|
|
||||||
ACTMON_DEV_APB,
|
|
||||||
ACTMON_DEV_CPU_FREQ,
|
|
||||||
ACTMON_DEV_MC_ALL,
|
|
||||||
ACTMON_DEV_MC_CPU,
|
|
||||||
|
|
||||||
ACTMON_DEV_NUM,
|
|
||||||
} actmon_dev_t;
|
|
||||||
|
|
||||||
typedef enum _actmon_hist_src_t
|
|
||||||
{
|
|
||||||
ACTMON_HIST_SRC_NONE = 0,
|
|
||||||
ACTMON_HIST_SRC_AHB = 1,
|
|
||||||
ACTMON_HIST_SRC_APB = 2,
|
|
||||||
ACTMON_HIST_SRC_BPMP = 3,
|
|
||||||
ACTMON_HIST_SRC_CPU = 4,
|
|
||||||
ACTMON_HIST_SRC_MC_ALL = 5,
|
|
||||||
ACTMON_HIST_SRC_MC_CPU = 6,
|
|
||||||
ACTMON_HIST_SRC_CPU_FREQ = 7,
|
|
||||||
ACTMON_HIST_SRC_NA = 8,
|
|
||||||
ACTMON_HIST_SRC_APB_MMIO = 9,
|
|
||||||
} actmon_hist_src_t;
|
|
||||||
|
|
||||||
void actmon_hist_enable(actmon_hist_src_t src);
|
|
||||||
void actmon_hist_disable();
|
|
||||||
void actmon_hist_get(u32 *histogram);
|
|
||||||
void actmon_dev_enable(actmon_dev_t dev);
|
|
||||||
void actmon_dev_disable(actmon_dev_t dev);
|
|
||||||
u32 actmon_dev_get_load(actmon_dev_t dev);
|
|
||||||
u32 actmon_dev_get_load_avg(actmon_dev_t dev);
|
|
||||||
void atmon_dev_all_disable();
|
|
||||||
void actmon_init();
|
|
||||||
void actmon_end();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* BPMP-Lite Cache/MMU and Frequency driver for Tegra X1
|
* BPMP-Lite Cache/MMU and Frequency driver for Tegra X1
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -212,45 +212,43 @@ const u8 pll_divn[] = {
|
|||||||
//95 // BPMP_CLK_DEV_BOOST: 608MHz 49% - 152MHz APB.
|
//95 // BPMP_CLK_DEV_BOOST: 608MHz 49% - 152MHz APB.
|
||||||
};
|
};
|
||||||
|
|
||||||
bpmp_freq_t bpmp_fid_current = BPMP_CLK_NORMAL;
|
bpmp_freq_t bpmp_clock_set = BPMP_CLK_NORMAL;
|
||||||
|
|
||||||
void bpmp_clk_rate_get()
|
void bpmp_clk_rate_get()
|
||||||
{
|
{
|
||||||
bool clk_src_is_pllp = ((CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) >> 4) & 7) == 3;
|
bool clk_src_is_pllp = ((CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) >> 4) & 7) == 3;
|
||||||
|
|
||||||
if (clk_src_is_pllp)
|
if (clk_src_is_pllp)
|
||||||
bpmp_fid_current = BPMP_CLK_NORMAL;
|
bpmp_clock_set = BPMP_CLK_NORMAL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bpmp_fid_current = BPMP_CLK_HIGH_BOOST;
|
bpmp_clock_set = BPMP_CLK_HIGH_BOOST;
|
||||||
|
|
||||||
u8 pll_divn_curr = (CLOCK(CLK_RST_CONTROLLER_PLLC_BASE) >> 10) & 0xFF;
|
u8 pll_divn_curr = (CLOCK(CLK_RST_CONTROLLER_PLLC_BASE) >> 10) & 0xFF;
|
||||||
for (u32 i = 1; i < sizeof(pll_divn); i++)
|
for (u32 i = 1; i < sizeof(pll_divn); i++)
|
||||||
{
|
{
|
||||||
if (pll_divn[i] == pll_divn_curr)
|
if (pll_divn[i] == pll_divn_curr)
|
||||||
{
|
{
|
||||||
bpmp_fid_current = i;
|
bpmp_clock_set = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bpmp_freq_t bpmp_clk_rate_set(bpmp_freq_t fid)
|
void bpmp_clk_rate_set(bpmp_freq_t fid)
|
||||||
{
|
{
|
||||||
bpmp_freq_t prev_fid = bpmp_fid_current;
|
|
||||||
|
|
||||||
if (fid > (BPMP_CLK_MAX - 1))
|
if (fid > (BPMP_CLK_MAX - 1))
|
||||||
fid = BPMP_CLK_MAX - 1;
|
fid = BPMP_CLK_MAX - 1;
|
||||||
|
|
||||||
if (prev_fid == fid)
|
if (bpmp_clock_set == fid)
|
||||||
return prev_fid;
|
return;
|
||||||
|
|
||||||
if (fid)
|
if (fid)
|
||||||
{
|
{
|
||||||
if (prev_fid)
|
if (bpmp_clock_set)
|
||||||
{
|
{
|
||||||
// Restore to PLLP source during PLLC configuration.
|
// Restore to PLLP source during PLLC4 configuration.
|
||||||
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20003333; // PLLP_OUT.
|
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20003333; // PLLP_OUT.
|
||||||
msleep(1); // Wait a bit for clock source change.
|
msleep(1); // Wait a bit for clock source change.
|
||||||
}
|
}
|
||||||
@@ -271,10 +269,7 @@ bpmp_freq_t bpmp_clk_rate_set(bpmp_freq_t fid)
|
|||||||
// Disable PLLC to save power.
|
// Disable PLLC to save power.
|
||||||
clock_disable_pllc();
|
clock_disable_pllc();
|
||||||
}
|
}
|
||||||
bpmp_fid_current = fid;
|
bpmp_clock_set = fid;
|
||||||
|
|
||||||
// Return old fid in case of temporary swap.
|
|
||||||
return prev_fid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following functions halt BPMP to reduce power while sleeping.
|
// The following functions halt BPMP to reduce power while sleeping.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* BPMP-Lite Cache/MMU and Frequency driver for Tegra X1
|
* BPMP-Lite Cache/MMU and Frequency driver for Tegra X1
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -53,7 +53,6 @@ typedef enum
|
|||||||
BPMP_CLK_MAX
|
BPMP_CLK_MAX
|
||||||
} bpmp_freq_t;
|
} bpmp_freq_t;
|
||||||
|
|
||||||
#define BPMP_CLK_LOWER_BOOST BPMP_CLK_SUPER_BOOST
|
|
||||||
#define BPMP_CLK_DEFAULT_BOOST BPMP_CLK_HYPER_BOOST
|
#define BPMP_CLK_DEFAULT_BOOST BPMP_CLK_HYPER_BOOST
|
||||||
|
|
||||||
void bpmp_mmu_maintenance(u32 op, bool force);
|
void bpmp_mmu_maintenance(u32 op, bool force);
|
||||||
@@ -61,7 +60,7 @@ void bpmp_mmu_set_entry(int idx, bpmp_mmu_entry_t *entry, bool apply);
|
|||||||
void bpmp_mmu_enable();
|
void bpmp_mmu_enable();
|
||||||
void bpmp_mmu_disable();
|
void bpmp_mmu_disable();
|
||||||
void bpmp_clk_rate_get();
|
void bpmp_clk_rate_get();
|
||||||
bpmp_freq_t bpmp_clk_rate_set(bpmp_freq_t fid);
|
void bpmp_clk_rate_set(bpmp_freq_t fid);
|
||||||
void bpmp_usleep(u32 us);
|
void bpmp_usleep(u32 us);
|
||||||
void bpmp_msleep(u32 ms);
|
void bpmp_msleep(u32 ms);
|
||||||
void bpmp_halt();
|
void bpmp_halt();
|
||||||
|
|||||||
@@ -58,7 +58,24 @@ void ccplex_boot_cpu0(u32 entry)
|
|||||||
else
|
else
|
||||||
_ccplex_enable_power_t210b01();
|
_ccplex_enable_power_t210b01();
|
||||||
|
|
||||||
clock_enable_pllx();
|
// Enable PLLX and set it to 300 MHz.
|
||||||
|
if (!(CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) & PLLX_BASE_ENABLE)) // PLLX_ENABLE.
|
||||||
|
{
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLX_MISC_3) &= 0xFFFFFFF7; // Disable IDDQ.
|
||||||
|
usleep(2);
|
||||||
|
|
||||||
|
// Bypass dividers.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) = PLLX_BASE_BYPASS | (4 << 20) | (78 << 8) | 2; // P div: 4 (5), N div: 78, M div: 2.
|
||||||
|
// Disable bypass
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) = (4 << 20) | (78 << 8) | 2;
|
||||||
|
// Set PLLX_LOCK_ENABLE.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLX_MISC) = (CLOCK(CLK_RST_CONTROLLER_PLLX_MISC) & 0xFFFBFFFF) | 0x40000;
|
||||||
|
// Enable PLLX.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) = PLLX_BASE_ENABLE | (4 << 20) | (78 << 8) | 2;
|
||||||
|
}
|
||||||
|
// Wait for PLL to stabilize.
|
||||||
|
while (!(CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) & PLLX_BASE_LOCK))
|
||||||
|
;
|
||||||
|
|
||||||
// Configure MSELECT source and enable clock to 102MHz.
|
// Configure MSELECT source and enable clock to 102MHz.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) & 0x1FFFFF00) | 6;
|
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) & 0x1FFFFF00) | 6;
|
||||||
@@ -91,7 +108,6 @@ void ccplex_boot_cpu0(u32 entry)
|
|||||||
// Set reset vector.
|
// Set reset vector.
|
||||||
SB(SB_AA64_RESET_LOW) = entry | SB_AA64_RST_AARCH64_MODE_EN;
|
SB(SB_AA64_RESET_LOW) = entry | SB_AA64_RST_AARCH64_MODE_EN;
|
||||||
SB(SB_AA64_RESET_HIGH) = 0;
|
SB(SB_AA64_RESET_HIGH) = 0;
|
||||||
|
|
||||||
// Non-secure reset vector write disable.
|
// Non-secure reset vector write disable.
|
||||||
SB(SB_CSR) = SB_CSR_NS_RST_VEC_WR_DIS;
|
SB(SB_CSR) = SB_CSR_NS_RST_VEC_WR_DIS;
|
||||||
(void)SB(SB_CSR);
|
(void)SB(SB_CSR);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -79,7 +79,7 @@ static clock_t _clock_sor0 = {
|
|||||||
CLK_RST_CONTROLLER_RST_DEVICES_X, CLK_RST_CONTROLLER_CLK_OUT_ENB_X, CLK_NOT_USED, CLK_X_SOR0, 0, 0
|
CLK_RST_CONTROLLER_RST_DEVICES_X, CLK_RST_CONTROLLER_CLK_OUT_ENB_X, CLK_NOT_USED, CLK_X_SOR0, 0, 0
|
||||||
};
|
};
|
||||||
static clock_t _clock_sor1 = {
|
static clock_t _clock_sor1 = {
|
||||||
CLK_RST_CONTROLLER_RST_DEVICES_X, CLK_RST_CONTROLLER_CLK_OUT_ENB_X, CLK_RST_CONTROLLER_CLK_SOURCE_SOR1, CLK_X_SOR1, 0, 2 // 204MHz.
|
CLK_RST_CONTROLLER_RST_DEVICES_X, CLK_RST_CONTROLLER_CLK_OUT_ENB_X, CLK_RST_CONTROLLER_CLK_SOURCE_SOR1, CLK_X_SOR1, 0, 2 //204MHz.
|
||||||
};
|
};
|
||||||
static clock_t _clock_kfuse = {
|
static clock_t _clock_kfuse = {
|
||||||
CLK_RST_CONTROLLER_RST_DEVICES_H, CLK_RST_CONTROLLER_CLK_OUT_ENB_H, CLK_NO_SOURCE, CLK_H_KFUSE, 0, 0
|
CLK_RST_CONTROLLER_RST_DEVICES_H, CLK_RST_CONTROLLER_CLK_OUT_ENB_H, CLK_NO_SOURCE, CLK_H_KFUSE, 0, 0
|
||||||
@@ -100,18 +100,6 @@ static clock_t _clock_sdmmc_legacy_tm = {
|
|||||||
CLK_RST_CONTROLLER_RST_DEVICES_Y, CLK_RST_CONTROLLER_CLK_OUT_ENB_Y, CLK_RST_CONTROLLER_CLK_SOURCE_SDMMC_LEGACY_TM, CLK_Y_SDMMC_LEGACY_TM, 4, 66
|
CLK_RST_CONTROLLER_RST_DEVICES_Y, CLK_RST_CONTROLLER_CLK_OUT_ENB_Y, CLK_RST_CONTROLLER_CLK_SOURCE_SDMMC_LEGACY_TM, CLK_Y_SDMMC_LEGACY_TM, 4, 66
|
||||||
};
|
};
|
||||||
|
|
||||||
static clock_t _clock_apbdma = {
|
|
||||||
CLK_RST_CONTROLLER_RST_DEVICES_H, CLK_RST_CONTROLLER_CLK_OUT_ENB_H, CLK_NO_SOURCE, CLK_H_APBDMA, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
static clock_t _clock_ahbdma = {
|
|
||||||
CLK_RST_CONTROLLER_RST_DEVICES_H, CLK_RST_CONTROLLER_CLK_OUT_ENB_H, CLK_NO_SOURCE, CLK_H_AHBDMA, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
static clock_t _clock_actmon = {
|
|
||||||
CLK_RST_CONTROLLER_RST_DEVICES_V, CLK_RST_CONTROLLER_CLK_OUT_ENB_V, CLK_RST_CONTROLLER_CLK_SOURCE_ACTMON, CLK_V_ACTMON, 6, 0 // 19.2MHz.
|
|
||||||
};
|
|
||||||
|
|
||||||
void clock_enable(const clock_t *clk)
|
void clock_enable(const clock_t *clk)
|
||||||
{
|
{
|
||||||
// Put clock into reset.
|
// Put clock into reset.
|
||||||
@@ -291,62 +279,6 @@ void clock_disable_pwm()
|
|||||||
clock_disable(&_clock_pwm);
|
clock_disable(&_clock_pwm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void clock_enable_apbdma()
|
|
||||||
{
|
|
||||||
clock_enable(&_clock_apbdma);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_disable_apbdma()
|
|
||||||
{
|
|
||||||
clock_disable(&_clock_apbdma);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_enable_ahbdma()
|
|
||||||
{
|
|
||||||
clock_enable(&_clock_ahbdma);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_disable_ahbdma()
|
|
||||||
{
|
|
||||||
clock_disable(&_clock_ahbdma);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_enable_actmon()
|
|
||||||
{
|
|
||||||
clock_enable(&_clock_actmon);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_disable_actmon()
|
|
||||||
{
|
|
||||||
clock_disable(&_clock_actmon);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_enable_pllx()
|
|
||||||
{
|
|
||||||
// Configure and enable PLLX if disabled.
|
|
||||||
if (!(CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) & PLLX_BASE_ENABLE)) // PLLX_ENABLE.
|
|
||||||
{
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLX_MISC_3) &= ~PLLX_MISC3_IDDQ; // Disable IDDQ.
|
|
||||||
usleep(2);
|
|
||||||
|
|
||||||
// Set div configuration.
|
|
||||||
const u32 pllx_div_cfg = (2 << 20) | (156 << 8) | 2; // P div: 2 (3), N div: 156, M div: 2. 998.4 MHz.
|
|
||||||
|
|
||||||
// Bypass dividers.
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) = PLLX_BASE_BYPASS | pllx_div_cfg;
|
|
||||||
// Disable bypass
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) = pllx_div_cfg;
|
|
||||||
// Set PLLX_LOCK_ENABLE.
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLX_MISC) |= PLLX_MISC_LOCK_EN;
|
|
||||||
// Enable PLLX.
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) = PLLX_BASE_ENABLE | pllx_div_cfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for PLL to stabilize.
|
|
||||||
while (!(CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) & PLLX_BASE_LOCK))
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock_enable_pllc(u32 divn)
|
void clock_enable_pllc(u32 divn)
|
||||||
{
|
{
|
||||||
u8 pll_divn_curr = (CLOCK(CLK_RST_CONTROLLER_PLLC_BASE) >> 10) & 0xFF;
|
u8 pll_divn_curr = (CLOCK(CLK_RST_CONTROLLER_PLLC_BASE) >> 10) & 0xFF;
|
||||||
@@ -825,25 +757,15 @@ u32 clock_get_osc_freq()
|
|||||||
|
|
||||||
u32 clock_get_dev_freq(clock_pto_id_t id)
|
u32 clock_get_dev_freq(clock_pto_id_t id)
|
||||||
{
|
{
|
||||||
const u32 pto_win = 16;
|
u32 val = ((id & PTO_SRC_SEL_MASK) << PTO_SRC_SEL_SHIFT) | PTO_DIV_SEL_DIV1 | PTO_CLK_ENABLE | (16 - 1); // 16 periods of 32.76KHz window.
|
||||||
const u32 pto_osc = 32768;
|
|
||||||
|
|
||||||
u32 val = ((id & PTO_SRC_SEL_MASK) << PTO_SRC_SEL_SHIFT) | PTO_DIV_SEL_DIV1 | PTO_CLK_ENABLE | (pto_win - 1);
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val;
|
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val;
|
||||||
(void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL);
|
|
||||||
usleep(2);
|
usleep(2);
|
||||||
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_RST;
|
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_RST;
|
||||||
(void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL);
|
|
||||||
usleep(2);
|
usleep(2);
|
||||||
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val;
|
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val;
|
||||||
(void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL);
|
|
||||||
usleep(2);
|
usleep(2);
|
||||||
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_EN;
|
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = val | PTO_CNT_EN;
|
||||||
(void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL);
|
usleep(502);
|
||||||
usleep((1000000 * pto_win / pto_osc) + 12 + 2);
|
|
||||||
|
|
||||||
while (CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT_BUSY)
|
while (CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT_BUSY)
|
||||||
;
|
;
|
||||||
@@ -851,11 +773,9 @@ u32 clock_get_dev_freq(clock_pto_id_t id)
|
|||||||
u32 cnt = CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT;
|
u32 cnt = CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_STATUS) & PTO_CLK_CNT;
|
||||||
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = 0;
|
CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL) = 0;
|
||||||
(void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL);
|
|
||||||
usleep(2);
|
|
||||||
|
|
||||||
u32 freq_khz = (u64)cnt * pto_osc / pto_win / 1000;
|
u32 freq = ((cnt << 8) | 0x3E) / 125;
|
||||||
|
|
||||||
return freq_khz;
|
return freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -117,7 +117,6 @@
|
|||||||
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD 0x3A4
|
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD 0x3A4
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT 0x3B4
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT 0x3B4
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_I2C4 0x3C4
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_I2C4 0x3C4
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_ACTMON 0x3E8
|
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_EXTPERIPH1 0x3EC
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_EXTPERIPH1 0x3EC
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_SYS 0x400
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_SYS 0x400
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_SOR1 0x410
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_SOR1 0x410
|
||||||
@@ -168,8 +167,6 @@
|
|||||||
#define PLLX_BASE_REF_DIS BIT(29)
|
#define PLLX_BASE_REF_DIS BIT(29)
|
||||||
#define PLLX_BASE_ENABLE BIT(30)
|
#define PLLX_BASE_ENABLE BIT(30)
|
||||||
#define PLLX_BASE_BYPASS BIT(31)
|
#define PLLX_BASE_BYPASS BIT(31)
|
||||||
#define PLLX_MISC_LOCK_EN BIT(18)
|
|
||||||
#define PLLX_MISC3_IDDQ BIT(3)
|
|
||||||
|
|
||||||
#define PLLCX_BASE_LOCK BIT(27)
|
#define PLLCX_BASE_LOCK BIT(27)
|
||||||
#define PLLCX_BASE_REF_DIS BIT(29)
|
#define PLLCX_BASE_REF_DIS BIT(29)
|
||||||
@@ -218,7 +215,7 @@
|
|||||||
#define OSC_FREQ_DET_BUSY BIT(31)
|
#define OSC_FREQ_DET_BUSY BIT(31)
|
||||||
#define OSC_FREQ_DET_CNT 0xFFFF
|
#define OSC_FREQ_DET_CNT 0xFFFF
|
||||||
|
|
||||||
/*! PTO IDs. */
|
/*! PLLs omitted as they need PTO enabled in MISC registers. Norm div is 2. */
|
||||||
typedef enum _clock_pto_id_t
|
typedef enum _clock_pto_id_t
|
||||||
{
|
{
|
||||||
CLK_PTO_PCLK_SYS = 0x06,
|
CLK_PTO_PCLK_SYS = 0x06,
|
||||||
@@ -242,9 +239,6 @@ typedef enum _clock_pto_id_t
|
|||||||
CLK_PTO_SDMMC4 = 0x23,
|
CLK_PTO_SDMMC4 = 0x23,
|
||||||
CLK_PTO_EMC = 0x24,
|
CLK_PTO_EMC = 0x24,
|
||||||
|
|
||||||
CLK_PTO_CCLK_LP = 0x2B,
|
|
||||||
CLK_PTO_CCLK_LP_DIV2 = 0x2C,
|
|
||||||
|
|
||||||
CLK_PTO_MSELECT = 0x2F,
|
CLK_PTO_MSELECT = 0x2F,
|
||||||
|
|
||||||
CLK_PTO_VIC = 0x36,
|
CLK_PTO_VIC = 0x36,
|
||||||
@@ -327,32 +321,6 @@ typedef enum _clock_pto_id_t
|
|||||||
CLK_PTO_XUSB_SS_HOST_DEV = 0x137,
|
CLK_PTO_XUSB_SS_HOST_DEV = 0x137,
|
||||||
CLK_PTO_XUSB_CORE_HOST = 0x138,
|
CLK_PTO_XUSB_CORE_HOST = 0x138,
|
||||||
CLK_PTO_XUSB_CORE_DEV = 0x139,
|
CLK_PTO_XUSB_CORE_DEV = 0x139,
|
||||||
|
|
||||||
/*
|
|
||||||
* PLL need PTO enabled in MISC registers.
|
|
||||||
* Normal div is 2 so result is multiplied with it.
|
|
||||||
*/
|
|
||||||
CLK_PTO_PLLC_DIV2 = 0x01,
|
|
||||||
CLK_PTO_PLLM_DIV2 = 0x02,
|
|
||||||
CLK_PTO_PLLP_DIV2 = 0x03,
|
|
||||||
CLK_PTO_PLLA_DIV2 = 0x04,
|
|
||||||
CLK_PTO_PLLX_DIV2 = 0x05,
|
|
||||||
|
|
||||||
CLK_PTO_PLLMB_DIV2 = 0x25,
|
|
||||||
|
|
||||||
CLK_PTO_PLLC4_DIV2 = 0x51,
|
|
||||||
|
|
||||||
CLK_PTO_PLLA1_DIV2 = 0x55,
|
|
||||||
CLK_PTO_PLLC2_DIV2 = 0x58,
|
|
||||||
CLK_PTO_PLLC3_DIV2 = 0x5A,
|
|
||||||
|
|
||||||
CLK_PTO_PLLD_DIV2 = 0xCB,
|
|
||||||
CLK_PTO_PLLD2_DIV2 = 0xCD,
|
|
||||||
CLK_PTO_PLLDP_DIV2 = 0xCF,
|
|
||||||
|
|
||||||
CLK_PTO_PLLU_DIV2 = 0x10D,
|
|
||||||
|
|
||||||
CLK_PTO_PLLREFE_DIV2 = 0x10F,
|
|
||||||
} clock_pto_id_t;
|
} clock_pto_id_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -660,14 +628,6 @@ void clock_enable_coresight();
|
|||||||
void clock_disable_coresight();
|
void clock_disable_coresight();
|
||||||
void clock_enable_pwm();
|
void clock_enable_pwm();
|
||||||
void clock_disable_pwm();
|
void clock_disable_pwm();
|
||||||
void clock_enable_apbdma();
|
|
||||||
void clock_disable_apbdma();
|
|
||||||
void clock_enable_ahbdma();
|
|
||||||
void clock_disable_ahbdma();
|
|
||||||
void clock_enable_actmon();
|
|
||||||
void clock_disable_actmon();
|
|
||||||
|
|
||||||
void clock_enable_pllx();
|
|
||||||
void clock_enable_pllc(u32 divn);
|
void clock_enable_pllc(u32 divn);
|
||||||
void clock_disable_pllc();
|
void clock_disable_pllc();
|
||||||
void clock_enable_pllu();
|
void clock_enable_pllu();
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 shuffle2
|
* Copyright (c) 2018 shuffle2
|
||||||
* Copyright (c) 2018 balika011
|
* Copyright (c) 2018 balika011
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <sec/se.h>
|
|
||||||
#include <sec/se_t210.h>
|
|
||||||
#include <soc/fuse.h>
|
#include <soc/fuse.h>
|
||||||
#include <soc/hw_init.h>
|
#include <soc/hw_init.h>
|
||||||
#include <soc/t210.h>
|
#include <soc/t210.h>
|
||||||
@@ -92,7 +90,7 @@ u32 fuse_read_dramid(bool raw_id)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (dramid > 28)
|
if (dramid > 27)
|
||||||
dramid = 8;
|
dramid = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,41 +111,26 @@ u32 fuse_read_hw_type()
|
|||||||
{
|
{
|
||||||
switch ((fuse_read_odm(4) & 0xF0000) >> 16)
|
switch ((fuse_read_odm(4) & 0xF0000) >> 16)
|
||||||
{
|
{
|
||||||
|
case 1:
|
||||||
|
return FUSE_NX_HW_TYPE_IOWA;
|
||||||
case 2:
|
case 2:
|
||||||
return FUSE_NX_HW_TYPE_HOAG;
|
return FUSE_NX_HW_TYPE_HOAG;
|
||||||
case 4:
|
|
||||||
return FUSE_NX_HW_TYPE_AULA;
|
|
||||||
case 1:
|
|
||||||
default:
|
|
||||||
return FUSE_NX_HW_TYPE_IOWA;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FUSE_NX_HW_TYPE_ICOSA;
|
return FUSE_NX_HW_TYPE_ICOSA;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fuse_set_sbk()
|
u8 fuse_count_burnt(u32 val)
|
||||||
{
|
{
|
||||||
if (FUSE(FUSE_PRIVATE_KEY0) != 0xFFFFFFFF)
|
u8 burnt_fuses = 0;
|
||||||
|
for (u32 i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
// Read SBK from fuses.
|
if ((val >> i) & 1)
|
||||||
u32 sbk[4] = {
|
burnt_fuses++;
|
||||||
FUSE(FUSE_PRIVATE_KEY0),
|
|
||||||
FUSE(FUSE_PRIVATE_KEY1),
|
|
||||||
FUSE(FUSE_PRIVATE_KEY2),
|
|
||||||
FUSE(FUSE_PRIVATE_KEY3)
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set SBK to slot 14.
|
|
||||||
se_aes_key_set(14, sbk, SE_KEY_128_SIZE);
|
|
||||||
|
|
||||||
// Lock SBK from being read.
|
|
||||||
se_key_acc_ctrl(14, SE_KEY_TBL_DIS_KEYREAD_FLAG);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return burnt_fuses;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fuse_wait_idle()
|
void fuse_wait_idle()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 shuffle2
|
* Copyright (c) 2018 shuffle2
|
||||||
* Copyright (c) 2018 balika011
|
* Copyright (c) 2018 balika011
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -37,8 +37,6 @@
|
|||||||
#define FUSE_DISABLEREGPROGRAM 0x2C
|
#define FUSE_DISABLEREGPROGRAM 0x2C
|
||||||
#define FUSE_WRITE_ACCESS_SW 0x30
|
#define FUSE_WRITE_ACCESS_SW 0x30
|
||||||
#define FUSE_PWR_GOOD_SW 0x34
|
#define FUSE_PWR_GOOD_SW 0x34
|
||||||
|
|
||||||
/*! Fuse Cached registers */
|
|
||||||
#define FUSE_SKU_INFO 0x110
|
#define FUSE_SKU_INFO 0x110
|
||||||
#define FUSE_CPU_SPEEDO_0_CALIB 0x114
|
#define FUSE_CPU_SPEEDO_0_CALIB 0x114
|
||||||
#define FUSE_CPU_IDDQ_CALIB 0x118
|
#define FUSE_CPU_IDDQ_CALIB 0x118
|
||||||
@@ -66,10 +64,8 @@
|
|||||||
#define FUSE_OPT_WAFER_ID 0x210
|
#define FUSE_OPT_WAFER_ID 0x210
|
||||||
#define FUSE_OPT_X_COORDINATE 0x214
|
#define FUSE_OPT_X_COORDINATE 0x214
|
||||||
#define FUSE_OPT_Y_COORDINATE 0x218
|
#define FUSE_OPT_Y_COORDINATE 0x218
|
||||||
#define FUSE_OPT_OPS_RESERVED 0x220
|
|
||||||
#define FUSE_GPU_IDDQ_CALIB 0x228
|
#define FUSE_GPU_IDDQ_CALIB 0x228
|
||||||
#define FUSE_USB_CALIB_EXT 0x350
|
#define FUSE_USB_CALIB_EXT 0x350
|
||||||
#define FUSE_RESERVED_FIELD 0x354
|
|
||||||
|
|
||||||
#define FUSE_RESERVED_ODM28_T210B01 0x240
|
#define FUSE_RESERVED_ODM28_T210B01 0x240
|
||||||
|
|
||||||
@@ -86,8 +82,7 @@ enum
|
|||||||
{
|
{
|
||||||
FUSE_NX_HW_TYPE_ICOSA,
|
FUSE_NX_HW_TYPE_ICOSA,
|
||||||
FUSE_NX_HW_TYPE_IOWA,
|
FUSE_NX_HW_TYPE_IOWA,
|
||||||
FUSE_NX_HW_TYPE_HOAG,
|
FUSE_NX_HW_TYPE_HOAG
|
||||||
FUSE_NX_HW_TYPE_AULA
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -102,7 +97,7 @@ u32 fuse_read_odm_keygen_rev();
|
|||||||
u32 fuse_read_dramid(bool raw_id);
|
u32 fuse_read_dramid(bool raw_id);
|
||||||
u32 fuse_read_hw_state();
|
u32 fuse_read_hw_state();
|
||||||
u32 fuse_read_hw_type();
|
u32 fuse_read_hw_type();
|
||||||
int fuse_set_sbk();
|
u8 fuse_count_burnt(u32 val);
|
||||||
void fuse_wait_idle();
|
void fuse_wait_idle();
|
||||||
int fuse_read_ipatch(void (*ipatch)(u32 offset, u32 value));
|
int fuse_read_ipatch(void (*ipatch)(u32 offset, u32 value));
|
||||||
int fuse_read_evp_thunk(u32 *iram_evp_thunks, u32 *iram_evp_thunks_len);
|
int fuse_read_evp_thunk(u32 *iram_evp_thunks, u32 *iram_evp_thunks_len);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -39,26 +39,14 @@
|
|||||||
#include <power/max77620.h>
|
#include <power/max77620.h>
|
||||||
#include <power/max7762x.h>
|
#include <power/max7762x.h>
|
||||||
#include <power/regulator_5v.h>
|
#include <power/regulator_5v.h>
|
||||||
#include <storage/sd.h>
|
#include <storage/nx_sd.h>
|
||||||
#include <storage/sdmmc.h>
|
#include <storage/sdmmc.h>
|
||||||
#include <thermal/fan.h>
|
#include <thermal/fan.h>
|
||||||
#include <thermal/tmp451.h>
|
|
||||||
#include <utils/util.h>
|
#include <utils/util.h>
|
||||||
|
|
||||||
extern boot_cfg_t b_cfg;
|
extern boot_cfg_t b_cfg;
|
||||||
extern volatile nyx_storage_t *nyx_str;
|
extern volatile nyx_storage_t *nyx_str;
|
||||||
|
|
||||||
u32 hw_rst_status;
|
|
||||||
u32 hw_rst_reason;
|
|
||||||
|
|
||||||
u32 hw_get_chip_id()
|
|
||||||
{
|
|
||||||
if (((APB_MISC(APB_MISC_GP_HIDREV) >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01)
|
|
||||||
return GP_HIDREV_MAJOR_T210B01;
|
|
||||||
else
|
|
||||||
return GP_HIDREV_MAJOR_T210;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CLK_OSC - 38.4 MHz crystal.
|
* CLK_OSC - 38.4 MHz crystal.
|
||||||
* CLK_M - 19.2 MHz (osc/2).
|
* CLK_M - 19.2 MHz (osc/2).
|
||||||
@@ -68,6 +56,14 @@ u32 hw_get_chip_id()
|
|||||||
* PCLK - 68MHz init (-> 136MHz -> OC/4).
|
* PCLK - 68MHz init (-> 136MHz -> OC/4).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
u32 hw_get_chip_id()
|
||||||
|
{
|
||||||
|
if (((APB_MISC(APB_MISC_GP_HIDREV) >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01)
|
||||||
|
return GP_HIDREV_MAJOR_T210B01;
|
||||||
|
else
|
||||||
|
return GP_HIDREV_MAJOR_T210;
|
||||||
|
}
|
||||||
|
|
||||||
static void _config_oscillators()
|
static void _config_oscillators()
|
||||||
{
|
{
|
||||||
CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) = (CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) & 0xFFFFFFF3) | 4; // Set CLK_M_DIVISOR to 2.
|
CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) = (CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) & 0xFFFFFFF3) | 4; // Set CLK_M_DIVISOR to 2.
|
||||||
@@ -78,7 +74,7 @@ static void _config_oscillators()
|
|||||||
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFFFFF81) | 0xE; // Set LP0 OSC drive strength.
|
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFFFFF81) | 0xE; // Set LP0 OSC drive strength.
|
||||||
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFBFFFFF) | PMC_OSC_EDPD_OVER_OSC_CTRL_OVER;
|
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFBFFFFF) | PMC_OSC_EDPD_OVER_OSC_CTRL_OVER;
|
||||||
PMC(APBDEV_PMC_CNTRL2) = (PMC(APBDEV_PMC_CNTRL2) & 0xFFFFEFFF) | PMC_CNTRL2_HOLD_CKE_LOW_EN;
|
PMC(APBDEV_PMC_CNTRL2) = (PMC(APBDEV_PMC_CNTRL2) & 0xFFFFEFFF) | PMC_CNTRL2_HOLD_CKE_LOW_EN;
|
||||||
PMC(APB_MISC_GP_ASDBGREG) = (PMC(APB_MISC_GP_ASDBGREG) & 0xFCFFFFFF) | (2 << 24); // CFG2TMC_RAM_SVOP_PDP.
|
PMC(APBDEV_PMC_SCRATCH188) = (PMC(APBDEV_PMC_SCRATCH188) & 0xFCFFFFFF) | (4 << 23); // LP0 EMC2TMC_CFG_XM2COMP_PU_VREF_SEL_RANGE.
|
||||||
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 0x10; // Set HCLK div to 2 and PCLK div to 1.
|
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 0x10; // Set HCLK div to 2 and PCLK div to 1.
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLMB_BASE) &= 0xBFFFFFFF; // PLLMB disable.
|
CLOCK(CLK_RST_CONTROLLER_PLLMB_BASE) &= 0xBFFFFFFF; // PLLMB disable.
|
||||||
@@ -91,7 +87,6 @@ static void _config_oscillators()
|
|||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 2; // Set HCLK div to 1 and PCLK div to 3.
|
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 2; // Set HCLK div to 1 and PCLK div to 3.
|
||||||
}
|
}
|
||||||
|
|
||||||
// The uart is skipped for Copper, Hoag and Calcio. Used in Icosa, Iowa and Aula.
|
|
||||||
static void _config_gpios(bool nx_hoag)
|
static void _config_gpios(bool nx_hoag)
|
||||||
{
|
{
|
||||||
// Clamp inputs when tristated.
|
// Clamp inputs when tristated.
|
||||||
@@ -138,8 +133,8 @@ static void _config_gpios(bool nx_hoag)
|
|||||||
gpio_output_enable(GPIO_PORT_X, GPIO_PIN_7, GPIO_OUTPUT_DISABLE);
|
gpio_output_enable(GPIO_PORT_X, GPIO_PIN_7, GPIO_OUTPUT_DISABLE);
|
||||||
|
|
||||||
// Configure HOME as inputs.
|
// Configure HOME as inputs.
|
||||||
PINMUX_AUX(PINMUX_AUX_BUTTON_HOME) = PINMUX_INPUT_ENABLE | PINMUX_TRISTATE;
|
// PINMUX_AUX(PINMUX_AUX_BUTTON_HOME) = PINMUX_INPUT_ENABLE | PINMUX_TRISTATE;
|
||||||
gpio_config(GPIO_PORT_Y, GPIO_PIN_1, GPIO_MODE_GPIO);
|
// gpio_config(GPIO_PORT_Y, GPIO_PIN_1, GPIO_MODE_GPIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _config_pmc_scratch()
|
static void _config_pmc_scratch()
|
||||||
@@ -253,25 +248,36 @@ static void _mbist_workaround()
|
|||||||
|
|
||||||
static void _config_se_brom()
|
static void _config_se_brom()
|
||||||
{
|
{
|
||||||
// Enable Fuse visibility.
|
// Enable fuse clock.
|
||||||
clock_enable_fuse(true);
|
clock_enable_fuse(true);
|
||||||
|
|
||||||
// Try to set SBK from fuses. If patched, skip.
|
// Skip SBK/SSK if sept was run.
|
||||||
fuse_set_sbk();
|
bool sbk_skip = b_cfg.boot_cfg & BOOT_CFG_SEPT_RUN || FUSE(FUSE_PRIVATE_KEY0) == 0xFFFFFFFF;
|
||||||
|
if (!sbk_skip)
|
||||||
|
{
|
||||||
|
// Bootrom part we skipped.
|
||||||
|
u32 sbk[4] = {
|
||||||
|
FUSE(FUSE_PRIVATE_KEY0),
|
||||||
|
FUSE(FUSE_PRIVATE_KEY1),
|
||||||
|
FUSE(FUSE_PRIVATE_KEY2),
|
||||||
|
FUSE(FUSE_PRIVATE_KEY3)
|
||||||
|
};
|
||||||
|
// Set SBK to slot 14.
|
||||||
|
se_aes_key_set(14, sbk, 0x10);
|
||||||
|
|
||||||
// Lock SSK (although it's not set and unused anyways).
|
// Lock SBK from being read.
|
||||||
// se_key_acc_ctrl(15, SE_KEY_TBL_DIS_KEYREAD_FLAG);
|
se_key_acc_ctrl(14, SE_KEY_TBL_DIS_KEYREAD_FLAG);
|
||||||
|
|
||||||
|
// Lock SSK (although it's not set and unused anyways).
|
||||||
|
se_key_acc_ctrl(15, SE_KEY_TBL_DIS_KEYREAD_FLAG);
|
||||||
|
}
|
||||||
|
|
||||||
// This memset needs to happen here, else TZRAM will behave weirdly later on.
|
// This memset needs to happen here, else TZRAM will behave weirdly later on.
|
||||||
memset((void *)TZRAM_BASE, 0, SZ_64K);
|
memset((void *)TZRAM_BASE, 0, 0x10000);
|
||||||
PMC(APBDEV_PMC_CRYPTO_OP) = PMC_CRYPTO_OP_SE_ENABLE;
|
PMC(APBDEV_PMC_CRYPTO_OP) = PMC_CRYPTO_OP_SE_ENABLE;
|
||||||
SE(SE_INT_STATUS_REG) = 0x1F; // Clear all SE interrupts.
|
SE(SE_INT_STATUS_REG_OFFSET) = 0x1F;
|
||||||
|
|
||||||
// Save reset reason.
|
// Clear the boot reason to avoid problems later
|
||||||
hw_rst_status = PMC(APBDEV_PMC_SCRATCH200);
|
|
||||||
hw_rst_reason = PMC(APBDEV_PMC_RST_STATUS) & PMC_RST_STATUS_MASK;
|
|
||||||
|
|
||||||
// Clear the boot reason to avoid problems later.
|
|
||||||
PMC(APBDEV_PMC_SCRATCH200) = 0x0;
|
PMC(APBDEV_PMC_SCRATCH200) = 0x0;
|
||||||
PMC(APBDEV_PMC_RST_STATUS) = 0x0;
|
PMC(APBDEV_PMC_RST_STATUS) = 0x0;
|
||||||
APB_MISC(APB_MISC_PP_STRAPPING_OPT_A) = (APB_MISC(APB_MISC_PP_STRAPPING_OPT_A) & 0xF0) | (7 << 10);
|
APB_MISC(APB_MISC_PP_STRAPPING_OPT_A) = (APB_MISC(APB_MISC_PP_STRAPPING_OPT_A) & 0xF0) | (7 << 10);
|
||||||
@@ -344,7 +350,7 @@ void hw_init()
|
|||||||
// Enable Security Engine clock.
|
// Enable Security Engine clock.
|
||||||
clock_enable_se();
|
clock_enable_se();
|
||||||
|
|
||||||
// Enable Fuse visibility.
|
// Enable Fuse clock.
|
||||||
clock_enable_fuse(true);
|
clock_enable_fuse(true);
|
||||||
|
|
||||||
// Disable Fuse programming.
|
// Disable Fuse programming.
|
||||||
@@ -399,12 +405,12 @@ void hw_init()
|
|||||||
// Set BPMP/SCLK to PLLP_OUT (408MHz).
|
// Set BPMP/SCLK to PLLP_OUT (408MHz).
|
||||||
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20003333;
|
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20003333;
|
||||||
|
|
||||||
// Power on T210B01 shadow TZRAM and lock the reg.
|
// Disable TZRAM shutdown control and lock the regs.
|
||||||
if (!tegra_t210)
|
if (!tegra_t210)
|
||||||
{
|
{
|
||||||
PMC(APBDEV_PMC_TZRAM_PWR_CNTRL) &= ~PMC_TZRAM_PWR_CNTRL_SD;
|
PMC(APBDEV_PMC_TZRAM_PWR_CNTRL) &= 0xFFFFFFFE;
|
||||||
PMC(APBDEV_PMC_TZRAM_NON_SEC_DISABLE) = PMC_TZRAM_DISABLE_REG_WRITE | PMC_TZRAM_DISABLE_REG_READ;
|
PMC(APBDEV_PMC_TZRAM_NON_SEC_DISABLE) = 3;
|
||||||
PMC(APBDEV_PMC_TZRAM_SEC_DISABLE) = PMC_TZRAM_DISABLE_REG_WRITE | PMC_TZRAM_DISABLE_REG_READ;
|
PMC(APBDEV_PMC_TZRAM_SEC_DISABLE) = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize External memory controller and configure DRAM parameters.
|
// Initialize External memory controller and configure DRAM parameters.
|
||||||
@@ -413,18 +419,19 @@ void hw_init()
|
|||||||
bpmp_mmu_enable();
|
bpmp_mmu_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void hw_reinit_workaround(bool coreboot, u32 bl_magic)
|
void hw_reinit_workaround(bool coreboot, u32 magic)
|
||||||
{
|
{
|
||||||
// Disable BPMP max clock.
|
// Disable BPMP max clock.
|
||||||
bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
bpmp_clk_rate_set(BPMP_CLK_NORMAL);
|
||||||
|
|
||||||
#ifdef BDK_HW_EXTRA_DEINIT
|
#ifdef NYX
|
||||||
// Disable temperature sensor, touchscreen, 5V regulators and Joy-Con.
|
// Deinit touchscreen, 5V regulators and Joy-Con.
|
||||||
tmp451_end();
|
|
||||||
set_fan_duty(0);
|
|
||||||
touch_power_off();
|
touch_power_off();
|
||||||
|
set_fan_duty(0);
|
||||||
jc_deinit();
|
jc_deinit();
|
||||||
regulator_5v_disable(REGULATOR_5V_ALL);
|
regulator_5v_disable(REGULATOR_5V_ALL);
|
||||||
|
clock_disable_uart(UART_B);
|
||||||
|
clock_disable_uart(UART_C);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Flush/disable MMU cache and set DRAM clock to 204MHz.
|
// Flush/disable MMU cache and set DRAM clock to 204MHz.
|
||||||
@@ -453,22 +460,11 @@ void hw_reinit_workaround(bool coreboot, u32 bl_magic)
|
|||||||
PMC(APBDEV_PMC_NO_IOPOWER) &= ~(PMC_NO_IOPOWER_SDMMC1_IO_EN);
|
PMC(APBDEV_PMC_NO_IOPOWER) &= ~(PMC_NO_IOPOWER_SDMMC1_IO_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seamless display or display power off.
|
// Power off display.
|
||||||
switch (bl_magic)
|
display_end();
|
||||||
{
|
|
||||||
case BL_MAGIC_CRBOOT_SLD:;
|
|
||||||
// Set pwm to 0%, switch to gpio mode and restore pwm duty.
|
|
||||||
u32 brightness = display_get_backlight_brightness();
|
|
||||||
display_backlight_brightness(0, 1000);
|
|
||||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_GPIO);
|
|
||||||
display_backlight_brightness(brightness, 0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
display_end();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable clock to USBD and init SDMMC1 to avoid hangs with bad hw inits.
|
// Enable clock to USBD and init SDMMC1 to avoid hangs with bad hw inits.
|
||||||
if (bl_magic == BL_MAGIC_BROKEN_HWI)
|
if (magic == 0xBAADF00D)
|
||||||
{
|
{
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_USBD);
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_USBD);
|
||||||
sdmmc_init(&sd_sdmmc, SDMMC_1, SDMMC_POWER_3_3, SDMMC_BUS_WIDTH_1, SDHCI_TIMING_SD_ID, 0);
|
sdmmc_init(&sd_sdmmc, SDMMC_1, SDMMC_POWER_3_3, SDMMC_BUS_WIDTH_1, SDHCI_TIMING_SD_ID, 0);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -20,13 +20,6 @@
|
|||||||
|
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
#define BL_MAGIC_CRBOOT_SLD 0x30444C53 // SLD0, seamless display type 0.
|
|
||||||
#define BL_MAGIC_HEKATF_SLD 0x31444C53 // SLD1, seamless display type 1.
|
|
||||||
#define BL_MAGIC_BROKEN_HWI 0xBAADF00D // Broken hwinit.
|
|
||||||
|
|
||||||
extern u32 hw_rst_status;
|
|
||||||
extern u32 hw_rst_reason;
|
|
||||||
|
|
||||||
void hw_init();
|
void hw_init();
|
||||||
void hw_reinit_workaround(bool coreboot, u32 magic);
|
void hw_reinit_workaround(bool coreboot, u32 magic);
|
||||||
u32 hw_get_chip_id();
|
u32 hw_get_chip_id();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 st4rk
|
* Copyright (c) 2018 st4rk
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -53,20 +53,13 @@
|
|||||||
#define PMC_CRYPTO_OP_SE_DISABLE 1
|
#define PMC_CRYPTO_OP_SE_DISABLE 1
|
||||||
#define APBDEV_PMC_SCRATCH33 0x120
|
#define APBDEV_PMC_SCRATCH33 0x120
|
||||||
#define APBDEV_PMC_SCRATCH37 0x130
|
#define APBDEV_PMC_SCRATCH37 0x130
|
||||||
#define PMC_SCRATCH37_KERNEL_PANIC_MAGIC 0x4E415054
|
#define PMC_SCRATCH37_KERNEL_PANIC_FLAG BIT(24)
|
||||||
#define APBDEV_PMC_SCRATCH40 0x13C
|
#define APBDEV_PMC_SCRATCH40 0x13C
|
||||||
#define APBDEV_PMC_OSC_EDPD_OVER 0x1A4
|
#define APBDEV_PMC_OSC_EDPD_OVER 0x1A4
|
||||||
#define PMC_OSC_EDPD_OVER_OSC_CTRL_OVER 0x400000
|
#define PMC_OSC_EDPD_OVER_OSC_CTRL_OVER 0x400000
|
||||||
#define APBDEV_PMC_CLK_OUT_CNTRL 0x1A8
|
#define APBDEV_PMC_CLK_OUT_CNTRL 0x1A8
|
||||||
#define PMC_CLK_OUT_CNTRL_CLK1_FORCE_EN BIT(2)
|
#define PMC_CLK_OUT_CNTRL_CLK1_FORCE_EN BIT(2)
|
||||||
#define APBDEV_PMC_RST_STATUS 0x1B4
|
#define APBDEV_PMC_RST_STATUS 0x1B4
|
||||||
#define PMC_RST_STATUS_MASK 0x7
|
|
||||||
#define PMC_RST_STATUS_POR 0
|
|
||||||
#define PMC_RST_STATUS_WATCHDOG 1
|
|
||||||
#define PMC_RST_STATUS_SENSOR 2
|
|
||||||
#define PMC_RST_STATUS_SW_MAIN 3
|
|
||||||
#define PMC_RST_STATUS_LP0 4
|
|
||||||
#define PMC_RST_STATUS_AOTAG 5
|
|
||||||
#define APBDEV_PMC_IO_DPD_REQ 0x1B8
|
#define APBDEV_PMC_IO_DPD_REQ 0x1B8
|
||||||
#define PMC_IO_DPD_REQ_DPD_OFF BIT(30)
|
#define PMC_IO_DPD_REQ_DPD_OFF BIT(30)
|
||||||
#define APBDEV_PMC_IO_DPD2_REQ 0x1C0
|
#define APBDEV_PMC_IO_DPD2_REQ 0x1C0
|
||||||
@@ -103,15 +96,9 @@
|
|||||||
#define APBDEV_PMC_SCRATCH188 0x810
|
#define APBDEV_PMC_SCRATCH188 0x810
|
||||||
#define APBDEV_PMC_SCRATCH190 0x818
|
#define APBDEV_PMC_SCRATCH190 0x818
|
||||||
#define APBDEV_PMC_SCRATCH200 0x840
|
#define APBDEV_PMC_SCRATCH200 0x840
|
||||||
#define APBDEV_PMC_SECURE_SCRATCH108 0xB08
|
|
||||||
#define APBDEV_PMC_SECURE_SCRATCH109 0xB0C
|
|
||||||
#define APBDEV_PMC_SECURE_SCRATCH110 0xB10
|
|
||||||
#define APBDEV_PMC_TZRAM_PWR_CNTRL 0xBE8
|
#define APBDEV_PMC_TZRAM_PWR_CNTRL 0xBE8
|
||||||
#define PMC_TZRAM_PWR_CNTRL_SD BIT(0)
|
|
||||||
#define APBDEV_PMC_TZRAM_SEC_DISABLE 0xBEC
|
#define APBDEV_PMC_TZRAM_SEC_DISABLE 0xBEC
|
||||||
#define APBDEV_PMC_TZRAM_NON_SEC_DISABLE 0xBF0
|
#define APBDEV_PMC_TZRAM_NON_SEC_DISABLE 0xBF0
|
||||||
#define PMC_TZRAM_DISABLE_REG_WRITE BIT(0)
|
|
||||||
#define PMC_TZRAM_DISABLE_REG_READ BIT(1)
|
|
||||||
|
|
||||||
typedef enum _pmc_sec_lock_t
|
typedef enum _pmc_sec_lock_t
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
#define AHBDMA_BASE 0x60008000
|
#define AHBDMA_BASE 0x60008000
|
||||||
#define SYSREG_BASE 0x6000C000
|
#define SYSREG_BASE 0x6000C000
|
||||||
#define SB_BASE (SYSREG_BASE + 0x200)
|
#define SB_BASE (SYSREG_BASE + 0x200)
|
||||||
#define ACTMON_BASE 0x6000C800
|
|
||||||
#define GPIO_BASE 0x6000D000
|
#define GPIO_BASE 0x6000D000
|
||||||
#define GPIO_1_BASE (GPIO_BASE)
|
#define GPIO_1_BASE (GPIO_BASE)
|
||||||
#define GPIO_2_BASE (GPIO_BASE + 0x100)
|
#define GPIO_2_BASE (GPIO_BASE + 0x100)
|
||||||
@@ -90,7 +89,6 @@
|
|||||||
#define SYSREG(off) _REG(SYSREG_BASE, off)
|
#define SYSREG(off) _REG(SYSREG_BASE, off)
|
||||||
#define AHB_GIZMO(off) _REG(SYSREG_BASE, off)
|
#define AHB_GIZMO(off) _REG(SYSREG_BASE, off)
|
||||||
#define SB(off) _REG(SB_BASE, off)
|
#define SB(off) _REG(SB_BASE, off)
|
||||||
#define ACTMON(off) _REG(ACTMON_BASE, off)
|
|
||||||
#define GPIO(off) _REG(GPIO_BASE, off)
|
#define GPIO(off) _REG(GPIO_BASE, off)
|
||||||
#define GPIO_1(off) _REG(GPIO_1_BASE, off)
|
#define GPIO_1(off) _REG(GPIO_1_BASE, off)
|
||||||
#define GPIO_2(off) _REG(GPIO_2_BASE, off)
|
#define GPIO_2(off) _REG(GPIO_2_BASE, off)
|
||||||
@@ -186,8 +184,6 @@
|
|||||||
#define MEM_PREFETCH_USB3_MST_ID MST_ID(17) // XUSB.
|
#define MEM_PREFETCH_USB3_MST_ID MST_ID(17) // XUSB.
|
||||||
#define MEM_PREFETCH_ADDR_BNDRY(x) (((x) & 0xF) << 21)
|
#define MEM_PREFETCH_ADDR_BNDRY(x) (((x) & 0xF) << 21)
|
||||||
#define MEM_PREFETCH_ENABLE BIT(31)
|
#define MEM_PREFETCH_ENABLE BIT(31)
|
||||||
#define AHB_ARBITRATION_AHB_MEM_WRQUE_MST_ID 0xFC
|
|
||||||
#define MEM_WRQUE_SE_MST_ID BIT(14)
|
|
||||||
#define AHB_AHB_SPARE_REG 0x110
|
#define AHB_AHB_SPARE_REG 0x110
|
||||||
|
|
||||||
/*! Misc registers. */
|
/*! Misc registers. */
|
||||||
@@ -196,7 +192,6 @@
|
|||||||
#define APB_MISC_GP_HIDREV 0x804
|
#define APB_MISC_GP_HIDREV 0x804
|
||||||
#define GP_HIDREV_MAJOR_T210 0x1
|
#define GP_HIDREV_MAJOR_T210 0x1
|
||||||
#define GP_HIDREV_MAJOR_T210B01 0x2
|
#define GP_HIDREV_MAJOR_T210B01 0x2
|
||||||
#define APB_MISC_GP_ASDBGREG 0x810
|
|
||||||
#define APB_MISC_GP_AUD_MCLK_CFGPADCTRL 0x8F4
|
#define APB_MISC_GP_AUD_MCLK_CFGPADCTRL 0x8F4
|
||||||
#define APB_MISC_GP_LCD_BL_PWM_CFGPADCTRL 0xA34
|
#define APB_MISC_GP_LCD_BL_PWM_CFGPADCTRL 0xA34
|
||||||
#define APB_MISC_GP_SDMMC1_PAD_CFGPADCTRL 0xA98
|
#define APB_MISC_GP_SDMMC1_PAD_CFGPADCTRL 0xA98
|
||||||
@@ -286,6 +281,7 @@
|
|||||||
/*! Special registers. */
|
/*! Special registers. */
|
||||||
#define EMC_SCRATCH0 0x324
|
#define EMC_SCRATCH0 0x324
|
||||||
#define EMC_HEKA_UPD BIT(30)
|
#define EMC_HEKA_UPD BIT(30)
|
||||||
|
#define EMC_SEPT_RUN BIT(31)
|
||||||
|
|
||||||
/*! Flow controller registers. */
|
/*! Flow controller registers. */
|
||||||
#define FLOW_CTLR_HALT_COP_EVENTS 0x4
|
#define FLOW_CTLR_HALT_COP_EVENTS 0x4
|
||||||
|
|||||||
@@ -122,12 +122,7 @@ u32 uart_get_IIR(u32 idx)
|
|||||||
{
|
{
|
||||||
uart_t *uart = (uart_t *)(UART_BASE + uart_baseoff[idx]);
|
uart_t *uart = (uart_t *)(UART_BASE + uart_baseoff[idx]);
|
||||||
|
|
||||||
u32 iir = uart->UART_IIR_FCR & UART_IIR_INT_MASK;
|
return uart->UART_IIR_FCR;
|
||||||
|
|
||||||
if (iir & UART_IIR_NO_INT)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return ((iir >> 1) + 1); // Return encoded interrupt.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uart_set_IIR(u32 idx)
|
void uart_set_IIR(u32 idx)
|
||||||
@@ -172,22 +167,3 @@ void uart_empty_fifo(u32 idx, u32 which)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_UART_PORT
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <utils/sprintf.h>
|
|
||||||
|
|
||||||
void uart_print(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
char text[256];
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
s_vprintf(text, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
uart_send(DEBUG_UART_PORT, (u8 *)text, strlen(text));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -54,17 +54,6 @@
|
|||||||
#define UART_IIR_FCR_RX_CLR 0x2
|
#define UART_IIR_FCR_RX_CLR 0x2
|
||||||
#define UART_IIR_FCR_EN_FIFO 0x1
|
#define UART_IIR_FCR_EN_FIFO 0x1
|
||||||
|
|
||||||
#define UART_IIR_NO_INT BIT(0)
|
|
||||||
#define UART_IIR_INT_MASK 0xF
|
|
||||||
/* Custom returned interrupt results. Actual interrupts are -1 */
|
|
||||||
#define UART_IIR_NOI 0 // No interrupt.
|
|
||||||
#define UART_IIR_MSI 1 // Modem status interrupt.
|
|
||||||
#define UART_IIR_THRI 2 // Transmitter holding register empty.
|
|
||||||
#define UART_IIR_RDI 3 // Receiver data interrupt.
|
|
||||||
#define UART_IIR_ERROR 4 // Overrun Error, Parity Error, Framing Error, Break.
|
|
||||||
#define UART_IIR_REDI 5 // Receiver end of data interrupt.
|
|
||||||
#define UART_IIR_RDTI 7 // Receiver data timeout interrupt.
|
|
||||||
|
|
||||||
#define UART_MCR_RTS 0x2
|
#define UART_MCR_RTS 0x2
|
||||||
#define UART_MCR_DTR 0x1
|
#define UART_MCR_DTR 0x1
|
||||||
|
|
||||||
@@ -94,8 +83,5 @@ void uart_invert(u32 idx, bool enable, u32 invert_mask);
|
|||||||
u32 uart_get_IIR(u32 idx);
|
u32 uart_get_IIR(u32 idx);
|
||||||
void uart_set_IIR(u32 idx);
|
void uart_set_IIR(u32 idx);
|
||||||
void uart_empty_fifo(u32 idx, u32 which);
|
void uart_empty_fifo(u32 idx, u32 which);
|
||||||
#ifdef DEBUG_UART_PORT
|
|
||||||
void uart_print(const char *fmt, ...);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,223 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018 naehrwert
|
|
||||||
* Copyright (c) 2019-2022 CTCaer
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "emmc.h"
|
|
||||||
#include <mem/heap.h>
|
|
||||||
#include <soc/fuse.h>
|
|
||||||
#include <storage/mbr_gpt.h>
|
|
||||||
#include <utils/list.h>
|
|
||||||
|
|
||||||
static u16 emmc_errors[3] = { 0 }; // Init and Read/Write errors.
|
|
||||||
static u32 emmc_mode = EMMC_MMC_HS400;
|
|
||||||
|
|
||||||
sdmmc_t emmc_sdmmc;
|
|
||||||
sdmmc_storage_t emmc_storage;
|
|
||||||
FATFS emmc_fs;
|
|
||||||
|
|
||||||
#ifdef BDK_EMUMMC_ENABLE
|
|
||||||
int emummc_storage_read(u32 sector, u32 num_sectors, void *buf);
|
|
||||||
int emummc_storage_write(u32 sector, u32 num_sectors, void *buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void emmc_error_count_increment(u8 type)
|
|
||||||
{
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case EMMC_ERROR_INIT_FAIL:
|
|
||||||
emmc_errors[0]++;
|
|
||||||
break;
|
|
||||||
case EMMC_ERROR_RW_FAIL:
|
|
||||||
emmc_errors[1]++;
|
|
||||||
break;
|
|
||||||
case EMMC_ERROR_RW_RETRY:
|
|
||||||
emmc_errors[2]++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
u16 *emmc_get_error_count()
|
|
||||||
{
|
|
||||||
return emmc_errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 emmc_get_mode()
|
|
||||||
{
|
|
||||||
return emmc_mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
int emmc_init_retry(bool power_cycle)
|
|
||||||
{
|
|
||||||
u32 bus_width = SDMMC_BUS_WIDTH_8;
|
|
||||||
u32 type = SDHCI_TIMING_MMC_HS400;
|
|
||||||
|
|
||||||
// Power cycle SD eMMC.
|
|
||||||
if (power_cycle)
|
|
||||||
{
|
|
||||||
emmc_mode--;
|
|
||||||
sdmmc_storage_end(&emmc_storage);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get init parameters.
|
|
||||||
switch (emmc_mode)
|
|
||||||
{
|
|
||||||
case EMMC_INIT_FAIL: // Reset to max.
|
|
||||||
return 0;
|
|
||||||
case EMMC_1BIT_HS52:
|
|
||||||
bus_width = SDMMC_BUS_WIDTH_1;
|
|
||||||
type = SDHCI_TIMING_MMC_HS52;
|
|
||||||
break;
|
|
||||||
case EMMC_8BIT_HS52:
|
|
||||||
type = SDHCI_TIMING_MMC_HS52;
|
|
||||||
break;
|
|
||||||
case EMMC_MMC_HS200:
|
|
||||||
type = SDHCI_TIMING_MMC_HS200;
|
|
||||||
break;
|
|
||||||
case EMMC_MMC_HS400:
|
|
||||||
type = SDHCI_TIMING_MMC_HS400;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
emmc_mode = EMMC_MMC_HS400;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sdmmc_storage_init_mmc(&emmc_storage, &emmc_sdmmc, bus_width, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool emmc_initialize(bool power_cycle)
|
|
||||||
{
|
|
||||||
// Reset mode in case of previous failure.
|
|
||||||
if (emmc_mode == EMMC_INIT_FAIL)
|
|
||||||
emmc_mode = EMMC_MMC_HS400;
|
|
||||||
|
|
||||||
if (power_cycle)
|
|
||||||
sdmmc_storage_end(&emmc_storage);
|
|
||||||
|
|
||||||
int res = !emmc_init_retry(false);
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
if (!res)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
emmc_errors[EMMC_ERROR_INIT_FAIL]++;
|
|
||||||
|
|
||||||
if (emmc_mode == EMMC_INIT_FAIL)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
res = !emmc_init_retry(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sdmmc_storage_end(&emmc_storage);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void emmc_gpt_parse(link_t *gpt)
|
|
||||||
{
|
|
||||||
gpt_t *gpt_buf = (gpt_t *)calloc(GPT_NUM_BLOCKS, EMMC_BLOCKSIZE);
|
|
||||||
|
|
||||||
#ifdef BDK_EMUMMC_ENABLE
|
|
||||||
emummc_storage_read(GPT_FIRST_LBA, GPT_NUM_BLOCKS, gpt_buf);
|
|
||||||
#else
|
|
||||||
sdmmc_storage_read(&emmc_storage, GPT_FIRST_LBA, GPT_NUM_BLOCKS, gpt_buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Check if no GPT or more than max allowed entries.
|
|
||||||
if (memcmp(&gpt_buf->header.signature, "EFI PART", 8) || gpt_buf->header.num_part_ents > 128)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
for (u32 i = 0; i < gpt_buf->header.num_part_ents; i++)
|
|
||||||
{
|
|
||||||
emmc_part_t *part = (emmc_part_t *)calloc(sizeof(emmc_part_t), 1);
|
|
||||||
|
|
||||||
if (gpt_buf->entries[i].lba_start < gpt_buf->header.first_use_lba)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
part->index = i;
|
|
||||||
part->lba_start = gpt_buf->entries[i].lba_start;
|
|
||||||
part->lba_end = gpt_buf->entries[i].lba_end;
|
|
||||||
part->attrs = gpt_buf->entries[i].attrs;
|
|
||||||
|
|
||||||
// ASCII conversion. Copy only the LSByte of the UTF-16LE name.
|
|
||||||
for (u32 j = 0; j < 36; j++)
|
|
||||||
part->name[j] = gpt_buf->entries[i].name[j];
|
|
||||||
part->name[35] = 0;
|
|
||||||
|
|
||||||
list_append(gpt, &part->link);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
free(gpt_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void emmc_gpt_free(link_t *gpt)
|
|
||||||
{
|
|
||||||
LIST_FOREACH_SAFE(iter, gpt)
|
|
||||||
free(CONTAINER_OF(iter, emmc_part_t, link));
|
|
||||||
}
|
|
||||||
|
|
||||||
emmc_part_t *emmc_part_find(link_t *gpt, const char *name)
|
|
||||||
{
|
|
||||||
LIST_FOREACH_ENTRY(emmc_part_t, part, gpt, link)
|
|
||||||
if (!strcmp(part->name, name))
|
|
||||||
return part;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int emmc_part_read(emmc_part_t *part, u32 sector_off, u32 num_sectors, void *buf)
|
|
||||||
{
|
|
||||||
// The last LBA is inclusive.
|
|
||||||
if (part->lba_start + sector_off > part->lba_end)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#ifdef BDK_EMUMMC_ENABLE
|
|
||||||
return emummc_storage_read(part->lba_start + sector_off, num_sectors, buf);
|
|
||||||
#else
|
|
||||||
return sdmmc_storage_read(&emmc_storage, part->lba_start + sector_off, num_sectors, buf);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int emmc_part_write(emmc_part_t *part, u32 sector_off, u32 num_sectors, void *buf)
|
|
||||||
{
|
|
||||||
// The last LBA is inclusive.
|
|
||||||
if (part->lba_start + sector_off > part->lba_end)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
#ifdef BDK_EMUMMC_ENABLE
|
|
||||||
return emummc_storage_write(part->lba_start + sector_off, num_sectors, buf);
|
|
||||||
#else
|
|
||||||
return sdmmc_storage_write(&emmc_storage, part->lba_start + sector_off, num_sectors, buf);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void nx_emmc_get_autorcm_masks(u8 *mod0, u8 *mod1)
|
|
||||||
{
|
|
||||||
if (fuse_read_hw_state() == FUSE_NX_HW_STATE_PROD)
|
|
||||||
{
|
|
||||||
*mod0 = 0xF7;
|
|
||||||
*mod1 = 0x86;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*mod0 = 0x37;
|
|
||||||
*mod1 = 0x84;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
* Header for MultiMediaCard (MMC)
|
* Header for MultiMediaCard (MMC)
|
||||||
*
|
*
|
||||||
* Copyright 2002 Hewlett-Packard Company
|
* Copyright 2002 Hewlett-Packard Company
|
||||||
* Copyright 2018-2021 CTCaer
|
|
||||||
*
|
*
|
||||||
* Use consistent with the GNU GPL is permitted,
|
* Use consistent with the GNU GPL is permitted,
|
||||||
* provided that this copyright notice is
|
* provided that this copyright notice is
|
||||||
@@ -22,8 +21,8 @@
|
|||||||
* 15 May 2002
|
* 15 May 2002
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MMC_H
|
#ifndef LINUX_MMC_MMC_H
|
||||||
#define MMC_H
|
#define LINUX_MMC_MMC_H
|
||||||
|
|
||||||
/* Standard MMC commands (4.1) type argument response */
|
/* Standard MMC commands (4.1) type argument response */
|
||||||
/* class 1 */
|
/* class 1 */
|
||||||
@@ -85,11 +84,6 @@
|
|||||||
#define MMC_APP_CMD 55 /* ac [31:16] RCA R1 */
|
#define MMC_APP_CMD 55 /* ac [31:16] RCA R1 */
|
||||||
#define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1 */
|
#define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1 */
|
||||||
|
|
||||||
#define MMC_VENDOR_60_CMD 60 /* Vendor Defined */
|
|
||||||
#define MMC_VENDOR_61_CMD 61 /* Vendor Defined */
|
|
||||||
#define MMC_VENDOR_62_CMD 62 /* Vendor Defined */
|
|
||||||
#define MMC_VENDOR_63_CMD 63 /* Vendor Defined */
|
|
||||||
|
|
||||||
/* class 11 */
|
/* class 11 */
|
||||||
#define MMC_QUE_TASK_PARAMS 44 /* ac [20:16] task id R1 */
|
#define MMC_QUE_TASK_PARAMS 44 /* ac [20:16] task id R1 */
|
||||||
#define MMC_QUE_TASK_ADDR 45 /* ac [31:0] data addr R1 */
|
#define MMC_QUE_TASK_ADDR 45 /* ac [31:0] data addr R1 */
|
||||||
@@ -98,29 +92,29 @@
|
|||||||
#define MMC_CMDQ_TASK_MGMT 48 /* ac [20:16] task id R1b */
|
#define MMC_CMDQ_TASK_MGMT 48 /* ac [20:16] task id R1b */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MMC_SWITCH argument format:
|
* MMC_SWITCH argument format:
|
||||||
*
|
*
|
||||||
* [31:26] Always 0
|
* [31:26] Always 0
|
||||||
* [25:24] Access Mode
|
* [25:24] Access Mode
|
||||||
* [23:16] Location of target Byte in EXT_CSD
|
* [23:16] Location of target Byte in EXT_CSD
|
||||||
* [15:08] Value Byte
|
* [15:08] Value Byte
|
||||||
* [07:03] Always 0
|
* [07:03] Always 0
|
||||||
* [02:00] Command Set
|
* [02:00] Command Set
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MMC status in R1, for native mode (SPI bits are different)
|
MMC status in R1, for native mode (SPI bits are different)
|
||||||
* Type
|
Type
|
||||||
* e : error bit
|
e : error bit
|
||||||
* s : status bit
|
s : status bit
|
||||||
* r : detected and set for the actual command response
|
r : detected and set for the actual command response
|
||||||
* x : detected and set during command execution. the host must poll
|
x : detected and set during command execution. the host must poll
|
||||||
* the card by sending status command in order to read these bits.
|
the card by sending status command in order to read these bits.
|
||||||
* Clear condition
|
Clear condition
|
||||||
* a : according to the card state
|
a : according to the card state
|
||||||
* b : always related to the previous command. Reception of a valid
|
b : always related to the previous command. Reception of
|
||||||
* command will clear it (with a delay of one command)
|
a valid command will clear it (with a delay of one command)
|
||||||
* c : clear by read
|
c : clear by read
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
|
#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
|
||||||
@@ -152,7 +146,6 @@
|
|||||||
#define R1_AKE_SEQ_ERROR (1 << 3)
|
#define R1_AKE_SEQ_ERROR (1 << 3)
|
||||||
|
|
||||||
/* R1_CURRENT_STATE 12:9 */
|
/* R1_CURRENT_STATE 12:9 */
|
||||||
#define R1_STATE(x) ((x) << 9)
|
|
||||||
#define R1_STATE_IDLE 0
|
#define R1_STATE_IDLE 0
|
||||||
#define R1_STATE_READY 1
|
#define R1_STATE_READY 1
|
||||||
#define R1_STATE_IDENT 2
|
#define R1_STATE_IDENT 2
|
||||||
@@ -164,9 +157,9 @@
|
|||||||
#define R1_STATE_DIS 8
|
#define R1_STATE_DIS 8
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MMC/SD in SPI mode reports R1 status always, and R2 for SEND_STATUS
|
* MMC/SD in SPI mode reports R1 status always, and R2 for SEND_STATUS
|
||||||
* R1 is the low order byte; R2 is the next highest byte, when present.
|
* R1 is the low order byte; R2 is the next highest byte, when present.
|
||||||
*/
|
*/
|
||||||
#define R1_SPI_IDLE (1 << 0)
|
#define R1_SPI_IDLE (1 << 0)
|
||||||
#define R1_SPI_ERASE_RESET (1 << 1)
|
#define R1_SPI_ERASE_RESET (1 << 1)
|
||||||
#define R1_SPI_ILLEGAL_COMMAND (1 << 2)
|
#define R1_SPI_ILLEGAL_COMMAND (1 << 2)
|
||||||
@@ -187,16 +180,13 @@
|
|||||||
#define R2_SPI_CSD_OVERWRITE R2_SPI_OUT_OF_RANGE
|
#define R2_SPI_CSD_OVERWRITE R2_SPI_OUT_OF_RANGE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OCR bits are mostly in host.h
|
* OCR bits are mostly in host.h
|
||||||
*/
|
*/
|
||||||
#define MMC_CARD_VDD_18 (1 << 7) /* Card VDD voltage 1.8 */
|
#define MMC_CARD_BUSY 0x80000000 /* Card Power up status bit */
|
||||||
#define MMC_CARD_VDD_27_34 (0x7F << 15) /* Card VDD voltage 2.7 ~ 3.4 */
|
|
||||||
#define MMC_CARD_CCS (1 << 30) /* Card Capacity status bit */
|
|
||||||
#define MMC_CARD_BUSY (1 << 31) /* Card Power up status bit */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Card Command Classes (CCC)
|
* Card Command Classes (CCC)
|
||||||
*/
|
*/
|
||||||
#define CCC_BASIC (1<<0) /* (0) Basic protocol functions */
|
#define CCC_BASIC (1<<0) /* (0) Basic protocol functions */
|
||||||
/* (CMD0,1,2,3,4,7,9,10,12,13,15) */
|
/* (CMD0,1,2,3,4,7,9,10,12,13,15) */
|
||||||
/* (and for SPI, CMD58,59) */
|
/* (and for SPI, CMD58,59) */
|
||||||
@@ -224,8 +214,8 @@
|
|||||||
/* (CMD?) */
|
/* (CMD?) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CSD field definitions
|
* CSD field definitions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CSD_STRUCT_VER_1_0 0 /* Valid for system specification 1.0 - 1.2 */
|
#define CSD_STRUCT_VER_1_0 0 /* Valid for system specification 1.0 - 1.2 */
|
||||||
#define CSD_STRUCT_VER_1_1 1 /* Valid for system specification 1.4 - 2.2 */
|
#define CSD_STRUCT_VER_1_1 1 /* Valid for system specification 1.4 - 2.2 */
|
||||||
@@ -239,8 +229,8 @@
|
|||||||
#define CSD_SPEC_VER_4 4 /* Implements system specification 4.0 - 4.1 */
|
#define CSD_SPEC_VER_4 4 /* Implements system specification 4.0 - 4.1 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EXT_CSD fields
|
* EXT_CSD fields
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define EXT_CSD_CMDQ_MODE_EN 15 /* R/W */
|
#define EXT_CSD_CMDQ_MODE_EN 15 /* R/W */
|
||||||
#define EXT_CSD_FLUSH_CACHE 32 /* W */
|
#define EXT_CSD_FLUSH_CACHE 32 /* W */
|
||||||
@@ -254,7 +244,6 @@
|
|||||||
#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
|
#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
|
||||||
#define EXT_CSD_PARTITION_SETTING_COMPLETED 155 /* R/W */
|
#define EXT_CSD_PARTITION_SETTING_COMPLETED 155 /* R/W */
|
||||||
#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
|
#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
|
||||||
#define EXT_CSD_MAX_ENH_SIZE_MULT 157 /* RO, 3 bytes */
|
|
||||||
#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
|
#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
|
||||||
#define EXT_CSD_HPI_MGMT 161 /* R/W */
|
#define EXT_CSD_HPI_MGMT 161 /* R/W */
|
||||||
#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
|
#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
|
||||||
@@ -318,8 +307,8 @@
|
|||||||
#define EXT_CSD_HPI_FEATURES 503 /* RO */
|
#define EXT_CSD_HPI_FEATURES 503 /* RO */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EXT_CSD field definitions
|
* EXT_CSD field definitions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define EXT_CSD_WR_REL_PARAM_EN (1<<2)
|
#define EXT_CSD_WR_REL_PARAM_EN (1<<2)
|
||||||
|
|
||||||
@@ -395,8 +384,8 @@
|
|||||||
#define EXT_CSD_PACKED_EVENT_EN (1<<3)
|
#define EXT_CSD_PACKED_EVENT_EN (1<<3)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EXCEPTION_EVENT_STATUS field
|
* EXCEPTION_EVENT_STATUS field
|
||||||
*/
|
*/
|
||||||
#define EXT_CSD_URGENT_BKOPS (1<<0)
|
#define EXT_CSD_URGENT_BKOPS (1<<0)
|
||||||
#define EXT_CSD_DYNCAP_NEEDED (1<<1)
|
#define EXT_CSD_DYNCAP_NEEDED (1<<1)
|
||||||
#define EXT_CSD_SYSPOOL_EXHAUSTED (1<<2)
|
#define EXT_CSD_SYSPOOL_EXHAUSTED (1<<2)
|
||||||
@@ -406,34 +395,34 @@
|
|||||||
#define EXT_CSD_PACKED_INDEXED_ERROR (1<<1)
|
#define EXT_CSD_PACKED_INDEXED_ERROR (1<<1)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BKOPS status level
|
* BKOPS status level
|
||||||
*/
|
*/
|
||||||
#define EXT_CSD_BKOPS_LEVEL_2 0x2
|
#define EXT_CSD_BKOPS_LEVEL_2 0x2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BKOPS modes
|
* BKOPS modes
|
||||||
*/
|
*/
|
||||||
#define EXT_CSD_MANUAL_BKOPS_MASK 0x01
|
#define EXT_CSD_MANUAL_BKOPS_MASK 0x01
|
||||||
#define EXT_CSD_AUTO_BKOPS_MASK 0x02
|
#define EXT_CSD_AUTO_BKOPS_MASK 0x02
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command Queue
|
* Command Queue
|
||||||
*/
|
*/
|
||||||
#define EXT_CSD_CMDQ_MODE_ENABLED (1<<0)
|
#define EXT_CSD_CMDQ_MODE_ENABLED (1<<0)
|
||||||
#define EXT_CSD_CMDQ_DEPTH_MASK 0x1F
|
#define EXT_CSD_CMDQ_DEPTH_MASK 0x1F
|
||||||
#define EXT_CSD_CMDQ_SUPPORTED (1<<0)
|
#define EXT_CSD_CMDQ_SUPPORTED (1<<0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MMC_SWITCH access modes
|
* MMC_SWITCH access modes
|
||||||
*/
|
*/
|
||||||
#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */
|
#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */
|
||||||
#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits which are 1 in value */
|
#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits which are 1 in value */
|
||||||
#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits which are 1 in value */
|
#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits which are 1 in value */
|
||||||
#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */
|
#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Erase/trim/discard
|
* Erase/trim/discard
|
||||||
*/
|
*/
|
||||||
#define MMC_ERASE_ARG 0x00000000
|
#define MMC_ERASE_ARG 0x00000000
|
||||||
#define MMC_SECURE_ERASE_ARG 0x80000000
|
#define MMC_SECURE_ERASE_ARG 0x80000000
|
||||||
#define MMC_TRIM_ARG 0x00000001
|
#define MMC_TRIM_ARG 0x00000001
|
||||||
@@ -443,9 +432,4 @@
|
|||||||
#define MMC_SECURE_ARGS 0x80000000
|
#define MMC_SECURE_ARGS 0x80000000
|
||||||
#define MMC_TRIM_ARGS 0x00008001
|
#define MMC_TRIM_ARGS 0x00008001
|
||||||
|
|
||||||
/*
|
#endif /* LINUX_MMC_MMC_H */
|
||||||
* Vendor definitions and structs
|
|
||||||
*/
|
|
||||||
#define MMC_SANDISK_HEALTH_REPORT 0x96C9D71C
|
|
||||||
|
|
||||||
#endif /* MMC_H */
|
|
||||||
|
|||||||
@@ -1,315 +0,0 @@
|
|||||||
/*
|
|
||||||
* eMMC BIS driver for Nintendo Switch
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019-2020 shchmue
|
|
||||||
* Copyright (c) 2019-2022 CTCaer
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <memory_map.h>
|
|
||||||
|
|
||||||
#include <mem/heap.h>
|
|
||||||
#include <sec/se.h>
|
|
||||||
#include <storage/emmc.h>
|
|
||||||
#include <storage/sd.h>
|
|
||||||
#include <storage/sdmmc.h>
|
|
||||||
#include <utils/types.h>
|
|
||||||
|
|
||||||
#define BIS_CLUSTER_SECTORS 32
|
|
||||||
#define BIS_CLUSTER_SIZE 16384
|
|
||||||
#define BIS_CACHE_MAX_ENTRIES 16384
|
|
||||||
#define BIS_CACHE_LOOKUP_TBL_EMPTY_ENTRY -1
|
|
||||||
|
|
||||||
typedef struct _cluster_cache_t
|
|
||||||
{
|
|
||||||
u32 cluster_idx; // Index of the cluster in the partition.
|
|
||||||
bool dirty; // Has been modified without write-back flag.
|
|
||||||
u8 data[BIS_CLUSTER_SIZE]; // The cached cluster itself. Aligned to 8 bytes for DMA engine.
|
|
||||||
} cluster_cache_t;
|
|
||||||
|
|
||||||
typedef struct _bis_cache_t
|
|
||||||
{
|
|
||||||
bool full;
|
|
||||||
bool enabled;
|
|
||||||
u32 dirty_cnt;
|
|
||||||
u32 top_idx;
|
|
||||||
u8 dma_buff[BIS_CLUSTER_SIZE]; // Aligned to 8 bytes for DMA engine.
|
|
||||||
cluster_cache_t clusters[];
|
|
||||||
} bis_cache_t;
|
|
||||||
|
|
||||||
static u8 ks_crypt = 0;
|
|
||||||
static u8 ks_tweak = 0;
|
|
||||||
static u32 emu_offset = 0;
|
|
||||||
static emmc_part_t *system_part = NULL;
|
|
||||||
static u32 *cache_lookup_tbl = (u32 *)NX_BIS_LOOKUP_ADDR;
|
|
||||||
static bis_cache_t *bis_cache = (bis_cache_t *)NX_BIS_CACHE_ADDR;
|
|
||||||
|
|
||||||
static int nx_emmc_bis_write_block(u32 sector, u32 count, void *buff, bool flush)
|
|
||||||
{
|
|
||||||
if (!system_part)
|
|
||||||
return 3; // Not ready.
|
|
||||||
|
|
||||||
int res;
|
|
||||||
u8 tweak[SE_KEY_128_SIZE] __attribute__((aligned(4)));
|
|
||||||
u32 cluster = sector / BIS_CLUSTER_SECTORS;
|
|
||||||
u32 aligned_sector = cluster * BIS_CLUSTER_SECTORS;
|
|
||||||
u32 sector_in_cluster = sector % BIS_CLUSTER_SECTORS;
|
|
||||||
u32 lookup_idx = cache_lookup_tbl[cluster];
|
|
||||||
bool is_cached = lookup_idx != (u32)BIS_CACHE_LOOKUP_TBL_EMPTY_ENTRY;
|
|
||||||
|
|
||||||
// Write to cached cluster.
|
|
||||||
if (is_cached)
|
|
||||||
{
|
|
||||||
if (buff)
|
|
||||||
memcpy(bis_cache->clusters[lookup_idx].data + sector_in_cluster * EMMC_BLOCKSIZE, buff, count * EMMC_BLOCKSIZE);
|
|
||||||
else
|
|
||||||
buff = bis_cache->clusters[lookup_idx].data;
|
|
||||||
if (!bis_cache->clusters[lookup_idx].dirty)
|
|
||||||
bis_cache->dirty_cnt++;
|
|
||||||
bis_cache->clusters[lookup_idx].dirty = true;
|
|
||||||
|
|
||||||
if (!flush)
|
|
||||||
return 0; // Success.
|
|
||||||
|
|
||||||
// Reset args to trigger a full cluster flush to emmc.
|
|
||||||
sector_in_cluster = 0;
|
|
||||||
sector = aligned_sector;
|
|
||||||
count = BIS_CLUSTER_SECTORS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encrypt cluster.
|
|
||||||
if (!se_aes_xts_crypt_sec_nx(ks_tweak, ks_crypt, ENCRYPT, cluster, tweak, true, sector_in_cluster, bis_cache->dma_buff, buff, count * EMMC_BLOCKSIZE))
|
|
||||||
return 1; // Encryption error.
|
|
||||||
|
|
||||||
// If not reading from cache, do a regular read and decrypt.
|
|
||||||
if (!emu_offset)
|
|
||||||
res = emmc_part_write(system_part, sector, count, bis_cache->dma_buff);
|
|
||||||
else
|
|
||||||
res = sdmmc_storage_write(&sd_storage, emu_offset + system_part->lba_start + sector, count, bis_cache->dma_buff);
|
|
||||||
if (!res)
|
|
||||||
return 1; // R/W error.
|
|
||||||
|
|
||||||
// Mark cache entry not dirty if write succeeds.
|
|
||||||
if (is_cached)
|
|
||||||
{
|
|
||||||
bis_cache->clusters[lookup_idx].dirty = false;
|
|
||||||
bis_cache->dirty_cnt--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0; // Success.
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _nx_emmc_bis_cluster_cache_init(bool enable_cache)
|
|
||||||
{
|
|
||||||
u32 cache_lookup_tbl_size = (system_part->lba_end - system_part->lba_start + 1) / BIS_CLUSTER_SECTORS * sizeof(*cache_lookup_tbl);
|
|
||||||
|
|
||||||
// Clear cache header.
|
|
||||||
memset(bis_cache, 0, sizeof(bis_cache_t));
|
|
||||||
|
|
||||||
// Clear cluster lookup table.
|
|
||||||
memset(cache_lookup_tbl, BIS_CACHE_LOOKUP_TBL_EMPTY_ENTRY, cache_lookup_tbl_size);
|
|
||||||
|
|
||||||
// Enable cache.
|
|
||||||
bis_cache->enabled = enable_cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _nx_emmc_bis_flush_cache()
|
|
||||||
{
|
|
||||||
if (!bis_cache->enabled || !bis_cache->dirty_cnt)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (u32 i = 0; i < bis_cache->top_idx && bis_cache->dirty_cnt; i++)
|
|
||||||
{
|
|
||||||
if (bis_cache->clusters[i].dirty) {
|
|
||||||
nx_emmc_bis_write_block(bis_cache->clusters[i].cluster_idx * BIS_CLUSTER_SECTORS, BIS_CLUSTER_SECTORS, NULL, true);
|
|
||||||
bis_cache->dirty_cnt--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_nx_emmc_bis_cluster_cache_init(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nx_emmc_bis_read_block_normal(u32 sector, u32 count, void *buff)
|
|
||||||
{
|
|
||||||
static u32 prev_cluster = -1;
|
|
||||||
static u32 prev_sector = 0;
|
|
||||||
static u8 tweak[SE_KEY_128_SIZE] __attribute__((aligned(4)));
|
|
||||||
|
|
||||||
int res;
|
|
||||||
bool regen_tweak = true;
|
|
||||||
u32 tweak_exp = 0;
|
|
||||||
u32 cluster = sector / BIS_CLUSTER_SECTORS;
|
|
||||||
u32 sector_in_cluster = sector % BIS_CLUSTER_SECTORS;
|
|
||||||
|
|
||||||
// If not reading from cache, do a regular read and decrypt.
|
|
||||||
if (!emu_offset)
|
|
||||||
res = emmc_part_read(system_part, sector, count, bis_cache->dma_buff);
|
|
||||||
else
|
|
||||||
res = sdmmc_storage_read(&sd_storage, emu_offset + system_part->lba_start + sector, count, bis_cache->dma_buff);
|
|
||||||
if (!res)
|
|
||||||
return 1; // R/W error.
|
|
||||||
|
|
||||||
if (prev_cluster != cluster) // Sector in different cluster than last read.
|
|
||||||
{
|
|
||||||
prev_cluster = cluster;
|
|
||||||
tweak_exp = sector_in_cluster;
|
|
||||||
}
|
|
||||||
else if (sector > prev_sector) // Sector in same cluster and past last sector.
|
|
||||||
{
|
|
||||||
// Calculates the new tweak using the saved one, reducing expensive _gf256_mul_x_le calls.
|
|
||||||
tweak_exp = sector - prev_sector - 1;
|
|
||||||
regen_tweak = false;
|
|
||||||
}
|
|
||||||
else // Sector in same cluster and before or same as last sector.
|
|
||||||
tweak_exp = sector_in_cluster;
|
|
||||||
|
|
||||||
// Maximum one cluster (1 XTS crypto block 16KB).
|
|
||||||
if (!se_aes_xts_crypt_sec_nx(ks_tweak, ks_crypt, DECRYPT, prev_cluster, tweak, regen_tweak, tweak_exp, buff, bis_cache->dma_buff, count * EMMC_BLOCKSIZE))
|
|
||||||
return 1; // R/W error.
|
|
||||||
|
|
||||||
prev_sector = sector + count - 1;
|
|
||||||
|
|
||||||
return 0; // Success.
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nx_emmc_bis_read_block_cached(u32 sector, u32 count, void *buff)
|
|
||||||
{
|
|
||||||
int res;
|
|
||||||
u8 cache_tweak[SE_KEY_128_SIZE] __attribute__((aligned(4)));
|
|
||||||
u32 cluster = sector / BIS_CLUSTER_SECTORS;
|
|
||||||
u32 cluster_sector = cluster * BIS_CLUSTER_SECTORS;
|
|
||||||
u32 sector_in_cluster = sector % BIS_CLUSTER_SECTORS;
|
|
||||||
u32 lookup_idx = cache_lookup_tbl[cluster];
|
|
||||||
|
|
||||||
// Read from cached cluster.
|
|
||||||
if (lookup_idx != (u32)BIS_CACHE_LOOKUP_TBL_EMPTY_ENTRY)
|
|
||||||
{
|
|
||||||
memcpy(buff, bis_cache->clusters[lookup_idx].data + sector_in_cluster * EMMC_BLOCKSIZE, count * EMMC_BLOCKSIZE);
|
|
||||||
|
|
||||||
return 0; // Success.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flush cache if full.
|
|
||||||
if (bis_cache->top_idx >= BIS_CACHE_MAX_ENTRIES)
|
|
||||||
_nx_emmc_bis_flush_cache();
|
|
||||||
|
|
||||||
// Set new cached cluster parameters.
|
|
||||||
bis_cache->clusters[bis_cache->top_idx].cluster_idx = cluster;
|
|
||||||
bis_cache->clusters[bis_cache->top_idx].dirty = false;
|
|
||||||
cache_lookup_tbl[cluster] = bis_cache->top_idx;
|
|
||||||
|
|
||||||
// Read the whole cluster the sector resides in.
|
|
||||||
if (!emu_offset)
|
|
||||||
res = emmc_part_read(system_part, cluster_sector, BIS_CLUSTER_SECTORS, bis_cache->dma_buff);
|
|
||||||
else
|
|
||||||
res = sdmmc_storage_read(&sd_storage, emu_offset + system_part->lba_start + cluster_sector, BIS_CLUSTER_SECTORS, bis_cache->dma_buff);
|
|
||||||
if (!res)
|
|
||||||
return 1; // R/W error.
|
|
||||||
|
|
||||||
// Decrypt cluster.
|
|
||||||
if (!se_aes_xts_crypt_sec_nx(ks_tweak, ks_crypt, DECRYPT, cluster, cache_tweak, true, 0, bis_cache->dma_buff, bis_cache->dma_buff, BIS_CLUSTER_SIZE))
|
|
||||||
return 1; // Decryption error.
|
|
||||||
|
|
||||||
// Copy to cluster cache.
|
|
||||||
memcpy(bis_cache->clusters[bis_cache->top_idx].data, bis_cache->dma_buff, BIS_CLUSTER_SIZE);
|
|
||||||
memcpy(buff, bis_cache->dma_buff + sector_in_cluster * EMMC_BLOCKSIZE, count * EMMC_BLOCKSIZE);
|
|
||||||
|
|
||||||
// Increment cache count.
|
|
||||||
bis_cache->top_idx++;
|
|
||||||
|
|
||||||
return 0; // Success.
|
|
||||||
}
|
|
||||||
|
|
||||||
static int nx_emmc_bis_read_block(u32 sector, u32 count, void *buff)
|
|
||||||
{
|
|
||||||
if (!system_part)
|
|
||||||
return 3; // Not ready.
|
|
||||||
|
|
||||||
if (bis_cache->enabled)
|
|
||||||
return nx_emmc_bis_read_block_cached(sector, count, buff);
|
|
||||||
else
|
|
||||||
return nx_emmc_bis_read_block_normal(sector, count, buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
int nx_emmc_bis_read(u32 sector, u32 count, void *buff)
|
|
||||||
{
|
|
||||||
u8 *buf = (u8 *)buff;
|
|
||||||
u32 curr_sct = sector;
|
|
||||||
|
|
||||||
while (count)
|
|
||||||
{
|
|
||||||
u32 sct_cnt = MIN(count, BIS_CLUSTER_SECTORS);
|
|
||||||
if (nx_emmc_bis_read_block(curr_sct, sct_cnt, buf))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
count -= sct_cnt;
|
|
||||||
curr_sct += sct_cnt;
|
|
||||||
buf += sct_cnt * EMMC_BLOCKSIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nx_emmc_bis_write(u32 sector, u32 count, void *buff)
|
|
||||||
{
|
|
||||||
u8 *buf = (u8 *)buff;
|
|
||||||
u32 curr_sct = sector;
|
|
||||||
|
|
||||||
while (count)
|
|
||||||
{
|
|
||||||
u32 sct_cnt = MIN(count, BIS_CLUSTER_SECTORS);
|
|
||||||
if (nx_emmc_bis_write_block(curr_sct, sct_cnt, buf, false))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
count -= sct_cnt;
|
|
||||||
curr_sct += sct_cnt;
|
|
||||||
buf += sct_cnt * EMMC_BLOCKSIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nx_emmc_bis_init(emmc_part_t *part, bool enable_cache, u32 emummc_offset)
|
|
||||||
{
|
|
||||||
system_part = part;
|
|
||||||
emu_offset = emummc_offset;
|
|
||||||
|
|
||||||
_nx_emmc_bis_cluster_cache_init(enable_cache);
|
|
||||||
|
|
||||||
if (!strcmp(part->name, "PRODINFO") || !strcmp(part->name, "PRODINFOF"))
|
|
||||||
{
|
|
||||||
ks_crypt = 0;
|
|
||||||
ks_tweak = 1;
|
|
||||||
}
|
|
||||||
else if (!strcmp(part->name, "SAFE"))
|
|
||||||
{
|
|
||||||
ks_crypt = 2;
|
|
||||||
ks_tweak = 3;
|
|
||||||
}
|
|
||||||
else if (!strcmp(part->name, "SYSTEM") || !strcmp(part->name, "USER"))
|
|
||||||
{
|
|
||||||
ks_crypt = 4;
|
|
||||||
ks_tweak = 5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
system_part = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nx_emmc_bis_end()
|
|
||||||
{
|
|
||||||
_nx_emmc_bis_flush_cache();
|
|
||||||
system_part = NULL;
|
|
||||||
}
|
|
||||||
57
bdk/storage/nx_sd.h
Normal file
57
bdk/storage/nx_sd.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 naehrwert
|
||||||
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NX_SD_H
|
||||||
|
#define NX_SD_H
|
||||||
|
|
||||||
|
#include <storage/sdmmc.h>
|
||||||
|
#include <storage/sdmmc_driver.h>
|
||||||
|
#include <libs/fatfs/ff.h>
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SD_INIT_FAIL = 0,
|
||||||
|
SD_1BIT_HS25 = 1,
|
||||||
|
SD_4BIT_HS25 = 2,
|
||||||
|
SD_UHS_SDR82 = 3,
|
||||||
|
SD_UHS_SDR104 = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SD_ERROR_INIT_FAIL = 0,
|
||||||
|
SD_ERROR_RW_FAIL = 1,
|
||||||
|
SD_ERROR_RW_RETRY = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
extern sdmmc_t sd_sdmmc;
|
||||||
|
extern sdmmc_storage_t sd_storage;
|
||||||
|
extern FATFS sd_fs;
|
||||||
|
|
||||||
|
void sd_error_count_increment(u8 type);
|
||||||
|
u16 *sd_get_error_count();
|
||||||
|
bool sd_get_card_removed();
|
||||||
|
u32 sd_get_mode();
|
||||||
|
int sd_init_retry(bool power_cycle);
|
||||||
|
bool sd_initialize(bool power_cycle);
|
||||||
|
bool sd_mount();
|
||||||
|
void sd_unmount();
|
||||||
|
void sd_end();
|
||||||
|
void *sd_file_read(const char *path, u32 *fsize);
|
||||||
|
int sd_save_to_file(void *buf, u32 size, const char *filename);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Ramdisk driver for Tegra X1
|
* Ramdisk driver for Tegra X1
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -19,42 +19,23 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "ramdisk.h"
|
#include "ramdisk.h"
|
||||||
#include <libs/fatfs/diskio.h>
|
|
||||||
#include <libs/fatfs/ff.h>
|
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
#include <memory_map.h>
|
#include <memory_map.h>
|
||||||
|
|
||||||
static u32 disk_size = 0;
|
int ram_disk_init(FATFS *ram_fs)
|
||||||
|
|
||||||
int ram_disk_init(void *ram_fs, u32 ramdisk_size)
|
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res;
|
||||||
disk_size = ramdisk_size;
|
u8 *buf = malloc(0x400000);
|
||||||
FATFS *ram_fatfs = (FATFS *)ram_fs;
|
|
||||||
|
|
||||||
// If ramdisk is not raw, format it.
|
f_mount(NULL, "ram:", 1); // Unmount ramdisk.
|
||||||
if (ram_fs)
|
|
||||||
{
|
|
||||||
u8 *buf = malloc(0x400000);
|
|
||||||
|
|
||||||
// Set ramdisk size.
|
res = f_mkfs("ram:", FM_EXFAT, RAMDISK_CLUSTER_SZ, buf, 0x400000); // Format as exFAT w/ 32KB cluster.
|
||||||
ramdisk_size >>= 9;
|
if (!res)
|
||||||
disk_set_info(DRIVE_RAM, SET_SECTOR_COUNT, &ramdisk_size);
|
res = f_mount(ram_fs, "ram:", 1); // Mount ramdisk.
|
||||||
|
|
||||||
// Unmount ramdisk.
|
free(buf);
|
||||||
f_mount(NULL, "ram:", 1);
|
|
||||||
|
|
||||||
// Format as exFAT w/ 32KB cluster with no MBR.
|
|
||||||
res = f_mkfs("ram:", FM_EXFAT | FM_SFD, RAMDISK_CLUSTER_SZ, buf, 0x400000);
|
|
||||||
|
|
||||||
// Mount ramdisk.
|
|
||||||
if (!res)
|
|
||||||
res = f_mount(ram_fatfs, "ram:", 1);
|
|
||||||
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -64,7 +45,7 @@ int ram_disk_read(u32 sector, u32 sector_count, void *buf)
|
|||||||
u32 sector_off = RAM_DISK_ADDR + (sector << 9);
|
u32 sector_off = RAM_DISK_ADDR + (sector << 9);
|
||||||
u32 bytes_count = sector_count << 9;
|
u32 bytes_count = sector_count << 9;
|
||||||
|
|
||||||
if ((sector_off - RAM_DISK_ADDR) > disk_size)
|
if ((sector_off - RAM_DISK_ADDR) > RAM_DISK_SZ)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
memcpy(buf, (void *)sector_off, bytes_count);
|
memcpy(buf, (void *)sector_off, bytes_count);
|
||||||
@@ -77,7 +58,7 @@ int ram_disk_write(u32 sector, u32 sector_count, const void *buf)
|
|||||||
u32 sector_off = RAM_DISK_ADDR + (sector << 9);
|
u32 sector_off = RAM_DISK_ADDR + (sector << 9);
|
||||||
u32 bytes_count = sector_count << 9;
|
u32 bytes_count = sector_count << 9;
|
||||||
|
|
||||||
if ((sector_off - RAM_DISK_ADDR) > disk_size)
|
if ((sector_off - RAM_DISK_ADDR) > RAM_DISK_SZ)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
memcpy((void *)sector_off, buf, bytes_count);
|
memcpy((void *)sector_off, buf, bytes_count);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Ramdisk driver for Tegra X1
|
* Ramdisk driver for Tegra X1
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019-2021 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -19,11 +19,11 @@
|
|||||||
#ifndef RAM_DISK_H
|
#ifndef RAM_DISK_H
|
||||||
#define RAM_DISK_H
|
#define RAM_DISK_H
|
||||||
|
|
||||||
#include <utils/types.h>
|
#include <libs/fatfs/ff.h>
|
||||||
|
|
||||||
#define RAMDISK_CLUSTER_SZ 32768
|
#define RAMDISK_CLUSTER_SZ 32768
|
||||||
|
|
||||||
int ram_disk_init(void *ram_fs, u32 ramdisk_size);
|
int ram_disk_init(FATFS *ram_fs);
|
||||||
int ram_disk_read(u32 sector, u32 sector_count, void *buf);
|
int ram_disk_read(u32 sector, u32 sector_count, void *buf);
|
||||||
int ram_disk_write(u32 sector, u32 sector_count, const void *buf);
|
int ram_disk_write(u32 sector, u32 sector_count, const void *buf);
|
||||||
|
|
||||||
|
|||||||
171
bdk/storage/sd.h
171
bdk/storage/sd.h
@@ -1,60 +1,131 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2005-2007 Pierre Ossman, All Rights Reserved.
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* it under the terms of the GNU General Public License as published by
|
||||||
* version 2, as published by the Free Software Foundation.
|
* the Free Software Foundation; either version 2 of the License, or (at
|
||||||
*
|
* your option) any later version.
|
||||||
* This program is distributed in the hope 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SD_H
|
#ifndef MMC_SD_H
|
||||||
#define SD_H
|
#define MMC_SD_H
|
||||||
|
|
||||||
#include <storage/sdmmc.h>
|
/* SD commands type argument response */
|
||||||
#include <storage/sdmmc_driver.h>
|
/* class 0 */
|
||||||
#include <libs/fatfs/ff.h>
|
/* This is basically the same command as for MMC with some quirks. */
|
||||||
|
#define SD_SEND_RELATIVE_ADDR 3 /* bcr R6 */
|
||||||
|
#define SD_SEND_IF_COND 8 /* bcr [11:0] See below R7 */
|
||||||
|
#define SD_SWITCH_VOLTAGE 11 /* ac R1 */
|
||||||
|
|
||||||
enum
|
/* class 10 */
|
||||||
{
|
#define SD_SWITCH 6 /* adtc [31:0] See below R1 */
|
||||||
SD_INIT_FAIL = 0,
|
|
||||||
SD_1BIT_HS25 = 1,
|
|
||||||
SD_4BIT_HS25 = 2,
|
|
||||||
SD_UHS_SDR82 = 3,
|
|
||||||
SD_UHS_SDR104 = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
/* class 5 */
|
||||||
{
|
#define SD_ERASE_WR_BLK_START 32 /* ac [31:0] data addr R1 */
|
||||||
SD_ERROR_INIT_FAIL = 0,
|
#define SD_ERASE_WR_BLK_END 33 /* ac [31:0] data addr R1 */
|
||||||
SD_ERROR_RW_FAIL = 1,
|
|
||||||
SD_ERROR_RW_RETRY = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
extern sdmmc_t sd_sdmmc;
|
/* Application commands */
|
||||||
extern sdmmc_storage_t sd_storage;
|
#define SD_APP_SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */
|
||||||
extern FATFS sd_fs;
|
#define SD_APP_SD_STATUS 13 /* adtc R1 */
|
||||||
|
#define SD_APP_SEND_NUM_WR_BLKS 22 /* adtc R1 */
|
||||||
|
#define SD_APP_OP_COND 41 /* bcr [31:0] OCR R3 */
|
||||||
|
#define SD_APP_SET_CLR_CARD_DETECT 42
|
||||||
|
#define SD_APP_SEND_SCR 51 /* adtc R1 */
|
||||||
|
|
||||||
void sd_error_count_increment(u8 type);
|
/* OCR bit definitions */
|
||||||
u16 *sd_get_error_count();
|
#define SD_OCR_CCS (1 << 30) /* Card Capacity Status */
|
||||||
bool sd_get_card_removed();
|
#define SD_OCR_XPC (1 << 28) /* SDXC power control */
|
||||||
bool sd_get_card_initialized();
|
#define SD_OCR_S18R (1 << 24) /* 1.8V switching request */
|
||||||
bool sd_get_card_mounted();
|
#define SD_ROCR_S18A SD_OCR_S18R /* 1.8V switching accepted by card */
|
||||||
u32 sd_get_mode();
|
#define SD_OCR_VDD_27_34 (0x7F << 15) /* VDD voltage 2.7 ~ 3.4 */
|
||||||
int sd_init_retry(bool power_cycle);
|
#define SD_OCR_VDD_32_33 (1 << 20) /* VDD voltage 3.2 ~ 3.3 */
|
||||||
bool sd_initialize(bool power_cycle);
|
#define SD_OCR_VDD_18 (1 << 7) /* VDD voltage 1.8 */
|
||||||
bool sd_mount();
|
|
||||||
void sd_unmount();
|
|
||||||
void sd_end();
|
|
||||||
bool sd_is_gpt();
|
|
||||||
void *sd_file_read(const char *path, u32 *fsize);
|
|
||||||
int sd_save_to_file(void *buf, u32 size, const char *filename);
|
|
||||||
|
|
||||||
#endif
|
#define SD_VHD_27_36 (1 << 8) /* VDD voltage 2.7 ~ 3.6 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SD_SWITCH argument format:
|
||||||
|
*
|
||||||
|
* [31] Check (0) or switch (1)
|
||||||
|
* [30:24] Reserved (0)
|
||||||
|
* [23:20] Function group 6
|
||||||
|
* [19:16] Function group 5
|
||||||
|
* [15:12] Function group 4
|
||||||
|
* [11:8] Function group 3
|
||||||
|
* [7:4] Function group 2
|
||||||
|
* [3:0] Function group 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SD_SEND_IF_COND argument format:
|
||||||
|
*
|
||||||
|
* [31:12] Reserved (0)
|
||||||
|
* [11:8] Host Voltage Supply Flags
|
||||||
|
* [7:0] Check Pattern (0xAA)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SCR field definitions
|
||||||
|
*/
|
||||||
|
#define SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
|
||||||
|
#define SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
|
||||||
|
#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00-3.0X */
|
||||||
|
#define SD_SCR_BUS_WIDTH_1 (1<<0)
|
||||||
|
#define SD_SCR_BUS_WIDTH_4 (1<<2)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SD bus widths
|
||||||
|
*/
|
||||||
|
#define SD_BUS_WIDTH_1 0
|
||||||
|
#define SD_BUS_WIDTH_4 2
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SD bus speeds
|
||||||
|
*/
|
||||||
|
#define UHS_SDR12_BUS_SPEED 0
|
||||||
|
#define HIGH_SPEED_BUS_SPEED 1
|
||||||
|
#define UHS_SDR25_BUS_SPEED 1
|
||||||
|
#define UHS_SDR50_BUS_SPEED 2
|
||||||
|
#define UHS_SDR104_BUS_SPEED 3
|
||||||
|
#define UHS_DDR50_BUS_SPEED 4
|
||||||
|
#define HS400_BUS_SPEED 5
|
||||||
|
|
||||||
|
#define SD_MODE_HIGH_SPEED (1 << HIGH_SPEED_BUS_SPEED)
|
||||||
|
#define SD_MODE_UHS_SDR12 (1 << UHS_SDR12_BUS_SPEED)
|
||||||
|
#define SD_MODE_UHS_SDR25 (1 << UHS_SDR25_BUS_SPEED)
|
||||||
|
#define SD_MODE_UHS_SDR50 (1 << UHS_SDR50_BUS_SPEED)
|
||||||
|
#define SD_MODE_UHS_SDR104 (1 << UHS_SDR104_BUS_SPEED)
|
||||||
|
#define SD_MODE_UHS_DDR50 (1 << UHS_DDR50_BUS_SPEED)
|
||||||
|
|
||||||
|
#define SD_DRIVER_TYPE_B 0x01
|
||||||
|
#define SD_DRIVER_TYPE_A 0x02
|
||||||
|
|
||||||
|
#define SD_SET_CURRENT_LIMIT_200 0
|
||||||
|
#define SD_SET_CURRENT_LIMIT_400 1
|
||||||
|
#define SD_SET_CURRENT_LIMIT_600 2
|
||||||
|
#define SD_SET_CURRENT_LIMIT_800 3
|
||||||
|
|
||||||
|
#define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200)
|
||||||
|
#define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400)
|
||||||
|
#define SD_MAX_CURRENT_600 (1 << SD_SET_CURRENT_LIMIT_600)
|
||||||
|
#define SD_MAX_CURRENT_800 (1 << SD_SET_CURRENT_LIMIT_800)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SD_SWITCH mode
|
||||||
|
*/
|
||||||
|
#define SD_SWITCH_CHECK 0
|
||||||
|
#define SD_SWITCH_SET 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SD_SWITCH function groups
|
||||||
|
*/
|
||||||
|
#define SD_SWITCH_GRP_ACCESS 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SD_SWITCH access modes
|
||||||
|
*/
|
||||||
|
#define SD_SWITCH_ACCESS_DEF 0
|
||||||
|
#define SD_SWITCH_ACCESS_HS 1
|
||||||
|
|
||||||
|
#endif /* LINUX_MMC_SD_H */
|
||||||
|
|||||||
@@ -1,150 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2005-2007 Pierre Ossman, All Rights Reserved.
|
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SD_DEF_H
|
|
||||||
#define SD_DEF_H
|
|
||||||
|
|
||||||
/* SD commands type argument response */
|
|
||||||
/* class 0 */
|
|
||||||
/* This is basically the same command as for MMC with some quirks. */
|
|
||||||
#define SD_SEND_RELATIVE_ADDR 3 /* bcr R6 */
|
|
||||||
#define SD_SEND_IF_COND 8 /* bcr [11:0] See below R7 */
|
|
||||||
#define SD_SWITCH_VOLTAGE 11 /* ac R1 */
|
|
||||||
/* class 10 */
|
|
||||||
#define SD_SWITCH 6 /* adtc [31:0] See below R1 */
|
|
||||||
/* class 5 */
|
|
||||||
#define SD_ERASE_WR_BLK_START 32 /* ac [31:0] data addr R1 */
|
|
||||||
#define SD_ERASE_WR_BLK_END 33 /* ac [31:0] data addr R1 */
|
|
||||||
|
|
||||||
/* Application commands */
|
|
||||||
#define SD_APP_SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */
|
|
||||||
#define SD_APP_SD_STATUS 13 /* adtc R1 */
|
|
||||||
#define SD_APP_SEND_NUM_WR_BLKS 22 /* adtc R1 */
|
|
||||||
#define SD_APP_OP_COND 41 /* bcr [31:0] OCR R3 */
|
|
||||||
#define SD_APP_SET_CLR_CARD_DETECT 42 /* adtc R1 */
|
|
||||||
#define SD_APP_SEND_SCR 51 /* adtc R1 */
|
|
||||||
|
|
||||||
/* Application secure commands */
|
|
||||||
#define SD_APP_SECURE_READ_MULTI_BLOCK 18 /* adtc R1 */
|
|
||||||
#define SD_APP_SECURE_WRITE_MULTI_BLOCK 25 /* adtc R1 */
|
|
||||||
#define SD_APP_SECURE_WRITE_MKB 26 /* adtc R1 */
|
|
||||||
#define SD_APP_SECURE_ERASE 38 /* adtc R1b */
|
|
||||||
#define SD_APP_GET_MKB 43 /* adtc [31:0] See below R1 */
|
|
||||||
#define SD_APP_GET_MID 44 /* adtc R1 */
|
|
||||||
#define SD_APP_SET_CER_RN1 45 /* adtc R1 */
|
|
||||||
#define SD_APP_GET_CER_RN2 46 /* adtc R1 */
|
|
||||||
#define SD_APP_SET_CER_RES2 47 /* adtc R1 */
|
|
||||||
#define SD_APP_GET_CER_RES1 48 /* adtc R1 */
|
|
||||||
#define SD_APP_CHANGE_SECURE_AREA 49 /* adtc R1b */
|
|
||||||
|
|
||||||
/* OCR bit definitions */
|
|
||||||
#define SD_OCR_VDD_18 (1 << 7) /* VDD voltage 1.8 */
|
|
||||||
#define SD_VHD_27_36 (1 << 8) /* VDD voltage 2.7 ~ 3.6 */
|
|
||||||
#define SD_OCR_VDD_27_34 (0x7F << 15) /* VDD voltage 2.7 ~ 3.4 */
|
|
||||||
#define SD_OCR_VDD_32_33 (1 << 20) /* VDD voltage 3.2 ~ 3.3 */
|
|
||||||
#define SD_OCR_S18R (1 << 24) /* 1.8V switching request */
|
|
||||||
#define SD_ROCR_S18A SD_OCR_S18R /* 1.8V switching accepted by card */
|
|
||||||
#define SD_OCR_XPC (1 << 28) /* SDXC power control */
|
|
||||||
#define SD_OCR_CCS (1 << 30) /* Card Capacity Status */
|
|
||||||
#define SD_OCR_BUSY (1 << 31) /* Card Power up Status */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH argument format:
|
|
||||||
*
|
|
||||||
* [31] Check (0) or switch (1)
|
|
||||||
* [30:24] Reserved (0)
|
|
||||||
* [23:20] Function group 6
|
|
||||||
* [19:16] Function group 5
|
|
||||||
* [15:12] Function group 4
|
|
||||||
* [11:8] Function group 3
|
|
||||||
* [7:4] Function group 2
|
|
||||||
* [3:0] Function group 1
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SEND_IF_COND argument format:
|
|
||||||
*
|
|
||||||
* [31:12] Reserved (0)
|
|
||||||
* [11:8] Host Voltage Supply Flags
|
|
||||||
* [7:0] Check Pattern (0xAA)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_APP_GET_MKB argument format:
|
|
||||||
*
|
|
||||||
* [31:24] Number of blocks to read (512 block size)
|
|
||||||
* [23:16] MKB ID
|
|
||||||
* [15:0] Block offset
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SCR field definitions
|
|
||||||
*/
|
|
||||||
#define SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
|
|
||||||
#define SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
|
|
||||||
#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00-3.0X */
|
|
||||||
#define SD_SCR_BUS_WIDTH_1 (1<<0)
|
|
||||||
#define SD_SCR_BUS_WIDTH_4 (1<<2)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD bus widths
|
|
||||||
*/
|
|
||||||
#define SD_BUS_WIDTH_1 0
|
|
||||||
#define SD_BUS_WIDTH_4 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD bus speeds
|
|
||||||
*/
|
|
||||||
#define UHS_SDR12_BUS_SPEED 0
|
|
||||||
#define HIGH_SPEED_BUS_SPEED 1
|
|
||||||
#define UHS_SDR25_BUS_SPEED 1
|
|
||||||
#define UHS_SDR50_BUS_SPEED 2
|
|
||||||
#define UHS_SDR104_BUS_SPEED 3
|
|
||||||
#define UHS_DDR50_BUS_SPEED 4
|
|
||||||
#define HS400_BUS_SPEED 5
|
|
||||||
|
|
||||||
#define SD_MODE_HIGH_SPEED (1 << HIGH_SPEED_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR12 (1 << UHS_SDR12_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR25 (1 << UHS_SDR25_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR50 (1 << UHS_SDR50_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_SDR104 (1 << UHS_SDR104_BUS_SPEED)
|
|
||||||
#define SD_MODE_UHS_DDR50 (1 << UHS_DDR50_BUS_SPEED)
|
|
||||||
|
|
||||||
#define SD_DRIVER_TYPE_B 0x01
|
|
||||||
#define SD_DRIVER_TYPE_A 0x02
|
|
||||||
|
|
||||||
#define SD_SET_CURRENT_LIMIT_200 0
|
|
||||||
#define SD_SET_CURRENT_LIMIT_400 1
|
|
||||||
#define SD_SET_CURRENT_LIMIT_600 2
|
|
||||||
#define SD_SET_CURRENT_LIMIT_800 3
|
|
||||||
|
|
||||||
#define SD_MAX_CURRENT_200 (1 << SD_SET_CURRENT_LIMIT_200)
|
|
||||||
#define SD_MAX_CURRENT_400 (1 << SD_SET_CURRENT_LIMIT_400)
|
|
||||||
#define SD_MAX_CURRENT_600 (1 << SD_SET_CURRENT_LIMIT_600)
|
|
||||||
#define SD_MAX_CURRENT_800 (1 << SD_SET_CURRENT_LIMIT_800)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH mode
|
|
||||||
*/
|
|
||||||
#define SD_SWITCH_CHECK 0
|
|
||||||
#define SD_SWITCH_SET 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH function groups
|
|
||||||
*/
|
|
||||||
#define SD_SWITCH_GRP_ACCESS 0
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SD_SWITCH access modes
|
|
||||||
*/
|
|
||||||
#define SD_SWITCH_ACCESS_DEF 0
|
|
||||||
#define SD_SWITCH_ACCESS_HS 1
|
|
||||||
|
|
||||||
#endif /* SD_DEF_H */
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -16,11 +16,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <storage/emmc.h>
|
|
||||||
#include <storage/sdmmc.h>
|
#include <storage/sdmmc.h>
|
||||||
#include <storage/mmc.h>
|
#include <storage/mmc.h>
|
||||||
|
#include <storage/nx_sd.h>
|
||||||
#include <storage/sd.h>
|
#include <storage/sd.h>
|
||||||
#include <storage/sd_def.h>
|
|
||||||
#include <memory_map.h>
|
#include <memory_map.h>
|
||||||
#include <gfx_utils.h>
|
#include <gfx_utils.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
@@ -43,8 +42,8 @@ static inline u32 unstuff_bits(u32 *resp, u32 start, u32 size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Common functions for SD and MMC.
|
* Common functions for SD and MMC.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int _sdmmc_storage_check_card_status(u32 res)
|
static int _sdmmc_storage_check_card_status(u32 res)
|
||||||
{
|
{
|
||||||
@@ -89,20 +88,20 @@ static int _sdmmc_storage_execute_cmd_type1(sdmmc_storage_t *storage, u32 cmd, u
|
|||||||
|
|
||||||
static int _sdmmc_storage_go_idle_state(sdmmc_storage_t *storage)
|
static int _sdmmc_storage_go_idle_state(sdmmc_storage_t *storage)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmd;
|
||||||
sdmmc_init_cmd(&cmdbuf, MMC_GO_IDLE_STATE, 0, SDMMC_RSP_TYPE_0, 0);
|
sdmmc_init_cmd(&cmd, MMC_GO_IDLE_STATE, 0, SDMMC_RSP_TYPE_0, 0);
|
||||||
|
|
||||||
return sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL);
|
return sdmmc_execute_cmd(storage->sdmmc, &cmd, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _sdmmc_storage_get_cid(sdmmc_storage_t *storage)
|
static int _sdmmc_storage_get_cid(sdmmc_storage_t *storage, void *buf)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmd;
|
||||||
sdmmc_init_cmd(&cmdbuf, MMC_ALL_SEND_CID, 0, SDMMC_RSP_TYPE_2, 0);
|
sdmmc_init_cmd(&cmd, MMC_ALL_SEND_CID, 0, SDMMC_RSP_TYPE_2, 0);
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmd, NULL, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sdmmc_get_rsp(storage->sdmmc, (u32 *)storage->raw_cid, 16, SDMMC_RSP_TYPE_2);
|
sdmmc_get_rsp(storage->sdmmc, buf, 16, SDMMC_RSP_TYPE_2);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -112,14 +111,14 @@ static int _sdmmc_storage_select_card(sdmmc_storage_t *storage)
|
|||||||
return _sdmmc_storage_execute_cmd_type1(storage, MMC_SELECT_CARD, storage->rca << 16, 1, R1_SKIP_STATE_CHECK);
|
return _sdmmc_storage_execute_cmd_type1(storage, MMC_SELECT_CARD, storage->rca << 16, 1, R1_SKIP_STATE_CHECK);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _sdmmc_storage_get_csd(sdmmc_storage_t *storage)
|
static int _sdmmc_storage_get_csd(sdmmc_storage_t *storage, void *buf)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmdbuf;
|
||||||
sdmmc_init_cmd(&cmdbuf, MMC_SEND_CSD, storage->rca << 16, SDMMC_RSP_TYPE_2, 0);
|
sdmmc_init_cmd(&cmdbuf, MMC_SEND_CSD, storage->rca << 16, SDMMC_RSP_TYPE_2, 0);
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sdmmc_get_rsp(storage->sdmmc, (u32 *)storage->raw_csd, 16, SDMMC_RSP_TYPE_2);
|
sdmmc_get_rsp(storage->sdmmc, buf, 16, SDMMC_RSP_TYPE_2);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -140,70 +139,12 @@ static int _sdmmc_storage_check_status(sdmmc_storage_t *storage)
|
|||||||
return _sdmmc_storage_get_status(storage, &tmp, 0);
|
return _sdmmc_storage_get_status(storage, &tmp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdmmc_storage_execute_vendor_cmd(sdmmc_storage_t *storage, u32 arg)
|
|
||||||
{
|
|
||||||
sdmmc_cmd_t cmdbuf;
|
|
||||||
sdmmc_init_cmd(&cmdbuf, MMC_VENDOR_62_CMD, arg, SDMMC_RSP_TYPE_1, 1);
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, 0, 0))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
u32 resp;
|
|
||||||
sdmmc_get_rsp(storage->sdmmc, &resp, 4, SDMMC_RSP_TYPE_1);
|
|
||||||
|
|
||||||
resp = -1;
|
|
||||||
u32 timeout = get_tmr_ms() + 1500;
|
|
||||||
while (resp != (R1_READY_FOR_DATA | R1_STATE(R1_STATE_TRAN)))
|
|
||||||
{
|
|
||||||
_sdmmc_storage_get_status(storage, &resp, 0);
|
|
||||||
|
|
||||||
if (get_tmr_ms() > timeout)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _sdmmc_storage_check_card_status(resp);
|
|
||||||
}
|
|
||||||
|
|
||||||
int sdmmc_storage_vendor_sandisk_report(sdmmc_storage_t *storage, void *buf)
|
|
||||||
{
|
|
||||||
// Request health report.
|
|
||||||
if (!sdmmc_storage_execute_vendor_cmd(storage, MMC_SANDISK_HEALTH_REPORT))
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
u32 tmp = 0;
|
|
||||||
sdmmc_cmd_t cmdbuf;
|
|
||||||
sdmmc_req_t reqbuf;
|
|
||||||
|
|
||||||
sdmmc_init_cmd(&cmdbuf, MMC_VENDOR_63_CMD, 0, SDMMC_RSP_TYPE_1, 0); // similar to CMD17 with arg 0x0.
|
|
||||||
|
|
||||||
reqbuf.buf = buf;
|
|
||||||
reqbuf.num_sectors = 1;
|
|
||||||
reqbuf.blksize = 512;
|
|
||||||
reqbuf.is_write = 0;
|
|
||||||
reqbuf.is_multi_block = 0;
|
|
||||||
reqbuf.is_auto_stop_trn = 0;
|
|
||||||
|
|
||||||
u32 blkcnt_out;
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, &blkcnt_out))
|
|
||||||
{
|
|
||||||
sdmmc_stop_transmission(storage->sdmmc, &tmp);
|
|
||||||
_sdmmc_storage_get_status(storage, &tmp, 0);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _sdmmc_storage_readwrite_ex(sdmmc_storage_t *storage, u32 *blkcnt_out, u32 sector, u32 num_sectors, void *buf, u32 is_write)
|
static int _sdmmc_storage_readwrite_ex(sdmmc_storage_t *storage, u32 *blkcnt_out, u32 sector, u32 num_sectors, void *buf, u32 is_write)
|
||||||
{
|
{
|
||||||
u32 tmp = 0;
|
u32 tmp = 0;
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmdbuf;
|
||||||
sdmmc_req_t reqbuf;
|
sdmmc_req_t reqbuf;
|
||||||
|
|
||||||
// If SDSC convert block address to byte address.
|
|
||||||
if (!storage->has_sector_access)
|
|
||||||
sector <<= 9;
|
|
||||||
|
|
||||||
sdmmc_init_cmd(&cmdbuf, is_write ? MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK, sector, SDMMC_RSP_TYPE_1, 0);
|
sdmmc_init_cmd(&cmdbuf, is_write ? MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK, sector, SDMMC_RSP_TYPE_1, 0);
|
||||||
|
|
||||||
reqbuf.buf = buf;
|
reqbuf.buf = buf;
|
||||||
@@ -211,7 +152,7 @@ static int _sdmmc_storage_readwrite_ex(sdmmc_storage_t *storage, u32 *blkcnt_out
|
|||||||
reqbuf.blksize = 512;
|
reqbuf.blksize = 512;
|
||||||
reqbuf.is_write = is_write;
|
reqbuf.is_write = is_write;
|
||||||
reqbuf.is_multi_block = 1;
|
reqbuf.is_multi_block = 1;
|
||||||
reqbuf.is_auto_stop_trn = 1;
|
reqbuf.is_auto_cmd12 = 1;
|
||||||
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, blkcnt_out))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, blkcnt_out))
|
||||||
{
|
{
|
||||||
@@ -265,36 +206,20 @@ reinit_try:
|
|||||||
msleep(50);
|
msleep(50);
|
||||||
} while (retries);
|
} while (retries);
|
||||||
|
|
||||||
// Disk IO failure! Reinit SD/EMMC to a lower speed.
|
// Disk IO failure! Reinit SD Card to a lower speed.
|
||||||
if (storage->sdmmc->id == SDMMC_1 || storage->sdmmc->id == SDMMC_4)
|
if (storage->sdmmc->id == SDMMC_1)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (storage->sdmmc->id == SDMMC_1)
|
sd_error_count_increment(SD_ERROR_RW_FAIL);
|
||||||
{
|
|
||||||
sd_error_count_increment(SD_ERROR_RW_FAIL);
|
|
||||||
|
|
||||||
if (first_reinit)
|
if (first_reinit)
|
||||||
res = sd_initialize(true);
|
res = sd_initialize(true);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
res = sd_init_retry(true);
|
|
||||||
if (!res)
|
|
||||||
sd_error_count_increment(SD_ERROR_INIT_FAIL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (storage->sdmmc->id == SDMMC_4)
|
|
||||||
{
|
{
|
||||||
emmc_error_count_increment(EMMC_ERROR_RW_FAIL);
|
res = sd_init_retry(true);
|
||||||
|
if (!res)
|
||||||
if (first_reinit)
|
sd_error_count_increment(SD_ERROR_INIT_FAIL);
|
||||||
res = emmc_initialize(true);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
res = emmc_init_retry(true);
|
|
||||||
if (!res)
|
|
||||||
emmc_error_count_increment(EMMC_ERROR_INIT_FAIL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset values for a retry.
|
// Reset values for a retry.
|
||||||
@@ -302,7 +227,7 @@ reinit_try:
|
|||||||
retries = 3;
|
retries = 3;
|
||||||
first_reinit = false;
|
first_reinit = false;
|
||||||
|
|
||||||
// If successful reinit, restart xfer.
|
// If succesful reinit, restart xfer.
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
bbuf = (u8 *)buf;
|
bbuf = (u8 *)buf;
|
||||||
@@ -363,25 +288,25 @@ int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, v
|
|||||||
|
|
||||||
static int _mmc_storage_get_op_cond_inner(sdmmc_storage_t *storage, u32 *pout, u32 power)
|
static int _mmc_storage_get_op_cond_inner(sdmmc_storage_t *storage, u32 *pout, u32 power)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmd;
|
||||||
|
|
||||||
u32 arg = 0;
|
u32 arg = 0;
|
||||||
switch (power)
|
switch (power)
|
||||||
{
|
{
|
||||||
case SDMMC_POWER_1_8:
|
case SDMMC_POWER_1_8:
|
||||||
arg = MMC_CARD_CCS | MMC_CARD_VDD_18;
|
arg = SD_OCR_CCS | SD_OCR_VDD_18;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDMMC_POWER_3_3:
|
case SDMMC_POWER_3_3:
|
||||||
arg = MMC_CARD_CCS | MMC_CARD_VDD_27_34;
|
arg = SD_OCR_CCS | SD_OCR_VDD_27_34;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdmmc_init_cmd(&cmdbuf, MMC_SEND_OP_COND, arg, SDMMC_RSP_TYPE_3, 0);
|
sdmmc_init_cmd(&cmd, MMC_SEND_OP_COND, arg, SDMMC_RSP_TYPE_3, 0);
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmd, NULL, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return sdmmc_get_rsp(storage->sdmmc, pout, 4, SDMMC_RSP_TYPE_3);
|
return sdmmc_get_rsp(storage->sdmmc, pout, 4, SDMMC_RSP_TYPE_3);
|
||||||
@@ -391,17 +316,15 @@ static int _mmc_storage_get_op_cond(sdmmc_storage_t *storage, u32 power)
|
|||||||
{
|
{
|
||||||
u32 timeout = get_tmr_ms() + 1500;
|
u32 timeout = get_tmr_ms() + 1500;
|
||||||
|
|
||||||
while (true)
|
while (1)
|
||||||
{
|
{
|
||||||
u32 cond = 0;
|
u32 cond = 0;
|
||||||
if (!_mmc_storage_get_op_cond_inner(storage, &cond, power))
|
if (!_mmc_storage_get_op_cond_inner(storage, &cond, power))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Check if power up is done.
|
|
||||||
if (cond & MMC_CARD_BUSY)
|
if (cond & MMC_CARD_BUSY)
|
||||||
{
|
{
|
||||||
// Check if card is high capacity.
|
if (cond & SD_OCR_CCS)
|
||||||
if (cond & MMC_CARD_CCS)
|
|
||||||
storage->has_sector_access = 1;
|
storage->has_sector_access = 1;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@@ -439,6 +362,7 @@ static void _mmc_storage_parse_cid(sdmmc_storage_t *storage)
|
|||||||
case 3: /* MMC v3.1 - v3.3 */
|
case 3: /* MMC v3.1 - v3.3 */
|
||||||
case 4: /* MMC v4 */
|
case 4: /* MMC v4 */
|
||||||
storage->cid.manfid = unstuff_bits(raw_cid, 120, 8);
|
storage->cid.manfid = unstuff_bits(raw_cid, 120, 8);
|
||||||
|
storage->cid.card_bga = unstuff_bits(raw_cid, 112, 2);
|
||||||
storage->cid.oemid = unstuff_bits(raw_cid, 104, 8);
|
storage->cid.oemid = unstuff_bits(raw_cid, 104, 8);
|
||||||
storage->cid.prv = unstuff_bits(raw_cid, 48, 8);
|
storage->cid.prv = unstuff_bits(raw_cid, 48, 8);
|
||||||
storage->cid.serial = unstuff_bits(raw_cid, 16, 32);
|
storage->cid.serial = unstuff_bits(raw_cid, 16, 32);
|
||||||
@@ -466,14 +390,13 @@ static void _mmc_storage_parse_cid(sdmmc_storage_t *storage)
|
|||||||
|
|
||||||
static void _mmc_storage_parse_csd(sdmmc_storage_t *storage)
|
static void _mmc_storage_parse_csd(sdmmc_storage_t *storage)
|
||||||
{
|
{
|
||||||
u32 *raw_csd = (u32 *)storage->raw_csd;
|
u32 *raw_csd = (u32 *)&(storage->raw_csd);
|
||||||
|
|
||||||
storage->csd.mmca_vsn = unstuff_bits(raw_csd, 122, 4);
|
storage->csd.mmca_vsn = unstuff_bits(raw_csd, 122, 4);
|
||||||
storage->csd.structure = unstuff_bits(raw_csd, 126, 2);
|
storage->csd.structure = unstuff_bits(raw_csd, 126, 2);
|
||||||
storage->csd.cmdclass = unstuff_bits(raw_csd, 84, 12);
|
storage->csd.cmdclass = unstuff_bits(raw_csd, 84, 12);
|
||||||
storage->csd.read_blkbits = unstuff_bits(raw_csd, 80, 4);
|
storage->csd.read_blkbits = unstuff_bits(raw_csd, 80, 4);
|
||||||
storage->csd.capacity = (1 + unstuff_bits(raw_csd, 62, 12)) << (unstuff_bits(raw_csd, 47, 3) + 2);
|
storage->csd.capacity = (1 + unstuff_bits(raw_csd, 62, 12)) << (unstuff_bits(raw_csd, 47, 3) + 2);
|
||||||
storage->sec_cnt = storage->csd.capacity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _mmc_storage_parse_ext_csd(sdmmc_storage_t *storage, u8 *buf)
|
static void _mmc_storage_parse_ext_csd(sdmmc_storage_t *storage, u8 *buf)
|
||||||
@@ -484,26 +407,16 @@ static void _mmc_storage_parse_ext_csd(sdmmc_storage_t *storage, u8 *buf)
|
|||||||
storage->ext_csd.dev_version = *(u16 *)&buf[EXT_CSD_DEVICE_VERSION];
|
storage->ext_csd.dev_version = *(u16 *)&buf[EXT_CSD_DEVICE_VERSION];
|
||||||
storage->ext_csd.boot_mult = buf[EXT_CSD_BOOT_MULT];
|
storage->ext_csd.boot_mult = buf[EXT_CSD_BOOT_MULT];
|
||||||
storage->ext_csd.rpmb_mult = buf[EXT_CSD_RPMB_MULT];
|
storage->ext_csd.rpmb_mult = buf[EXT_CSD_RPMB_MULT];
|
||||||
//storage->ext_csd.bkops = buf[EXT_CSD_BKOPS_SUPPORT];
|
storage->ext_csd.sectors = *(u32 *)&buf[EXT_CSD_SEC_CNT];
|
||||||
//storage->ext_csd.bkops_en = buf[EXT_CSD_BKOPS_EN];
|
storage->ext_csd.bkops = buf[EXT_CSD_BKOPS_SUPPORT];
|
||||||
//storage->ext_csd.bkops_status = buf[EXT_CSD_BKOPS_STATUS];
|
storage->ext_csd.bkops_en = buf[EXT_CSD_BKOPS_EN];
|
||||||
|
storage->ext_csd.bkops_status = buf[EXT_CSD_BKOPS_STATUS];
|
||||||
|
|
||||||
storage->ext_csd.pre_eol_info = buf[EXT_CSD_PRE_EOL_INFO];
|
storage->ext_csd.pre_eol_info = buf[EXT_CSD_PRE_EOL_INFO];
|
||||||
storage->ext_csd.dev_life_est_a = buf[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A];
|
storage->ext_csd.dev_life_est_a = buf[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A];
|
||||||
storage->ext_csd.dev_life_est_b = buf[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B];
|
storage->ext_csd.dev_life_est_b = buf[EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B];
|
||||||
|
|
||||||
storage->ext_csd.cache_size =
|
storage->sec_cnt = *(u32 *)&buf[EXT_CSD_SEC_CNT];
|
||||||
buf[EXT_CSD_CACHE_SIZE] |
|
|
||||||
(buf[EXT_CSD_CACHE_SIZE + 1] << 8) |
|
|
||||||
(buf[EXT_CSD_CACHE_SIZE + 2] << 16) |
|
|
||||||
(buf[EXT_CSD_CACHE_SIZE + 3] << 24);
|
|
||||||
storage->ext_csd.max_enh_mult =
|
|
||||||
(buf[EXT_CSD_MAX_ENH_SIZE_MULT] |
|
|
||||||
(buf[EXT_CSD_MAX_ENH_SIZE_MULT + 1] << 8) |
|
|
||||||
(buf[EXT_CSD_MAX_ENH_SIZE_MULT + 2] << 16)) *
|
|
||||||
buf[EXT_CSD_HC_WP_GRP_SIZE] * buf[EXT_CSD_HC_ERASE_GRP_SIZE];
|
|
||||||
|
|
||||||
storage->sec_cnt = *(u32 *)&buf[EXT_CSD_SEC_CNT];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _mmc_storage_get_ext_csd(sdmmc_storage_t *storage, void *buf)
|
static int _mmc_storage_get_ext_csd(sdmmc_storage_t *storage, void *buf)
|
||||||
@@ -517,7 +430,7 @@ static int _mmc_storage_get_ext_csd(sdmmc_storage_t *storage, void *buf)
|
|||||||
reqbuf.num_sectors = 1;
|
reqbuf.num_sectors = 1;
|
||||||
reqbuf.is_write = 0;
|
reqbuf.is_write = 0;
|
||||||
reqbuf.is_multi_block = 0;
|
reqbuf.is_multi_block = 0;
|
||||||
reqbuf.is_auto_stop_trn = 0;
|
reqbuf.is_auto_cmd12 = 0;
|
||||||
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -646,21 +559,19 @@ out:
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
static int _mmc_storage_enable_bkops(sdmmc_storage_t *storage)
|
static int _mmc_storage_enable_bkops(sdmmc_storage_t *storage)
|
||||||
{
|
{
|
||||||
if (!_mmc_storage_switch(storage, SDMMC_SWITCH(MMC_SWITCH_MODE_SET_BITS, EXT_CSD_BKOPS_EN, EXT_CSD_AUTO_BKOPS_MASK)))
|
if (!_mmc_storage_switch(storage, SDMMC_SWITCH(MMC_SWITCH_MODE_SET_BITS, EXT_CSD_BKOPS_EN, EXT_CSD_BKOPS_LEVEL_2)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return _sdmmc_storage_check_status(storage);
|
return _sdmmc_storage_check_status(storage);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
int sdmmc_storage_init_mmc(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type)
|
int sdmmc_storage_init_mmc(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type)
|
||||||
{
|
{
|
||||||
memset(storage, 0, sizeof(sdmmc_storage_t));
|
memset(storage, 0, sizeof(sdmmc_storage_t));
|
||||||
storage->sdmmc = sdmmc;
|
storage->sdmmc = sdmmc;
|
||||||
storage->rca = 2; // Set default device address. This could be a config item.
|
storage->rca = 2; //TODO: this could be a config item.
|
||||||
|
|
||||||
if (!sdmmc_init(sdmmc, SDMMC_4, SDMMC_POWER_1_8, SDMMC_BUS_WIDTH_1, SDHCI_TIMING_MMC_ID, SDMMC_POWER_SAVE_DISABLE))
|
if (!sdmmc_init(sdmmc, SDMMC_4, SDMMC_POWER_1_8, SDMMC_BUS_WIDTH_1, SDHCI_TIMING_MMC_ID, SDMMC_POWER_SAVE_DISABLE))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -676,7 +587,7 @@ DPRINTF("[MMC] went to idle state\n");
|
|||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[MMC] got op cond\n");
|
DPRINTF("[MMC] got op cond\n");
|
||||||
|
|
||||||
if (!_sdmmc_storage_get_cid(storage))
|
if (!_sdmmc_storage_get_cid(storage, storage->raw_cid))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[MMC] got cid\n");
|
DPRINTF("[MMC] got cid\n");
|
||||||
|
|
||||||
@@ -684,7 +595,7 @@ DPRINTF("[MMC] got cid\n");
|
|||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[MMC] set relative addr\n");
|
DPRINTF("[MMC] set relative addr\n");
|
||||||
|
|
||||||
if (!_sdmmc_storage_get_csd(storage))
|
if (!_sdmmc_storage_get_csd(storage, storage->raw_csd))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[MMC] got csd\n");
|
DPRINTF("[MMC] got csd\n");
|
||||||
_mmc_storage_parse_csd(storage);
|
_mmc_storage_parse_csd(storage);
|
||||||
@@ -701,9 +612,13 @@ DPRINTF("[MMC] card selected\n");
|
|||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[MMC] set blocklen to 512\n");
|
DPRINTF("[MMC] set blocklen to 512\n");
|
||||||
|
|
||||||
// Check system specification version, only version 4.0 and later support below features.
|
u32 *csd = (u32 *)storage->raw_csd;
|
||||||
if (storage->csd.mmca_vsn < CSD_SPEC_VER_4)
|
//Check system specification version, only version 4.0 and later support below features.
|
||||||
|
if (unstuff_bits(csd, 122, 4) < CSD_SPEC_VER_4)
|
||||||
|
{
|
||||||
|
storage->sec_cnt = (1 + unstuff_bits(csd, 62, 12)) << (unstuff_bits(csd, 47, 3) + 2);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!_mmc_storage_switch_buswidth(storage, bus_width))
|
if (!_mmc_storage_switch_buswidth(storage, bus_width))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -713,20 +628,21 @@ DPRINTF("[MMC] switched buswidth\n");
|
|||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[MMC] got ext_csd\n");
|
DPRINTF("[MMC] got ext_csd\n");
|
||||||
|
|
||||||
_mmc_storage_parse_cid(storage); // This needs to be after csd and ext_csd.
|
_mmc_storage_parse_cid(storage); //This needs to be after csd and ext_csd
|
||||||
//gfx_hexdump(0, ext_csd, 512);
|
//gfx_hexdump(0, ext_csd, 512);
|
||||||
|
|
||||||
/*
|
/* When auto BKOPS is enabled the mmc device should be powered all the time until we disable this and check status.
|
||||||
if (storage->ext_csd.bkops & 0x1 && !(storage->ext_csd.bkops_en & EXT_CSD_AUTO_BKOPS_MASK))
|
Disable it for now until BKOPS disable added to power down sequence at sdmmc_storage_end().
|
||||||
|
Additionally this works only when we put the device in idle mode which we don't after enabling it. */
|
||||||
|
if (0 && storage->ext_csd.bkops & 0x1 && !(storage->ext_csd.bkops_en & EXT_CSD_BKOPS_LEVEL_2))
|
||||||
{
|
{
|
||||||
_mmc_storage_enable_bkops(storage);
|
_mmc_storage_enable_bkops(storage);
|
||||||
DPRINTF("[MMC] BKOPS enabled\n");
|
DPRINTF("[MMC] BKOPS enabled\n");
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
if (!_mmc_storage_enable_highspeed(storage, storage->ext_csd.card_type, type))
|
if (!_mmc_storage_enable_highspeed(storage, storage->ext_csd.card_type, type))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[MMC] successfully switched to HS mode\n");
|
DPRINTF("[MMC] succesfully switched to HS mode\n");
|
||||||
|
|
||||||
sdmmc_card_clock_powersave(storage->sdmmc, SDMMC_POWER_SAVE_ENABLE);
|
sdmmc_card_clock_powersave(storage->sdmmc, SDMMC_POWER_SAVE_ENABLE);
|
||||||
|
|
||||||
@@ -749,16 +665,16 @@ int sdmmc_storage_set_mmc_partition(sdmmc_storage_t *storage, u32 partition)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SD specific functions.
|
* SD specific functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int _sd_storage_execute_app_cmd(sdmmc_storage_t *storage, u32 expected_state, u32 mask, sdmmc_cmd_t *cmdbuf, sdmmc_req_t *req, u32 *blkcnt_out)
|
static int _sd_storage_execute_app_cmd(sdmmc_storage_t *storage, u32 expected_state, u32 mask, sdmmc_cmd_t *cmd, sdmmc_req_t *req, u32 *blkcnt_out)
|
||||||
{
|
{
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
if (!_sdmmc_storage_execute_cmd_type1_ex(storage, &tmp, MMC_APP_CMD, storage->rca << 16, 0, expected_state, mask))
|
if (!_sdmmc_storage_execute_cmd_type1_ex(storage, &tmp, MMC_APP_CMD, storage->rca << 16, 0, expected_state, mask))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return sdmmc_execute_cmd(storage->sdmmc, cmdbuf, req, blkcnt_out);
|
return sdmmc_execute_cmd(storage->sdmmc, cmd, req, blkcnt_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _sd_storage_execute_app_cmd_type1(sdmmc_storage_t *storage, u32 *resp, u32 cmd, u32 arg, u32 check_busy, u32 expected_state)
|
static int _sd_storage_execute_app_cmd_type1(sdmmc_storage_t *storage, u32 *resp, u32 cmd, u32 arg, u32 check_busy, u32 expected_state)
|
||||||
@@ -769,70 +685,67 @@ static int _sd_storage_execute_app_cmd_type1(sdmmc_storage_t *storage, u32 *resp
|
|||||||
return _sdmmc_storage_execute_cmd_type1_ex(storage, resp, cmd, arg, check_busy, expected_state, 0);
|
return _sdmmc_storage_execute_cmd_type1_ex(storage, resp, cmd, arg, check_busy, expected_state, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _sd_storage_send_if_cond(sdmmc_storage_t *storage, bool *is_sdsc)
|
static int _sd_storage_send_if_cond(sdmmc_storage_t *storage)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmdbuf;
|
||||||
u16 vhd_pattern = SD_VHD_27_36 | 0xAA;
|
u16 vhd_pattern = SD_VHD_27_36 | 0xAA;
|
||||||
sdmmc_init_cmd(&cmdbuf, SD_SEND_IF_COND, vhd_pattern, SDMMC_RSP_TYPE_5, 0);
|
sdmmc_init_cmd(&cmdbuf, SD_SEND_IF_COND, vhd_pattern, SDMMC_RSP_TYPE_5, 0);
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
||||||
{
|
return 1; // The SD Card is version 1.X
|
||||||
*is_sdsc = 1; // The SD Card is version 1.X
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For Card version >= 2.0, parse results.
|
// Card version is >= 2.0, parse results.
|
||||||
u32 resp = 0;
|
u32 resp = 0;
|
||||||
sdmmc_get_rsp(storage->sdmmc, &resp, 4, SDMMC_RSP_TYPE_5);
|
if (!sdmmc_get_rsp(storage->sdmmc, &resp, 4, SDMMC_RSP_TYPE_5))
|
||||||
|
return 2; // Failed.
|
||||||
|
|
||||||
// Check if VHD was accepted and pattern was properly returned.
|
// Check if VHD was accepted and pattern was properly returned.
|
||||||
if ((resp & 0xFFF) == vhd_pattern)
|
if ((resp & 0xFFF) == vhd_pattern)
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
return 0;
|
// Failed.
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _sd_storage_get_op_cond_once(sdmmc_storage_t *storage, u32 *cond, bool is_sdsc, int bus_uhs_support)
|
static int _sd_storage_get_op_cond_once(sdmmc_storage_t *storage, u32 *cond, int is_version_1, int bus_uhs_support)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmdbuf;
|
||||||
// Support for Current > 150mA
|
// Support for Current > 150mA
|
||||||
u32 arg = !is_sdsc ? SD_OCR_XPC : 0;
|
u32 arg = !is_version_1 ? SD_OCR_XPC : 0;
|
||||||
// Support for handling block-addressed SDHC cards
|
// Support for handling block-addressed SDHC cards
|
||||||
arg |= !is_sdsc ? SD_OCR_CCS : 0;
|
arg |= !is_version_1 ? SD_OCR_CCS : 0;
|
||||||
// Support for 1.8V
|
// Support for 1.8V
|
||||||
arg |= (bus_uhs_support && !is_sdsc) ? SD_OCR_S18R : 0;
|
arg |= (bus_uhs_support && !is_version_1) ? SD_OCR_S18R : 0;
|
||||||
// This is needed for most cards. Do not set bit7 even if 1.8V is supported.
|
// This is needed for most cards. Do not set bit7 even if 1.8V is supported.
|
||||||
arg |= SD_OCR_VDD_32_33;
|
arg |= SD_OCR_VDD_32_33;
|
||||||
sdmmc_init_cmd(&cmdbuf, SD_APP_OP_COND, arg, SDMMC_RSP_TYPE_3, 0);
|
sdmmc_init_cmd(&cmdbuf, SD_APP_OP_COND, arg, SDMMC_RSP_TYPE_3, 0);
|
||||||
if (!_sd_storage_execute_app_cmd(storage, R1_SKIP_STATE_CHECK, is_sdsc ? R1_ILLEGAL_COMMAND : 0, &cmdbuf, NULL, NULL))
|
if (!_sd_storage_execute_app_cmd(storage, R1_SKIP_STATE_CHECK, is_version_1 ? R1_ILLEGAL_COMMAND : 0, &cmdbuf, NULL, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return sdmmc_get_rsp(storage->sdmmc, cond, 4, SDMMC_RSP_TYPE_3);
|
return sdmmc_get_rsp(storage->sdmmc, cond, 4, SDMMC_RSP_TYPE_3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _sd_storage_get_op_cond(sdmmc_storage_t *storage, bool is_sdsc, int bus_uhs_support)
|
static int _sd_storage_get_op_cond(sdmmc_storage_t *storage, int is_version_1, int bus_uhs_support)
|
||||||
{
|
{
|
||||||
u32 timeout = get_tmr_ms() + 1500;
|
u32 timeout = get_tmr_ms() + 1500;
|
||||||
|
|
||||||
while (true)
|
while (1)
|
||||||
{
|
{
|
||||||
u32 cond = 0;
|
u32 cond = 0;
|
||||||
if (!_sd_storage_get_op_cond_once(storage, &cond, is_sdsc, bus_uhs_support))
|
if (!_sd_storage_get_op_cond_once(storage, &cond, is_version_1, bus_uhs_support))
|
||||||
break;
|
break;
|
||||||
|
if (cond & MMC_CARD_BUSY)
|
||||||
// Check if power up is done.
|
|
||||||
if (cond & SD_OCR_BUSY)
|
|
||||||
{
|
{
|
||||||
DPRINTF("[SD] op cond: %08X, lv: %d\n", cond, bus_uhs_support);
|
DPRINTF("[SD] op cond: %08X, lv: %d\n", cond, bus_uhs_support);
|
||||||
|
|
||||||
// Check if card is high capacity.
|
|
||||||
if (cond & SD_OCR_CCS)
|
if (cond & SD_OCR_CCS)
|
||||||
storage->has_sector_access = 1;
|
storage->has_sector_access = 1;
|
||||||
|
|
||||||
// Check if card supports 1.8V signaling.
|
// Check if card supports 1.8V signaling.
|
||||||
if (cond & SD_ROCR_S18A && bus_uhs_support)
|
if (cond & SD_ROCR_S18A && bus_uhs_support)
|
||||||
{
|
{
|
||||||
// Switch to 1.8V signaling.
|
//The low voltage regulator configuration is valid for SDMMC1 only.
|
||||||
if (_sdmmc_storage_execute_cmd_type1(storage, SD_SWITCH_VOLTAGE, 0, 0, R1_STATE_READY))
|
if (storage->sdmmc->id == SDMMC_1 &&
|
||||||
|
_sdmmc_storage_execute_cmd_type1(storage, SD_SWITCH_VOLTAGE, 0, 0, R1_STATE_READY))
|
||||||
{
|
{
|
||||||
if (!sdmmc_enable_low_voltage(storage->sdmmc))
|
if (!sdmmc_enable_low_voltage(storage->sdmmc))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -863,7 +776,7 @@ static int _sd_storage_get_rca(sdmmc_storage_t *storage)
|
|||||||
|
|
||||||
u32 timeout = get_tmr_ms() + 1500;
|
u32 timeout = get_tmr_ms() + 1500;
|
||||||
|
|
||||||
while (true)
|
while (1)
|
||||||
{
|
{
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, NULL, NULL))
|
||||||
break;
|
break;
|
||||||
@@ -896,9 +809,8 @@ static void _sd_storage_parse_scr(sdmmc_storage_t *storage)
|
|||||||
|
|
||||||
storage->scr.sda_vsn = unstuff_bits(resp, 56, 4);
|
storage->scr.sda_vsn = unstuff_bits(resp, 56, 4);
|
||||||
storage->scr.bus_widths = unstuff_bits(resp, 48, 4);
|
storage->scr.bus_widths = unstuff_bits(resp, 48, 4);
|
||||||
|
|
||||||
/* If v2.0 is supported, check if Physical Layer Spec v3.0 is supported */
|
|
||||||
if (storage->scr.sda_vsn == SCR_SPEC_VER_2)
|
if (storage->scr.sda_vsn == SCR_SPEC_VER_2)
|
||||||
|
/* Check if Physical Layer Spec v3.0 is supported */
|
||||||
storage->scr.sda_spec3 = unstuff_bits(resp, 47, 1);
|
storage->scr.sda_spec3 = unstuff_bits(resp, 47, 1);
|
||||||
if (storage->scr.sda_spec3)
|
if (storage->scr.sda_spec3)
|
||||||
storage->scr.cmds = unstuff_bits(resp, 32, 2);
|
storage->scr.cmds = unstuff_bits(resp, 32, 2);
|
||||||
@@ -915,7 +827,7 @@ int _sd_storage_get_scr(sdmmc_storage_t *storage, u8 *buf)
|
|||||||
reqbuf.num_sectors = 1;
|
reqbuf.num_sectors = 1;
|
||||||
reqbuf.is_write = 0;
|
reqbuf.is_write = 0;
|
||||||
reqbuf.is_multi_block = 0;
|
reqbuf.is_multi_block = 0;
|
||||||
reqbuf.is_auto_stop_trn = 0;
|
reqbuf.is_auto_cmd12 = 0;
|
||||||
|
|
||||||
if (!_sd_storage_execute_app_cmd(storage, R1_STATE_TRAN, 0, &cmdbuf, &reqbuf, NULL))
|
if (!_sd_storage_execute_app_cmd(storage, R1_STATE_TRAN, 0, &cmdbuf, &reqbuf, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -947,7 +859,7 @@ int _sd_storage_switch_get(sdmmc_storage_t *storage, void *buf)
|
|||||||
reqbuf.num_sectors = 1;
|
reqbuf.num_sectors = 1;
|
||||||
reqbuf.is_write = 0;
|
reqbuf.is_write = 0;
|
||||||
reqbuf.is_multi_block = 0;
|
reqbuf.is_multi_block = 0;
|
||||||
reqbuf.is_auto_stop_trn = 0;
|
reqbuf.is_auto_cmd12 = 0;
|
||||||
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -971,7 +883,7 @@ int _sd_storage_switch(sdmmc_storage_t *storage, void *buf, int mode, int group,
|
|||||||
reqbuf.num_sectors = 1;
|
reqbuf.num_sectors = 1;
|
||||||
reqbuf.is_write = 0;
|
reqbuf.is_write = 0;
|
||||||
reqbuf.is_multi_block = 0;
|
reqbuf.is_multi_block = 0;
|
||||||
reqbuf.is_auto_stop_trn = 0;
|
reqbuf.is_auto_cmd12 = 0;
|
||||||
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1152,7 +1064,7 @@ int _sd_storage_enable_hs_high_volt(sdmmc_storage_t *storage, u8 *buf)
|
|||||||
return sdmmc_setup_clock(storage->sdmmc, SDHCI_TIMING_SD_HS25);
|
return sdmmc_setup_clock(storage->sdmmc, SDHCI_TIMING_SD_HS25);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 sd_storage_get_ssr_au(sdmmc_storage_t *storage)
|
u32 sd_storage_ssr_get_au(sdmmc_storage_t *storage)
|
||||||
{
|
{
|
||||||
u32 au_size = storage->ssr.uhs_au_size;
|
u32 au_size = storage->ssr.uhs_au_size;
|
||||||
|
|
||||||
@@ -1192,24 +1104,39 @@ u32 sd_storage_get_ssr_au(sdmmc_storage_t *storage)
|
|||||||
|
|
||||||
static void _sd_storage_parse_ssr(sdmmc_storage_t *storage)
|
static void _sd_storage_parse_ssr(sdmmc_storage_t *storage)
|
||||||
{
|
{
|
||||||
// unstuff_bits supports only 4 u32 so break into 2 x u32x4 groups.
|
// unstuff_bits supports only 4 u32 so break into 2 x 16byte groups
|
||||||
u32 raw_ssr1[4];
|
u32 raw_ssr1[4];
|
||||||
u32 raw_ssr2[4];
|
u32 raw_ssr2[4];
|
||||||
|
|
||||||
memcpy(raw_ssr1, &storage->raw_ssr[0], 16);
|
raw_ssr1[3] = *(u32 *)&storage->raw_ssr[12];
|
||||||
memcpy(raw_ssr2, &storage->raw_ssr[16], 16);
|
raw_ssr1[2] = *(u32 *)&storage->raw_ssr[8];
|
||||||
|
raw_ssr1[1] = *(u32 *)&storage->raw_ssr[4];
|
||||||
|
raw_ssr1[0] = *(u32 *)&storage->raw_ssr[0];
|
||||||
|
|
||||||
|
raw_ssr2[3] = *(u32 *)&storage->raw_ssr[28];
|
||||||
|
raw_ssr2[2] = *(u32 *)&storage->raw_ssr[24];
|
||||||
|
raw_ssr2[1] = *(u32 *)&storage->raw_ssr[20];
|
||||||
|
raw_ssr2[0] = *(u32 *)&storage->raw_ssr[16];
|
||||||
|
|
||||||
storage->ssr.bus_width = (unstuff_bits(raw_ssr1, 510 - 384, 2) & SD_BUS_WIDTH_4) ? 4 : 1;
|
storage->ssr.bus_width = (unstuff_bits(raw_ssr1, 510 - 384, 2) & SD_BUS_WIDTH_4) ? 4 : 1;
|
||||||
storage->ssr.protected_size = unstuff_bits(raw_ssr1, 448 - 384, 32);
|
storage->ssr.protected_size = unstuff_bits(raw_ssr1, 448 - 384, 32);
|
||||||
|
|
||||||
u32 speed_class = unstuff_bits(raw_ssr1, 440 - 384, 8);
|
switch(unstuff_bits(raw_ssr1, 440 - 384, 8))
|
||||||
switch(speed_class)
|
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
storage->ssr.speed_class = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
|
storage->ssr.speed_class = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
|
storage->ssr.speed_class = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
storage->ssr.speed_class = speed_class << 1;
|
storage->ssr.speed_class = 6;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
@@ -1217,18 +1144,19 @@ static void _sd_storage_parse_ssr(sdmmc_storage_t *storage)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
storage->ssr.speed_class = speed_class;
|
storage->ssr.speed_class = unstuff_bits(raw_ssr1, 440 - 384, 8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
storage->ssr.uhs_grade = unstuff_bits(raw_ssr1, 396 - 384, 4);
|
storage->ssr.uhs_grade = unstuff_bits(raw_ssr1, 396 - 384, 4);
|
||||||
storage->ssr.video_class = unstuff_bits(raw_ssr1, 384 - 384, 8);
|
storage->ssr.video_class = unstuff_bits(raw_ssr1, 384 - 384, 8);
|
||||||
storage->ssr.app_class = unstuff_bits(raw_ssr2, 336 - 256, 4);
|
|
||||||
|
|
||||||
storage->ssr.au_size = unstuff_bits(raw_ssr1, 428 - 384, 4);
|
storage->ssr.app_class = unstuff_bits(raw_ssr2, 336 - 256, 4);
|
||||||
|
|
||||||
|
storage->ssr.au_size = unstuff_bits(raw_ssr1, 428 - 384, 4);
|
||||||
storage->ssr.uhs_au_size = unstuff_bits(raw_ssr1, 392 - 384, 4);
|
storage->ssr.uhs_au_size = unstuff_bits(raw_ssr1, 392 - 384, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sd_storage_get_ssr(sdmmc_storage_t *storage, u8 *buf)
|
static int _sd_storage_get_ssr(sdmmc_storage_t *storage, u8 *buf)
|
||||||
{
|
{
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmdbuf;
|
||||||
sdmmc_init_cmd(&cmdbuf, SD_APP_SD_STATUS, 0, SDMMC_RSP_TYPE_1, 0);
|
sdmmc_init_cmd(&cmdbuf, SD_APP_SD_STATUS, 0, SDMMC_RSP_TYPE_1, 0);
|
||||||
@@ -1239,11 +1167,11 @@ int sd_storage_get_ssr(sdmmc_storage_t *storage, u8 *buf)
|
|||||||
reqbuf.num_sectors = 1;
|
reqbuf.num_sectors = 1;
|
||||||
reqbuf.is_write = 0;
|
reqbuf.is_write = 0;
|
||||||
reqbuf.is_multi_block = 0;
|
reqbuf.is_multi_block = 0;
|
||||||
reqbuf.is_auto_stop_trn = 0;
|
reqbuf.is_auto_cmd12 = 0;
|
||||||
|
|
||||||
if (!(storage->csd.cmdclass & CCC_APP_SPEC))
|
if (!(storage->csd.cmdclass & CCC_APP_SPEC))
|
||||||
{
|
{
|
||||||
DPRINTF("[SD] ssr: Not supported\n");
|
DPRINTF("[SD] ssr: Card lacks mandatory SD Status function\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1252,16 +1180,14 @@ DPRINTF("[SD] ssr: Not supported\n");
|
|||||||
|
|
||||||
u32 tmp = 0;
|
u32 tmp = 0;
|
||||||
sdmmc_get_rsp(storage->sdmmc, &tmp, 4, SDMMC_RSP_TYPE_1);
|
sdmmc_get_rsp(storage->sdmmc, &tmp, 4, SDMMC_RSP_TYPE_1);
|
||||||
|
//Prepare buffer for unstuff_bits
|
||||||
// Convert buffer to LE.
|
for (int i = 0; i < 64; i+=4)
|
||||||
for (int i = 0; i < 64; i += 4)
|
|
||||||
{
|
{
|
||||||
storage->raw_ssr[i + 3] = buf[i];
|
storage->raw_ssr[i + 3] = buf[i];
|
||||||
storage->raw_ssr[i + 2] = buf[i + 1];
|
storage->raw_ssr[i + 2] = buf[i + 1];
|
||||||
storage->raw_ssr[i + 1] = buf[i + 2];
|
storage->raw_ssr[i + 1] = buf[i + 2];
|
||||||
storage->raw_ssr[i] = buf[i + 3];
|
storage->raw_ssr[i] = buf[i + 3];
|
||||||
}
|
}
|
||||||
|
|
||||||
_sd_storage_parse_ssr(storage);
|
_sd_storage_parse_ssr(storage);
|
||||||
//gfx_hexdump(0, storage->raw_ssr, 64);
|
//gfx_hexdump(0, storage->raw_ssr, 64);
|
||||||
|
|
||||||
@@ -1272,18 +1198,18 @@ static void _sd_storage_parse_cid(sdmmc_storage_t *storage)
|
|||||||
{
|
{
|
||||||
u32 *raw_cid = (u32 *)&(storage->raw_cid);
|
u32 *raw_cid = (u32 *)&(storage->raw_cid);
|
||||||
|
|
||||||
storage->cid.manfid = unstuff_bits(raw_cid, 120, 8);
|
storage->cid.manfid = unstuff_bits(raw_cid, 120, 8);
|
||||||
storage->cid.oemid = unstuff_bits(raw_cid, 104, 16);
|
storage->cid.oemid = unstuff_bits(raw_cid, 104, 16);
|
||||||
storage->cid.prod_name[0] = unstuff_bits(raw_cid, 96, 8);
|
storage->cid.prod_name[0] = unstuff_bits(raw_cid, 96, 8);
|
||||||
storage->cid.prod_name[1] = unstuff_bits(raw_cid, 88, 8);
|
storage->cid.prod_name[1] = unstuff_bits(raw_cid, 88, 8);
|
||||||
storage->cid.prod_name[2] = unstuff_bits(raw_cid, 80, 8);
|
storage->cid.prod_name[2] = unstuff_bits(raw_cid, 80, 8);
|
||||||
storage->cid.prod_name[3] = unstuff_bits(raw_cid, 72, 8);
|
storage->cid.prod_name[3] = unstuff_bits(raw_cid, 72, 8);
|
||||||
storage->cid.prod_name[4] = unstuff_bits(raw_cid, 64, 8);
|
storage->cid.prod_name[4] = unstuff_bits(raw_cid, 64, 8);
|
||||||
storage->cid.hwrev = unstuff_bits(raw_cid, 60, 4);
|
storage->cid.hwrev = unstuff_bits(raw_cid, 60, 4);
|
||||||
storage->cid.fwrev = unstuff_bits(raw_cid, 56, 4);
|
storage->cid.fwrev = unstuff_bits(raw_cid, 56, 4);
|
||||||
storage->cid.serial = unstuff_bits(raw_cid, 24, 32);
|
storage->cid.serial = unstuff_bits(raw_cid, 24, 32);
|
||||||
storage->cid.year = unstuff_bits(raw_cid, 12, 8) + 2000;
|
storage->cid.month = unstuff_bits(raw_cid, 8, 4);
|
||||||
storage->cid.month = unstuff_bits(raw_cid, 8, 4);
|
storage->cid.year = unstuff_bits(raw_cid, 12, 8) + 2000;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _sd_storage_parse_csd(sdmmc_storage_t *storage)
|
static void _sd_storage_parse_csd(sdmmc_storage_t *storage)
|
||||||
@@ -1298,7 +1224,6 @@ static void _sd_storage_parse_csd(sdmmc_storage_t *storage)
|
|||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
storage->csd.capacity = (1 + unstuff_bits(raw_csd, 62, 12)) << (unstuff_bits(raw_csd, 47, 3) + 2);
|
storage->csd.capacity = (1 + unstuff_bits(raw_csd, 62, 12)) << (unstuff_bits(raw_csd, 47, 3) + 2);
|
||||||
storage->csd.capacity <<= unstuff_bits(raw_csd, 80, 4) - 9; // Convert native block size to LBA 512B.
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
@@ -1306,13 +1231,7 @@ static void _sd_storage_parse_csd(sdmmc_storage_t *storage)
|
|||||||
storage->csd.capacity = storage->csd.c_size << 10;
|
storage->csd.capacity = storage->csd.c_size << 10;
|
||||||
storage->csd.read_blkbits = 9;
|
storage->csd.read_blkbits = 9;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
|
||||||
DPRINTF("[SD] unknown CSD structure %d\n", storage->csd.structure);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
storage->sec_cnt = storage->csd.capacity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _sdmmc_storage_get_bus_uhs_support(u32 bus_width, u32 type)
|
static bool _sdmmc_storage_get_bus_uhs_support(u32 bus_width, u32 type)
|
||||||
@@ -1342,10 +1261,8 @@ void sdmmc_storage_init_wait_sd()
|
|||||||
|
|
||||||
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type)
|
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type)
|
||||||
{
|
{
|
||||||
u32 tmp = 0;
|
int is_version_1 = 0;
|
||||||
int is_sdsc = 0;
|
u8 *buf = (u8 *)SDMMC_UPPER_BUFFER;
|
||||||
u8 *buf = (u8 *)SDMMC_UPPER_BUFFER;
|
|
||||||
bool bus_uhs_support = _sdmmc_storage_get_bus_uhs_support(bus_width, type);
|
|
||||||
|
|
||||||
DPRINTF("[SD] init: bus: %d, type: %d\n", bus_width, type);
|
DPRINTF("[SD] init: bus: %d, type: %d\n", bus_width, type);
|
||||||
|
|
||||||
@@ -1365,15 +1282,18 @@ DPRINTF("[SD] after init\n");
|
|||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] went to idle state\n");
|
DPRINTF("[SD] went to idle state\n");
|
||||||
|
|
||||||
if (!_sd_storage_send_if_cond(storage, &is_sdsc))
|
is_version_1 = _sd_storage_send_if_cond(storage);
|
||||||
|
if (is_version_1 == 2) // Failed.
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] after send if cond\n");
|
DPRINTF("[SD] after send if cond\n");
|
||||||
|
|
||||||
if (!_sd_storage_get_op_cond(storage, is_sdsc, bus_uhs_support))
|
bool bus_uhs_support = _sdmmc_storage_get_bus_uhs_support(bus_width, type);
|
||||||
|
|
||||||
|
if (!_sd_storage_get_op_cond(storage, is_version_1, bus_uhs_support))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] got op cond\n");
|
DPRINTF("[SD] got op cond\n");
|
||||||
|
|
||||||
if (!_sdmmc_storage_get_cid(storage))
|
if (!_sdmmc_storage_get_cid(storage, storage->raw_cid))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] got cid\n");
|
DPRINTF("[SD] got cid\n");
|
||||||
_sd_storage_parse_cid(storage);
|
_sd_storage_parse_cid(storage);
|
||||||
@@ -1382,16 +1302,30 @@ DPRINTF("[SD] got cid\n");
|
|||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] got rca (= %04X)\n", storage->rca);
|
DPRINTF("[SD] got rca (= %04X)\n", storage->rca);
|
||||||
|
|
||||||
if (!_sdmmc_storage_get_csd(storage))
|
if (!_sdmmc_storage_get_csd(storage, storage->raw_csd))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] got csd\n");
|
DPRINTF("[SD] got csd\n");
|
||||||
|
|
||||||
|
//Parse CSD.
|
||||||
_sd_storage_parse_csd(storage);
|
_sd_storage_parse_csd(storage);
|
||||||
|
switch (storage->csd.structure)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
storage->sec_cnt = storage->csd.capacity;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
storage->sec_cnt = storage->csd.c_size << 10;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DPRINTF("[SD] unknown CSD structure %d\n", storage->csd.structure);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!storage->is_low_voltage)
|
if (!storage->is_low_voltage)
|
||||||
{
|
{
|
||||||
if (!sdmmc_setup_clock(storage->sdmmc, SDHCI_TIMING_SD_DS12))
|
if (!sdmmc_setup_clock(storage->sdmmc, SDHCI_TIMING_SD_DS12))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] after setup default clock\n");
|
DPRINTF("[SD] after setup clock\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_sdmmc_storage_select_card(storage))
|
if (!_sdmmc_storage_select_card(storage))
|
||||||
@@ -1402,17 +1336,19 @@ DPRINTF("[SD] card selected\n");
|
|||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] set blocklen to 512\n");
|
DPRINTF("[SD] set blocklen to 512\n");
|
||||||
|
|
||||||
// Disconnect Card Detect resistor from DAT3.
|
u32 tmp = 0;
|
||||||
if (!_sd_storage_execute_app_cmd_type1(storage, &tmp, SD_APP_SET_CLR_CARD_DETECT, 0, 0, R1_STATE_TRAN))
|
if (!_sd_storage_execute_app_cmd_type1(storage, &tmp, SD_APP_SET_CLR_CARD_DETECT, 0, 0, R1_STATE_TRAN))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] cleared card detect\n");
|
DPRINTF("[SD] cleared card detect\n");
|
||||||
|
|
||||||
if (!_sd_storage_get_scr(storage, buf))
|
if (!_sd_storage_get_scr(storage, buf))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
//gfx_hexdump(0, storage->raw_scr, 8);
|
||||||
DPRINTF("[SD] got scr\n");
|
DPRINTF("[SD] got scr\n");
|
||||||
|
|
||||||
// If card supports a wider bus and if it's not SD Version 1.0 switch bus width.
|
// Check if card supports a wider bus and if it's not SD Version 1.X
|
||||||
if (bus_width == SDMMC_BUS_WIDTH_4 && (storage->scr.bus_widths & BIT(SD_BUS_WIDTH_4)) && storage->scr.sda_vsn)
|
if (bus_width == SDMMC_BUS_WIDTH_4 && (storage->scr.bus_widths & 4) && (storage->scr.sda_vsn & 0xF))
|
||||||
{
|
{
|
||||||
if (!_sd_storage_execute_app_cmd_type1(storage, &tmp, SD_APP_SET_BUS_WIDTH, SD_BUS_WIDTH_4, 0, R1_STATE_TRAN))
|
if (!_sd_storage_execute_app_cmd_type1(storage, &tmp, SD_APP_SET_BUS_WIDTH, SD_BUS_WIDTH_4, 0, R1_STATE_TRAN))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1431,8 +1367,10 @@ DPRINTF("[SD] SD does not support wide bus width\n");
|
|||||||
if (!_sd_storage_enable_uhs_low_volt(storage, type, buf))
|
if (!_sd_storage_enable_uhs_low_volt(storage, type, buf))
|
||||||
return 0;
|
return 0;
|
||||||
DPRINTF("[SD] enabled UHS\n");
|
DPRINTF("[SD] enabled UHS\n");
|
||||||
|
|
||||||
|
sdmmc_card_clock_powersave(sdmmc, SDMMC_POWER_SAVE_ENABLE);
|
||||||
}
|
}
|
||||||
else if (type != SDHCI_TIMING_SD_DS12 && storage->scr.sda_vsn) // Not default speed and not SD Version 1.0.
|
else if (type != SDHCI_TIMING_SD_DS12 && (storage->scr.sda_vsn & 0xF)) // Not default speed and not SD Version 1.x
|
||||||
{
|
{
|
||||||
if (!_sd_storage_enable_hs_high_volt(storage, buf))
|
if (!_sd_storage_enable_hs_high_volt(storage, buf))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1451,27 +1389,25 @@ DPRINTF("[SD] enabled HS\n");
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse additional card info from sd status.
|
// Parse additional card info from sd status.
|
||||||
if (sd_storage_get_ssr(storage, buf))
|
if (_sd_storage_get_ssr(storage, buf))
|
||||||
{
|
{
|
||||||
DPRINTF("[SD] got sd status\n");
|
DPRINTF("[SD] got sd status\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
sdmmc_card_clock_powersave(sdmmc, SDMMC_POWER_SAVE_ENABLE);
|
|
||||||
|
|
||||||
storage->initialized = 1;
|
storage->initialized = 1;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Gamecard specific functions.
|
* Gamecard specific functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int _gc_storage_custom_cmd(sdmmc_storage_t *storage, void *buf)
|
int _gc_storage_custom_cmd(sdmmc_storage_t *storage, void *buf)
|
||||||
{
|
{
|
||||||
u32 resp;
|
u32 resp;
|
||||||
sdmmc_cmd_t cmdbuf;
|
sdmmc_cmd_t cmdbuf;
|
||||||
sdmmc_init_cmd(&cmdbuf, MMC_VENDOR_60_CMD, 0, SDMMC_RSP_TYPE_1, 1);
|
sdmmc_init_cmd(&cmdbuf, 60, 0, SDMMC_RSP_TYPE_1, 1);
|
||||||
|
|
||||||
sdmmc_req_t reqbuf;
|
sdmmc_req_t reqbuf;
|
||||||
reqbuf.buf = buf;
|
reqbuf.buf = buf;
|
||||||
@@ -1479,7 +1415,7 @@ int _gc_storage_custom_cmd(sdmmc_storage_t *storage, void *buf)
|
|||||||
reqbuf.num_sectors = 1;
|
reqbuf.num_sectors = 1;
|
||||||
reqbuf.is_write = 1;
|
reqbuf.is_write = 1;
|
||||||
reqbuf.is_multi_block = 0;
|
reqbuf.is_multi_block = 0;
|
||||||
reqbuf.is_auto_stop_trn = 0;
|
reqbuf.is_auto_cmd12 = 0;
|
||||||
|
|
||||||
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
if (!sdmmc_execute_cmd(storage->sdmmc, &cmdbuf, &reqbuf, NULL))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -30,93 +30,18 @@ typedef enum _sdmmc_type
|
|||||||
|
|
||||||
EMMC_GPP = 0,
|
EMMC_GPP = 0,
|
||||||
EMMC_BOOT0 = 1,
|
EMMC_BOOT0 = 1,
|
||||||
EMMC_BOOT1 = 2,
|
EMMC_BOOT1 = 2
|
||||||
EMMC_RPMB = 3
|
|
||||||
} sdmmc_type;
|
} sdmmc_type;
|
||||||
|
|
||||||
typedef struct _mmc_sandisk_advanced_report_t
|
|
||||||
{
|
|
||||||
u32 power_inits;
|
|
||||||
|
|
||||||
u32 max_erase_cycles_sys;
|
|
||||||
u32 max_erase_cycles_slc;
|
|
||||||
u32 max_erase_cycles_mlc;
|
|
||||||
|
|
||||||
u32 min_erase_cycles_sys;
|
|
||||||
u32 min_erase_cycles_slc;
|
|
||||||
u32 min_erase_cycles_mlc;
|
|
||||||
|
|
||||||
u32 max_erase_cycles_euda;
|
|
||||||
u32 min_erase_cycles_euda;
|
|
||||||
u32 avg_erase_cycles_euda;
|
|
||||||
u32 read_reclaim_cnt_euda;
|
|
||||||
u32 bad_blocks_euda;
|
|
||||||
|
|
||||||
u32 pre_eol_euda;
|
|
||||||
u32 pre_eol_sys;
|
|
||||||
u32 pre_eol_mlc;
|
|
||||||
|
|
||||||
u32 uncorrectable_ecc;
|
|
||||||
|
|
||||||
u32 temperature_now;
|
|
||||||
u32 temperature_min;
|
|
||||||
u32 temperature_max;
|
|
||||||
|
|
||||||
u32 health_pct_euda;
|
|
||||||
u32 health_pct_sys;
|
|
||||||
u32 health_pct_mlc;
|
|
||||||
|
|
||||||
u32 unk0;
|
|
||||||
u32 unk1;
|
|
||||||
u32 unk2;
|
|
||||||
|
|
||||||
u32 reserved[78];
|
|
||||||
} mmc_sandisk_advanced_report_t;
|
|
||||||
|
|
||||||
typedef struct _mmc_sandisk_report_t
|
|
||||||
{
|
|
||||||
u32 avg_erase_cycles_sys;
|
|
||||||
u32 avg_erase_cycles_slc;
|
|
||||||
u32 avg_erase_cycles_mlc;
|
|
||||||
|
|
||||||
u32 read_reclaim_cnt_sys;
|
|
||||||
u32 read_reclaim_cnt_slc;
|
|
||||||
u32 read_reclaim_cnt_mlc;
|
|
||||||
|
|
||||||
u32 bad_blocks_factory;
|
|
||||||
u32 bad_blocks_sys;
|
|
||||||
u32 bad_blocks_slc;
|
|
||||||
u32 bad_blocks_mlc;
|
|
||||||
|
|
||||||
u32 fw_updates_cnt;
|
|
||||||
|
|
||||||
u8 fw_update_date[12];
|
|
||||||
u8 fw_update_time[8];
|
|
||||||
|
|
||||||
u32 total_writes_100mb;
|
|
||||||
u32 vdrops;
|
|
||||||
u32 vdroops;
|
|
||||||
|
|
||||||
u32 vdrops_failed_data_rec;
|
|
||||||
u32 vdrops_data_rec_ops;
|
|
||||||
|
|
||||||
u32 total_writes_slc_100mb;
|
|
||||||
u32 total_writes_mlc_100mb;
|
|
||||||
|
|
||||||
u32 mlc_bigfile_mode_limit_exceeded;
|
|
||||||
u32 avg_erase_cycles_hybrid;
|
|
||||||
|
|
||||||
mmc_sandisk_advanced_report_t advanced;
|
|
||||||
} mmc_sandisk_report_t;
|
|
||||||
|
|
||||||
typedef struct _mmc_cid
|
typedef struct _mmc_cid
|
||||||
{
|
{
|
||||||
u32 manfid;
|
u32 manfid;
|
||||||
u8 prod_name[8];
|
u8 prod_name[8];
|
||||||
|
u8 card_bga;
|
||||||
|
u8 prv;
|
||||||
u32 serial;
|
u32 serial;
|
||||||
u16 oemid;
|
u16 oemid;
|
||||||
u16 year;
|
u16 year;
|
||||||
u8 prv;
|
|
||||||
u8 hwrev;
|
u8 hwrev;
|
||||||
u8 fwrev;
|
u8 fwrev;
|
||||||
u8 month;
|
u8 month;
|
||||||
@@ -140,20 +65,19 @@ typedef struct _mmc_csd
|
|||||||
|
|
||||||
typedef struct _mmc_ext_csd
|
typedef struct _mmc_ext_csd
|
||||||
{
|
{
|
||||||
//u8 bkops; /* background support bit */
|
u32 sectors;
|
||||||
//u8 bkops_en; /* manual bkops enable bit */
|
int bkops; /* background support bit */
|
||||||
//u8 bkops_status; /* 246 */
|
int bkops_en; /* manual bkops enable bit */
|
||||||
u8 rev;
|
u8 rev;
|
||||||
u8 ext_struct; /* 194 */
|
u8 ext_struct; /* 194 */
|
||||||
u8 card_type; /* 196 */
|
u8 card_type; /* 196 */
|
||||||
|
u8 bkops_status; /* 246 */
|
||||||
u8 pre_eol_info;
|
u8 pre_eol_info;
|
||||||
u8 dev_life_est_a;
|
u8 dev_life_est_a;
|
||||||
u8 dev_life_est_b;
|
u8 dev_life_est_b;
|
||||||
u8 boot_mult;
|
u8 boot_mult;
|
||||||
u8 rpmb_mult;
|
u8 rpmb_mult;
|
||||||
u16 dev_version;
|
u16 dev_version;
|
||||||
u32 cache_size;
|
|
||||||
u32 max_enh_mult;
|
|
||||||
} mmc_ext_csd_t;
|
} mmc_ext_csd_t;
|
||||||
|
|
||||||
typedef struct _sd_scr
|
typedef struct _sd_scr
|
||||||
@@ -166,13 +90,13 @@ typedef struct _sd_scr
|
|||||||
|
|
||||||
typedef struct _sd_ssr
|
typedef struct _sd_ssr
|
||||||
{
|
{
|
||||||
u8 bus_width;
|
u8 bus_width;
|
||||||
u8 speed_class;
|
u8 speed_class;
|
||||||
u8 uhs_grade;
|
u8 uhs_grade;
|
||||||
u8 video_class;
|
u8 video_class;
|
||||||
u8 app_class;
|
u8 app_class;
|
||||||
u8 au_size;
|
u8 au_size;
|
||||||
u8 uhs_au_size;
|
u8 uhs_au_size;
|
||||||
u32 protected_size;
|
u32 protected_size;
|
||||||
} sd_ssr_t;
|
} sd_ssr_t;
|
||||||
|
|
||||||
@@ -206,10 +130,6 @@ void sdmmc_storage_init_wait_sd();
|
|||||||
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type);
|
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 bus_width, u32 type);
|
||||||
int sdmmc_storage_init_gc(sdmmc_storage_t *storage, sdmmc_t *sdmmc);
|
int sdmmc_storage_init_gc(sdmmc_storage_t *storage, sdmmc_t *sdmmc);
|
||||||
|
|
||||||
int sdmmc_storage_execute_vendor_cmd(sdmmc_storage_t *storage, u32 arg);
|
u32 sd_storage_ssr_get_au(sdmmc_storage_t *storage);
|
||||||
int sdmmc_storage_vendor_sandisk_report(sdmmc_storage_t *storage, void *buf);
|
|
||||||
|
|
||||||
int sd_storage_get_ssr(sdmmc_storage_t *storage, u8 *buf);
|
|
||||||
u32 sd_storage_get_ssr_au(sdmmc_storage_t *storage);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
//#define ERROR_EXTRA_PRINTING
|
//#define ERROR_EXTRA_PRINTING
|
||||||
#define DPRINTF(...)
|
#define DPRINTF(...)
|
||||||
|
|
||||||
#ifdef BDK_SDMMC_OC_AND_EXTRA_PRINT
|
#ifdef NYX
|
||||||
#define ERROR_EXTRA_PRINTING
|
#define ERROR_EXTRA_PRINTING
|
||||||
#define SDMMC_EMMC_OC
|
#define SDMMC_EMMC_OC
|
||||||
#endif
|
#endif
|
||||||
@@ -934,20 +934,12 @@ static int _sdmmc_config_dma(sdmmc_t *sdmmc, u32 *blkcnt_out, sdmmc_req_t *req)
|
|||||||
*blkcnt_out = blkcnt;
|
*blkcnt_out = blkcnt;
|
||||||
|
|
||||||
u32 trnmode = SDHCI_TRNS_DMA;
|
u32 trnmode = SDHCI_TRNS_DMA;
|
||||||
|
|
||||||
// Set mulitblock request.
|
|
||||||
if (req->is_multi_block)
|
if (req->is_multi_block)
|
||||||
trnmode = SDHCI_TRNS_MULTI | SDHCI_TRNS_BLK_CNT_EN | SDHCI_TRNS_DMA;
|
trnmode = SDHCI_TRNS_MULTI | SDHCI_TRNS_BLK_CNT_EN | SDHCI_TRNS_DMA;
|
||||||
|
|
||||||
// Set request direction.
|
|
||||||
if (!req->is_write)
|
if (!req->is_write)
|
||||||
trnmode |= SDHCI_TRNS_READ;
|
trnmode |= SDHCI_TRNS_READ;
|
||||||
|
if (req->is_auto_cmd12)
|
||||||
// Automatic send of stop transmission or set block count cmd.
|
trnmode = (trnmode & ~(SDHCI_TRNS_AUTO_CMD12 | SDHCI_TRNS_AUTO_CMD23)) | SDHCI_TRNS_AUTO_CMD12;
|
||||||
if (req->is_auto_stop_trn)
|
|
||||||
trnmode |= SDHCI_TRNS_AUTO_CMD12;
|
|
||||||
//else if (req->is_auto_set_blkcnt)
|
|
||||||
// trnmode |= SDHCI_TRNS_AUTO_CMD23;
|
|
||||||
|
|
||||||
sdmmc->regs->trnmod = trnmode;
|
sdmmc->regs->trnmod = trnmode;
|
||||||
|
|
||||||
@@ -1033,10 +1025,12 @@ static int _sdmmc_execute_cmd_inner(sdmmc_t *sdmmc, sdmmc_cmd_t *cmd, sdmmc_req_
|
|||||||
}
|
}
|
||||||
|
|
||||||
int result = _sdmmc_wait_response(sdmmc);
|
int result = _sdmmc_wait_response(sdmmc);
|
||||||
#ifdef ERROR_EXTRA_PRINTING
|
|
||||||
if (!result)
|
if (!result)
|
||||||
|
{
|
||||||
|
#ifdef ERROR_EXTRA_PRINTING
|
||||||
EPRINTF("SDMMC: Transfer timeout!");
|
EPRINTF("SDMMC: Transfer timeout!");
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
DPRINTF("rsp(%d): %08X, %08X, %08X, %08X\n", result,
|
DPRINTF("rsp(%d): %08X, %08X, %08X, %08X\n", result,
|
||||||
sdmmc->regs->rspreg0, sdmmc->regs->rspreg1, sdmmc->regs->rspreg2, sdmmc->regs->rspreg3);
|
sdmmc->regs->rspreg0, sdmmc->regs->rspreg1, sdmmc->regs->rspreg2, sdmmc->regs->rspreg3);
|
||||||
if (result)
|
if (result)
|
||||||
@@ -1045,18 +1039,22 @@ DPRINTF("rsp(%d): %08X, %08X, %08X, %08X\n", result,
|
|||||||
{
|
{
|
||||||
sdmmc->expected_rsp_type = cmd->rsp_type;
|
sdmmc->expected_rsp_type = cmd->rsp_type;
|
||||||
result = _sdmmc_cache_rsp(sdmmc, sdmmc->rsp, 0x10, cmd->rsp_type);
|
result = _sdmmc_cache_rsp(sdmmc, sdmmc->rsp, 0x10, cmd->rsp_type);
|
||||||
#ifdef ERROR_EXTRA_PRINTING
|
|
||||||
if (!result)
|
if (!result)
|
||||||
|
{
|
||||||
|
#ifdef ERROR_EXTRA_PRINTING
|
||||||
EPRINTF("SDMMC: Unknown response type!");
|
EPRINTF("SDMMC: Unknown response type!");
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (req && result)
|
if (req && result)
|
||||||
{
|
{
|
||||||
result = _sdmmc_update_dma(sdmmc);
|
result = _sdmmc_update_dma(sdmmc);
|
||||||
#ifdef ERROR_EXTRA_PRINTING
|
|
||||||
if (!result)
|
if (!result)
|
||||||
|
{
|
||||||
|
#ifdef ERROR_EXTRA_PRINTING
|
||||||
EPRINTF("SDMMC: DMA Update failed!");
|
EPRINTF("SDMMC: DMA Update failed!");
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1072,17 +1070,19 @@ DPRINTF("rsp(%d): %08X, %08X, %08X, %08X\n", result,
|
|||||||
if (blkcnt_out)
|
if (blkcnt_out)
|
||||||
*blkcnt_out = blkcnt;
|
*blkcnt_out = blkcnt;
|
||||||
|
|
||||||
if (req->is_auto_stop_trn)
|
if (req->is_auto_cmd12)
|
||||||
sdmmc->rsp3 = sdmmc->regs->rspreg3;
|
sdmmc->rsp3 = sdmmc->regs->rspreg3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->check_busy || req)
|
if (cmd->check_busy || req)
|
||||||
{
|
{
|
||||||
result = _sdmmc_wait_card_busy(sdmmc);
|
result = _sdmmc_wait_card_busy(sdmmc);
|
||||||
#ifdef ERROR_EXTRA_PRINTING
|
|
||||||
if (!result)
|
if (!result)
|
||||||
|
{
|
||||||
|
#ifdef ERROR_EXTRA_PRINTING
|
||||||
EPRINTF("SDMMC: Busy timeout!");
|
EPRINTF("SDMMC: Busy timeout!");
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1371,12 +1371,12 @@ void sdmmc_end(sdmmc_t *sdmmc)
|
|||||||
_sdmmc_sd_clock_disable(sdmmc);
|
_sdmmc_sd_clock_disable(sdmmc);
|
||||||
// Disable SDMMC power.
|
// Disable SDMMC power.
|
||||||
_sdmmc_set_io_power(sdmmc, SDMMC_POWER_OFF);
|
_sdmmc_set_io_power(sdmmc, SDMMC_POWER_OFF);
|
||||||
_sdmmc_commit_changes(sdmmc);
|
|
||||||
|
|
||||||
// Disable SD card power.
|
// Disable SD card power.
|
||||||
if (sdmmc->id == SDMMC_1)
|
if (sdmmc->id == SDMMC_1)
|
||||||
sdmmc1_disable_power();
|
sdmmc1_disable_power();
|
||||||
|
|
||||||
|
_sdmmc_commit_changes(sdmmc);
|
||||||
clock_sdmmc_disable(sdmmc->id);
|
clock_sdmmc_disable(sdmmc->id);
|
||||||
sdmmc->clock_stopped = 1;
|
sdmmc->clock_stopped = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ typedef struct _sdmmc_req_t
|
|||||||
u32 num_sectors;
|
u32 num_sectors;
|
||||||
int is_write;
|
int is_write;
|
||||||
int is_multi_block;
|
int is_multi_block;
|
||||||
int is_auto_stop_trn;
|
int is_auto_cmd12;
|
||||||
} sdmmc_req_t;
|
} sdmmc_req_t;
|
||||||
|
|
||||||
int sdmmc_get_io_power(sdmmc_t *sdmmc);
|
int sdmmc_get_io_power(sdmmc_t *sdmmc);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Fan driver for Nintendo Switch
|
* Fan driver for Nintendo Switch
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
#include <thermal/fan.h>
|
#include <thermal/fan.h>
|
||||||
#include <power/regulator_5v.h>
|
#include <power/regulator_5v.h>
|
||||||
#include <soc/fuse.h>
|
|
||||||
#include <soc/gpio.h>
|
#include <soc/gpio.h>
|
||||||
#include <soc/pinmux.h>
|
#include <soc/pinmux.h>
|
||||||
#include <soc/t210.h>
|
#include <soc/t210.h>
|
||||||
@@ -27,22 +26,11 @@
|
|||||||
void set_fan_duty(u32 duty)
|
void set_fan_duty(u32 duty)
|
||||||
{
|
{
|
||||||
static bool fan_init = false;
|
static bool fan_init = false;
|
||||||
static u16 curr_duty = -1;
|
static u16 curr_duty = -1;
|
||||||
|
|
||||||
if (duty > 236)
|
|
||||||
duty = 236;
|
|
||||||
|
|
||||||
if (curr_duty == duty)
|
if (curr_duty == duty)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
curr_duty = duty;
|
|
||||||
|
|
||||||
//! TODO: Add HOAG/AULA support.
|
|
||||||
u32 hw_type = fuse_read_hw_type();
|
|
||||||
if (hw_type != FUSE_NX_HW_TYPE_ICOSA &&
|
|
||||||
hw_type != FUSE_NX_HW_TYPE_IOWA)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!fan_init)
|
if (!fan_init)
|
||||||
{
|
{
|
||||||
// Fan tachometer.
|
// Fan tachometer.
|
||||||
@@ -58,6 +46,9 @@ void set_fan_duty(u32 duty)
|
|||||||
fan_init = true;
|
fan_init = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (duty > 236)
|
||||||
|
duty = 236;
|
||||||
|
|
||||||
// Inverted polarity.
|
// Inverted polarity.
|
||||||
u32 inv_duty = 236 - duty;
|
u32 inv_duty = 236 - duty;
|
||||||
|
|
||||||
@@ -80,20 +71,23 @@ void set_fan_duty(u32 duty)
|
|||||||
// Enable fan.
|
// Enable fan.
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_GPIO2) = 1; // Set source to PWM1.
|
PINMUX_AUX(PINMUX_AUX_LCD_GPIO2) = 1; // Set source to PWM1.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
curr_duty = duty;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_fan_speed(u32 *duty, u32 *rpm)
|
void get_fan_speed(u32 *duty, u32 *rpm)
|
||||||
{
|
{
|
||||||
if (rpm)
|
if (rpm)
|
||||||
{
|
{
|
||||||
u32 irq_count = 0;
|
u32 irq_count = 1;
|
||||||
bool should_read = true;
|
bool should_read = true;
|
||||||
|
bool irq_val = 0;
|
||||||
|
|
||||||
// Poll irqs for 2 seconds. (5 seconds for accurate count).
|
// Poll irqs for 2 seconds.
|
||||||
int timer = get_tmr_us() + 2000000;
|
int timer = get_tmr_us() + 1000000;
|
||||||
while ((timer - get_tmr_us()) > 0)
|
while (timer - get_tmr_us())
|
||||||
{
|
{
|
||||||
bool irq_val = gpio_read(GPIO_PORT_S, GPIO_PIN_7);
|
irq_val = gpio_read(GPIO_PORT_S, GPIO_PIN_7);
|
||||||
if (irq_val && should_read)
|
if (irq_val && should_read)
|
||||||
{
|
{
|
||||||
irq_count++;
|
irq_count++;
|
||||||
@@ -103,11 +97,8 @@ void get_fan_speed(u32 *duty, u32 *rpm)
|
|||||||
should_read = true;
|
should_read = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Halve the irq count.
|
|
||||||
irq_count /= 2;
|
|
||||||
|
|
||||||
// Calculate rpm based on triggered interrupts.
|
// Calculate rpm based on triggered interrupts.
|
||||||
*rpm = irq_count * (60 / 2);
|
*rpm = 60000000 / ((1000000 * 2) / irq_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (duty)
|
if (duty)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* SOC/PCB Temperature driver for Nintendo Switch's TI TMP451
|
* SOC/PCB Temperature driver for Nintendo Switch's TI TMP451
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018-2020 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -16,9 +16,7 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <soc/hw_init.h>
|
|
||||||
#include <soc/i2c.h>
|
#include <soc/i2c.h>
|
||||||
#include <soc/t210.h>
|
|
||||||
#include <thermal/tmp451.h>
|
#include <thermal/tmp451.h>
|
||||||
|
|
||||||
u16 tmp451_get_soc_temp(bool intenger)
|
u16 tmp451_get_soc_temp(bool intenger)
|
||||||
@@ -58,20 +56,6 @@ void tmp451_init()
|
|||||||
// Disable ALARM and Range to 0 - 127 oC.
|
// Disable ALARM and Range to 0 - 127 oC.
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_CONFIG_REG, 0x80);
|
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_CONFIG_REG, 0x80);
|
||||||
|
|
||||||
// Set remote sensor offsets based on SoC.
|
|
||||||
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210)
|
|
||||||
{
|
|
||||||
// Set offset to 0 oC for Erista.
|
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_SOC_TMP_OFH_REG, 0);
|
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_SOC_TMP_OFL_REG, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Set offset to -12.5 oC for Mariko.
|
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_SOC_TMP_OFH_REG, 0xF3); // - 13 oC.
|
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_SOC_TMP_OFL_REG, 0x80); // + 0.5 oC.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set conversion rate to 32/s and make a read to update the reg.
|
// Set conversion rate to 32/s and make a read to update the reg.
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_CNV_RATE_REG, 9);
|
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_CNV_RATE_REG, 9);
|
||||||
tmp451_get_soc_temp(false);
|
tmp451_get_soc_temp(false);
|
||||||
@@ -79,9 +63,3 @@ void tmp451_init()
|
|||||||
// Set rate to every 4 seconds.
|
// Set rate to every 4 seconds.
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_CNV_RATE_REG, 2);
|
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_CNV_RATE_REG, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tmp451_end()
|
|
||||||
{
|
|
||||||
// Place into shutdown mode to conserve power.
|
|
||||||
i2c_send_byte(I2C_1, TMP451_I2C_ADDR, TMP451_CONFIG_REG, 0xC0);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -32,15 +32,11 @@
|
|||||||
#define TMP451_SOC_TMP_DEC_REG 0x10
|
#define TMP451_SOC_TMP_DEC_REG 0x10
|
||||||
#define TMP451_PCB_TMP_DEC_REG 0x15
|
#define TMP451_PCB_TMP_DEC_REG 0x15
|
||||||
|
|
||||||
#define TMP451_SOC_TMP_OFH_REG 0x11
|
|
||||||
#define TMP451_SOC_TMP_OFL_REG 0x12
|
|
||||||
|
|
||||||
// If input is false, the return value is packed. MSByte is the integer in oC
|
// If input is false, the return value is packed. MSByte is the integer in oC
|
||||||
// and the LSByte is the decimal point truncated to 2 decimal places.
|
// and the LSByte is the decimal point truncated to 2 decimal places.
|
||||||
// Otherwise it's an integer oC.
|
// Otherwise it's an integer oC.
|
||||||
u16 tmp451_get_soc_temp(bool integer);
|
u16 tmp451_get_soc_temp(bool integer);
|
||||||
u16 tmp451_get_pcb_temp(bool integer);
|
u16 tmp451_get_pcb_temp(bool integer);
|
||||||
void tmp451_init();
|
void tmp451_init();
|
||||||
void tmp451_end();
|
|
||||||
|
|
||||||
#endif /* __TMP451_H_ */
|
#endif /* __TMP451_H_ */
|
||||||
|
|||||||
238
bdk/usb/usb_descriptor_types.h
Normal file
238
bdk/usb/usb_descriptor_types.h
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
* USB driver for Tegra X1
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _USB_DESCRIPTORS_TYPES_H_
|
||||||
|
#define _USB_DESCRIPTORS_TYPES_H_
|
||||||
|
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_DESCRIPTOR_DEVICE = 1,
|
||||||
|
USB_DESCRIPTOR_CONFIGURATION = 2,
|
||||||
|
USB_DESCRIPTOR_STRING = 3,
|
||||||
|
USB_DESCRIPTOR_INTERFACE = 4,
|
||||||
|
USB_DESCRIPTOR_ENDPOINT = 5,
|
||||||
|
USB_DESCRIPTOR_DEVICE_QUALIFIER = 6,
|
||||||
|
USB_DESCRIPTOR_OTHER_SPEED_CONFIGURATION = 7,
|
||||||
|
USB_DESCRIPTOR_INTERFACE_POWER = 8,
|
||||||
|
USB_DESCRIPTOR_INTERFACE_OTG = 9,
|
||||||
|
USB_DESCRIPTOR_DEVICE_BINARY_OBJECT = 15,
|
||||||
|
USB_DESCRIPTOR_DEVICE_BINARY_OBJECT_CAP = 16,
|
||||||
|
USB_DESCRIPTOR_HID = 33,
|
||||||
|
USB_DESCRIPTOR_HID_REPORT = 34
|
||||||
|
} usb_desc_type_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_DESCRIPTOR_MS_COMPAT_ID = 4,
|
||||||
|
USB_DESCRIPTOR_MS_EXTENDED_PROPERTIES = 5
|
||||||
|
} usb_vendor_desc_type_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_ATTR_REMOTE_WAKE_UP = 0x20,
|
||||||
|
USB_ATTR_SELF_POWERED = 0x40,
|
||||||
|
USB_ATTR_BUS_POWERED_RSVD = 0x80
|
||||||
|
} usb_cfg_attr_type_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
USB_EP_TYPE_CTRL = 0,
|
||||||
|
USB_EP_TYPE_ISO = 1,
|
||||||
|
USB_EP_TYPE_BULK = 2,
|
||||||
|
USB_EP_TYPE_INTR = 3
|
||||||
|
} usb_cfg_ep_type_t;
|
||||||
|
|
||||||
|
/* Device descriptor structure */
|
||||||
|
typedef struct _usb_dev_descr_t
|
||||||
|
{
|
||||||
|
u8 bLength; // Size of this descriptor in bytes.
|
||||||
|
u8 bDescriptorType; // Device Descriptor Type. (USB_DESCRIPTOR_DEVICE)
|
||||||
|
u16 bcdUSB; // USB Spec. Release number (2.1).
|
||||||
|
u8 bDeviceClass; // Class is specified in the interface descriptor.
|
||||||
|
u8 bDeviceSubClass; // SubClass is specified in the interface descriptor.
|
||||||
|
u8 bDeviceProtocol; // Protocol is specified in the interface descriptor.
|
||||||
|
u8 bMaxPacketSize; // Maximum packet size for EP0.
|
||||||
|
u16 idVendor; // Vendor ID assigned by USB forum.
|
||||||
|
u16 idProduct; // Product ID assigned by Organization.
|
||||||
|
u16 bcdDevice; // Device Release number in BCD.
|
||||||
|
u8 iManufacturer; // Index of String descriptor describing Manufacturer.
|
||||||
|
u8 iProduct; // Index of String descriptor describing Product.
|
||||||
|
u8 iSerialNumber; // Index of String descriptor describing Serial number.
|
||||||
|
u8 bNumConfigs; // Number of possible configuration.
|
||||||
|
} __attribute__((packed)) usb_dev_descr_t;
|
||||||
|
|
||||||
|
/* Device Qualifier descriptor structure */
|
||||||
|
typedef struct _usb_dev_qual_descr_t
|
||||||
|
{
|
||||||
|
u8 bLength; // Size of this descriptor in bytes.
|
||||||
|
u8 bDescriptorType; // Device Descriptor Type. (USB_DESCRIPTOR_DEVICE_QUALIFIER)
|
||||||
|
u16 bcdUSB; // USB Spec. Release number (2.1).
|
||||||
|
u8 bDeviceClass; // Class is specified in the interface descriptor.
|
||||||
|
u8 bDeviceSubClass; // SubClass is specified in the interface descriptor.
|
||||||
|
u8 bDeviceProtocol; // Protocol is specified in the interface descriptor.
|
||||||
|
u8 bMaxPacketSize; // Maximum packet size for EP0.
|
||||||
|
u8 bNumOtherConfigs; // Number of possible other-speed configurations.
|
||||||
|
u8 bReserved; // Reserved for future use, must be zero
|
||||||
|
} __attribute__((packed)) usb_dev_qual_descr_t;
|
||||||
|
|
||||||
|
/* Configuration descriptor structure */
|
||||||
|
typedef struct _usb_cfg_descr_t
|
||||||
|
{
|
||||||
|
u8 bLength; // Length of this descriptor.
|
||||||
|
u8 bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION).
|
||||||
|
u16 wTotalLength; // Total length of all descriptors for this configuration.
|
||||||
|
u8 bNumInterfaces; // Number of interfaces in this configuration.
|
||||||
|
u8 bConfigurationValue; // Value of this configuration (1 based).
|
||||||
|
u8 iConfiguration; // Index of String Descriptor describing the configuration.
|
||||||
|
u8 bmAttributes; // Configuration characteristics.
|
||||||
|
u8 bMaxPower; // Maximum power consumed by this configuration.
|
||||||
|
} __attribute__((packed)) usb_cfg_descr_t;
|
||||||
|
|
||||||
|
/* Interface descriptor structure */
|
||||||
|
typedef struct _usb_inter_descr_t
|
||||||
|
{
|
||||||
|
u8 bLength; // Length of this descriptor.
|
||||||
|
u8 bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE).
|
||||||
|
u8 bInterfaceNumber; // Number of this interface (0 based).
|
||||||
|
u8 bAlternateSetting; // Value of this alternate interface setting.
|
||||||
|
u8 bNumEndpoints; // Number of endpoints in this interface.
|
||||||
|
u8 bInterfaceClass; // Class code (assigned by the USB-IF).
|
||||||
|
u8 bInterfaceSubClass; // Subclass code (assigned by the USB-IF).
|
||||||
|
u8 bInterfaceProtocol; // Protocol code (assigned by the USB-IF).
|
||||||
|
u8 iInterface; // Index of String Descriptor describing the interface.
|
||||||
|
} __attribute__((packed)) usb_inter_descr_t;
|
||||||
|
|
||||||
|
/* HID descriptor structure */
|
||||||
|
typedef struct _usb_hid_descr_t
|
||||||
|
{
|
||||||
|
u8 bLength; // Length of this descriptor.
|
||||||
|
u8 bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_HID).
|
||||||
|
u16 bcdHID; // HID class specification release
|
||||||
|
u8 bCountryCode; // Country code.
|
||||||
|
u8 bNumDescriptors; // Number of descriptors.
|
||||||
|
u8 bClassDescriptorType; // Type of class descriptor (USB_DESCRIPTOR_HID_REPORT).
|
||||||
|
u16 bDescriptorLength; // Report descriptor length.
|
||||||
|
} __attribute__((packed)) usb_hid_descr_t;
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure */
|
||||||
|
typedef struct _usb_ep_descr_t
|
||||||
|
{
|
||||||
|
u8 bLength; // Length of this descriptor.
|
||||||
|
u8 bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT).
|
||||||
|
u8 bEndpointAddress; // Endpoint address. bit7 indicates direction (0=OUT, 1=IN).
|
||||||
|
u8 bmAttributes; // Endpoint transfer type.
|
||||||
|
u16 wMaxPacketSize; // Maximum packet size.
|
||||||
|
u8 bInterval; // Polling interval in frames. For Interrupt and Isochronous data transfer only.
|
||||||
|
} __attribute__((packed)) usb_ep_descr_t;
|
||||||
|
|
||||||
|
typedef struct _usb_cfg_simple_descr_t
|
||||||
|
{
|
||||||
|
usb_cfg_descr_t config;
|
||||||
|
usb_inter_descr_t interface;
|
||||||
|
usb_ep_descr_t endpoint[2];
|
||||||
|
} __attribute__((packed)) usb_cfg_simple_descr_t;
|
||||||
|
|
||||||
|
typedef struct _usb_cfg_hid_descr_t
|
||||||
|
{
|
||||||
|
usb_cfg_descr_t config;
|
||||||
|
usb_inter_descr_t interface;
|
||||||
|
usb_hid_descr_t hid;
|
||||||
|
usb_ep_descr_t endpoint[2];
|
||||||
|
} __attribute__((packed)) usb_cfg_hid_descr_t;
|
||||||
|
|
||||||
|
typedef struct _usb_dev_bot_t
|
||||||
|
{
|
||||||
|
u8 bLength; // Size of this descriptor in bytes.
|
||||||
|
u8 bDescriptorType; // Device Descriptor Type. (USB_DESCRIPTOR_DEVICE_BINARY_OBJECT)
|
||||||
|
u16 wTotalLength; // Size of this descriptor in bytes.
|
||||||
|
u8 bNumDeviceCaps; // Number of device capabilities in this descriptor.
|
||||||
|
|
||||||
|
/* Device Capability USB 2.0 Extension Descriptor */
|
||||||
|
/* Needed for a USB2.10 device. */
|
||||||
|
u8 bLengthCap0; // Size of this capability descriptor in bytes.
|
||||||
|
u8 bDescriptorTypeCap0; // Device Capability Descriptor Type. (USB_DESCRIPTOR_DEVICE_BINARY_OBJECT_CAP)
|
||||||
|
u8 bDevCapabilityTypeCap0; // USB2: 2.
|
||||||
|
u32 bmAttributesCap0; // bit1: Link Power Management (LPM).
|
||||||
|
|
||||||
|
u8 bLengthCap1; // Size of this capability descriptor in bytes.
|
||||||
|
u8 bDescriptorTypeCap1; // Device Capability Descriptor Type. (USB_DESCRIPTOR_DEVICE_BINARY_OBJECT_CAP)
|
||||||
|
u8 bDevCapabilityTypeCap1; // USB3: 3.
|
||||||
|
u8 bmAttributesCap1; // bit1: Latency Tolerance Messaging (LTM).
|
||||||
|
u16 wSpeedsSupported; // Supported bus speeds. 1: Low Speed, 2: Full Speed, 4: High Speed, 8: Super Speed.
|
||||||
|
u8 bFunctionalitySupport; // Lowest speed at which all the functionality is available. 1: Full speed and above.
|
||||||
|
u8 bU1DevExitLat; // USB3.0 U1 exit latency.
|
||||||
|
u16 wU2DevExitLat; // USB3.0 U2 exit latency.
|
||||||
|
|
||||||
|
} __attribute__((packed)) usb_dev_bot_t;
|
||||||
|
|
||||||
|
/* Microsoft OS String descriptor structure */
|
||||||
|
typedef struct _usb_ms_os_descr_t
|
||||||
|
{
|
||||||
|
u8 bLength; // 0x12
|
||||||
|
u8 bDescriptorType; // 3
|
||||||
|
u16 wSignature[7]; // "MSFT100" UTF16 LE
|
||||||
|
u8 bVendorCode; //
|
||||||
|
u8 bPadding;
|
||||||
|
} __attribute__((packed)) usb_ms_os_descr_t;
|
||||||
|
|
||||||
|
/* Microsoft Compatible ID Feature descriptor structure */
|
||||||
|
typedef struct _usb_ms_cid_descr_t
|
||||||
|
{
|
||||||
|
u32 dLength;
|
||||||
|
u16 wVersion;
|
||||||
|
u16 wCompatibilityId;
|
||||||
|
u8 bSections;
|
||||||
|
u8 bReserved0[7];
|
||||||
|
u8 bInterfaceNumber;
|
||||||
|
u8 bReserved1;
|
||||||
|
u8 bCompatibleId[8];
|
||||||
|
u8 bSubCompatibleId[8];
|
||||||
|
u8 bReserved2[6];
|
||||||
|
} __attribute__((packed)) usb_ms_cid_descr_t;
|
||||||
|
|
||||||
|
/* Microsoft Extended Properties Feature descriptor structure */
|
||||||
|
typedef struct _usb_ms_ext_prop_descr_t
|
||||||
|
{
|
||||||
|
u32 dLength;
|
||||||
|
u16 wVersion;
|
||||||
|
u16 wExtendedProperty;
|
||||||
|
u16 wSections;
|
||||||
|
u32 dPropertySize;
|
||||||
|
u32 dPropertyType;
|
||||||
|
u16 wPropertyNameLength;
|
||||||
|
u16 wPropertyName[22]; // UTF16 LE
|
||||||
|
u32 dPropertyDataLength;
|
||||||
|
u16 wPropertyData[2]; // UTF16 LE
|
||||||
|
} __attribute__((packed)) usb_ms_ext_prop_descr_t;
|
||||||
|
|
||||||
|
typedef struct _usb_desc_t
|
||||||
|
{
|
||||||
|
usb_dev_descr_t *dev;
|
||||||
|
usb_dev_qual_descr_t *dev_qual;
|
||||||
|
usb_cfg_simple_descr_t *cfg;
|
||||||
|
usb_cfg_simple_descr_t *cfg_other;
|
||||||
|
usb_dev_bot_t *dev_bot;
|
||||||
|
u8 *vendor;
|
||||||
|
u8 *product;
|
||||||
|
u8 *serial;
|
||||||
|
u8 *lang_id;
|
||||||
|
usb_ms_os_descr_t *ms_os;
|
||||||
|
usb_ms_cid_descr_t *ms_cid;
|
||||||
|
usb_ms_ext_prop_descr_t *mx_ext;
|
||||||
|
} usb_desc_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
558
bdk/usb/usb_descriptors.c
Normal file
558
bdk/usb/usb_descriptors.c
Normal file
@@ -0,0 +1,558 @@
|
|||||||
|
/*
|
||||||
|
* USB driver for Tegra X1
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <usb/usb_descriptor_types.h>
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
|
static usb_dev_descr_t usb_device_descriptor_ums =
|
||||||
|
{
|
||||||
|
.bLength = 18,
|
||||||
|
.bDescriptorType = USB_DESCRIPTOR_DEVICE,
|
||||||
|
.bcdUSB = 0x210,
|
||||||
|
.bDeviceClass = 0x00,
|
||||||
|
.bDeviceSubClass = 0x00,
|
||||||
|
.bDeviceProtocol = 0x00,
|
||||||
|
.bMaxPacketSize = 0x40,
|
||||||
|
.idVendor = 0x11EC, // Nintendo: 0x057E, Nvidia: 0x0955
|
||||||
|
.idProduct = 0xA7E0, // Switch: 0x2000, usbd: 0x3000
|
||||||
|
.bcdDevice = 0x0101,
|
||||||
|
.iManufacturer = 1,
|
||||||
|
.iProduct = 2,
|
||||||
|
.iSerialNumber = 3,
|
||||||
|
.bNumConfigs = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_dev_qual_descr_t usb_device_qualifier_descriptor =
|
||||||
|
{
|
||||||
|
.bLength = 10,
|
||||||
|
.bDescriptorType = USB_DESCRIPTOR_DEVICE_QUALIFIER,
|
||||||
|
.bcdUSB = 0x210,
|
||||||
|
.bDeviceClass = 0x00,
|
||||||
|
.bDeviceSubClass = 0x00,
|
||||||
|
.bDeviceProtocol = 0x00,
|
||||||
|
.bMaxPacketSize = 0x40,
|
||||||
|
.bNumOtherConfigs = 0x01,
|
||||||
|
.bReserved = 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_cfg_simple_descr_t usb_configuration_descriptor_ums =
|
||||||
|
{
|
||||||
|
/* Configuration descriptor structure */
|
||||||
|
.config.bLength = 9,
|
||||||
|
.config.bDescriptorType = USB_DESCRIPTOR_CONFIGURATION,
|
||||||
|
.config.wTotalLength = 0x20,
|
||||||
|
.config.bNumInterfaces = 0x01,
|
||||||
|
.config.bConfigurationValue = 0x01,
|
||||||
|
.config.iConfiguration = 0x00,
|
||||||
|
.config.bmAttributes = USB_ATTR_SELF_POWERED | USB_ATTR_BUS_POWERED_RSVD,
|
||||||
|
.config.bMaxPower = 32 / 2,
|
||||||
|
|
||||||
|
/* Interface descriptor structure */
|
||||||
|
.interface.bLength = 9,
|
||||||
|
.interface.bDescriptorType = USB_DESCRIPTOR_INTERFACE,
|
||||||
|
.interface.bInterfaceNumber = 0,
|
||||||
|
.interface.bAlternateSetting = 0,
|
||||||
|
.interface.bNumEndpoints = 2,
|
||||||
|
.interface.bInterfaceClass = 0x08, // Mass Storage Class.
|
||||||
|
.interface.bInterfaceSubClass = 0x06, // SCSI Transparent Command Set.
|
||||||
|
.interface.bInterfaceProtocol = 0x50, // Bulk-Only Transport.
|
||||||
|
.interface.iInterface = 0x00,
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 IN */
|
||||||
|
.endpoint[0].bLength = 7,
|
||||||
|
.endpoint[0].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[0].bEndpointAddress = 0x81, // USB_EP_ADDR_BULK_IN.
|
||||||
|
.endpoint[0].bmAttributes = USB_EP_TYPE_BULK,
|
||||||
|
.endpoint[0].wMaxPacketSize = 0x200,
|
||||||
|
.endpoint[0].bInterval = 0x00,
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 OUT */
|
||||||
|
.endpoint[1].bLength = 7,
|
||||||
|
.endpoint[1].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[1].bEndpointAddress = 0x01, // USB_EP_ADDR_BULK_OUT.
|
||||||
|
.endpoint[1].bmAttributes = USB_EP_TYPE_BULK,
|
||||||
|
.endpoint[1].wMaxPacketSize = 0x200,
|
||||||
|
.endpoint[1].bInterval = 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_cfg_simple_descr_t usb_other_speed_config_descriptor_ums =
|
||||||
|
{
|
||||||
|
/* Other Speed Configuration descriptor structure */
|
||||||
|
.config.bLength = 9,
|
||||||
|
.config.bDescriptorType = USB_DESCRIPTOR_OTHER_SPEED_CONFIGURATION,
|
||||||
|
.config.wTotalLength = 0x20,
|
||||||
|
.config.bNumInterfaces = 0x01,
|
||||||
|
.config.bConfigurationValue = 0x01,
|
||||||
|
.config.iConfiguration = 0x00,
|
||||||
|
.config.bmAttributes = USB_ATTR_SELF_POWERED | USB_ATTR_BUS_POWERED_RSVD,
|
||||||
|
.config.bMaxPower = 32 / 2,
|
||||||
|
|
||||||
|
/* Interface descriptor structure */
|
||||||
|
.interface.bLength = 9,
|
||||||
|
.interface.bDescriptorType = USB_DESCRIPTOR_INTERFACE,
|
||||||
|
.interface.bInterfaceNumber = 0x00,
|
||||||
|
.interface.bAlternateSetting = 0x00,
|
||||||
|
.interface.bNumEndpoints = 2,
|
||||||
|
.interface.bInterfaceClass = 0x08, // Mass Storage Class.
|
||||||
|
.interface.bInterfaceSubClass = 0x06, // SCSI Transparent Command Set.
|
||||||
|
.interface.bInterfaceProtocol = 0x50, // Bulk-Only Transport.
|
||||||
|
.interface.iInterface = 0x00,
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 IN */
|
||||||
|
.endpoint[0].bLength = 7,
|
||||||
|
.endpoint[0].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[0].bEndpointAddress = 0x81, // USB_EP_ADDR_BULK_IN.
|
||||||
|
.endpoint[0].bmAttributes = USB_EP_TYPE_BULK,
|
||||||
|
.endpoint[0].wMaxPacketSize = 0x40,
|
||||||
|
.endpoint[0].bInterval = 0,
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 OUT */
|
||||||
|
.endpoint[1].bLength = 7,
|
||||||
|
.endpoint[1].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[1].bEndpointAddress = 0x01, // USB_EP_ADDR_BULK_OUT.
|
||||||
|
.endpoint[1].bmAttributes = USB_EP_TYPE_BULK,
|
||||||
|
.endpoint[1].wMaxPacketSize = 0x40,
|
||||||
|
.endpoint[1].bInterval = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_dev_bot_t usb_device_binary_object_descriptor =
|
||||||
|
{
|
||||||
|
.bLength = 5,
|
||||||
|
.bDescriptorType = USB_DESCRIPTOR_DEVICE_BINARY_OBJECT,
|
||||||
|
.wTotalLength = 22,
|
||||||
|
.bNumDeviceCaps = 2,
|
||||||
|
|
||||||
|
/* Device Capability USB 2.0 Extension Descriptor */
|
||||||
|
.bLengthCap0 = 7,
|
||||||
|
.bDescriptorTypeCap0 = USB_DESCRIPTOR_DEVICE_BINARY_OBJECT_CAP,
|
||||||
|
.bDevCapabilityTypeCap0 = 2, // USB2.
|
||||||
|
.bmAttributesCap0 = 0,
|
||||||
|
|
||||||
|
/* Device Capability SuperSpeed Descriptor */
|
||||||
|
/* Needed for a USB2.10 device. */
|
||||||
|
.bLengthCap1 = 10,
|
||||||
|
.bDescriptorTypeCap1 = USB_DESCRIPTOR_DEVICE_BINARY_OBJECT_CAP,
|
||||||
|
.bDevCapabilityTypeCap1 = 3, // USB3.
|
||||||
|
.bmAttributesCap1 = 0,
|
||||||
|
.wSpeedsSupported = 0x6, // FS | HS.
|
||||||
|
.bFunctionalitySupport = 1, // FS and above.
|
||||||
|
.bU1DevExitLat = 0,
|
||||||
|
.wU2DevExitLat = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 usb_lang_id_string_descriptor[4] =
|
||||||
|
{
|
||||||
|
4, 3,
|
||||||
|
0x09, 0x04
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 usb_serial_string_descriptor[26] =
|
||||||
|
{
|
||||||
|
26, 0x03,
|
||||||
|
'C', 0x00, '7', 0x00, 'C', 0x00, '0', 0x00,
|
||||||
|
'9', 0x00, '2', 0x00, '4', 0x00, '2', 0x00, 'F', 0x00, '7', 0x00, '0', 0x00, '3', 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 usb_vendor_string_descriptor_ums[32] =
|
||||||
|
{
|
||||||
|
26, 0x03,
|
||||||
|
'N', 0, 'y', 0, 'x', 0, ' ', 0, 'U', 0, 'S', 0, 'B', 0, ' ', 0,
|
||||||
|
'D', 0, 'i', 0, 's', 0, 'k', 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 usb_product_string_descriptor_ums[22] =
|
||||||
|
{
|
||||||
|
8, 0x03,
|
||||||
|
'U', 0, 'M', 0, 'S', 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_ms_os_descr_t usb_ms_os_descriptor =
|
||||||
|
{
|
||||||
|
.bLength = 0x28,
|
||||||
|
.bDescriptorType = 0x03,
|
||||||
|
.wSignature[0] = 'M',
|
||||||
|
.wSignature[1] = 'S',
|
||||||
|
.wSignature[2] = 'F',
|
||||||
|
.wSignature[3] = 'T',
|
||||||
|
.wSignature[4] = '1',
|
||||||
|
.wSignature[5] = '0',
|
||||||
|
.wSignature[6] = '0',
|
||||||
|
.bVendorCode = 0x99,
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_ms_cid_descr_t usb_ms_cid_descriptor =
|
||||||
|
{
|
||||||
|
.dLength = 0x28,
|
||||||
|
.wVersion = 0x100,
|
||||||
|
.wCompatibilityId = USB_DESCRIPTOR_MS_COMPAT_ID,
|
||||||
|
.bSections = 1,
|
||||||
|
.bInterfaceNumber = 0,
|
||||||
|
.bReserved1 = 1,
|
||||||
|
|
||||||
|
.bCompatibleId[0] = 'N',
|
||||||
|
.bCompatibleId[1] = 'Y',
|
||||||
|
.bCompatibleId[2] = 'X',
|
||||||
|
.bCompatibleId[3] = 'U',
|
||||||
|
.bCompatibleId[4] = 'S',
|
||||||
|
.bCompatibleId[5] = 'B',
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_ms_ext_prop_descr_t usb_ms_ext_prop_descriptor_ums =
|
||||||
|
{
|
||||||
|
.dLength = 0x48,
|
||||||
|
.wVersion = 0x100,
|
||||||
|
.wExtendedProperty = USB_DESCRIPTOR_MS_EXTENDED_PROPERTIES,
|
||||||
|
.wSections = 1,
|
||||||
|
|
||||||
|
.dPropertySize = 0x3E,
|
||||||
|
.dPropertyType = 4, // DWORD
|
||||||
|
|
||||||
|
.wPropertyNameLength = 0x2C,
|
||||||
|
.wPropertyName[0] = 'M', // MaximumTransferLength.
|
||||||
|
.wPropertyName[1] = 'a',
|
||||||
|
.wPropertyName[2] = 'x',
|
||||||
|
.wPropertyName[3] = 'i',
|
||||||
|
.wPropertyName[4] = 'm',
|
||||||
|
.wPropertyName[5] = 'u',
|
||||||
|
.wPropertyName[6] = 'm',
|
||||||
|
.wPropertyName[7] = 'T',
|
||||||
|
.wPropertyName[8] = 'r',
|
||||||
|
.wPropertyName[9] = 'a',
|
||||||
|
.wPropertyName[10] = 'n',
|
||||||
|
.wPropertyName[11] = 's',
|
||||||
|
.wPropertyName[12] = 'f',
|
||||||
|
.wPropertyName[13] = 'e',
|
||||||
|
.wPropertyName[14] = 'r',
|
||||||
|
.wPropertyName[15] = 'L',
|
||||||
|
.wPropertyName[16] = 'e',
|
||||||
|
.wPropertyName[17] = 'n',
|
||||||
|
.wPropertyName[18] = 'g',
|
||||||
|
.wPropertyName[19] = 't',
|
||||||
|
.wPropertyName[20] = 'h',
|
||||||
|
.wPropertyName[21] = 0,
|
||||||
|
|
||||||
|
.dPropertyDataLength = 0x4,
|
||||||
|
.wPropertyData[0] = 0x00, // 1MB.
|
||||||
|
.wPropertyData[1] = 0x10,
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_ms_ext_prop_descr_t usb_ms_ext_prop_descriptor_hid =
|
||||||
|
{
|
||||||
|
.dLength = 7,
|
||||||
|
.wVersion = 0x100,
|
||||||
|
.wExtendedProperty = USB_DESCRIPTOR_MS_EXTENDED_PROPERTIES,
|
||||||
|
.wSections = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_dev_descr_t usb_device_descriptor_hid_jc =
|
||||||
|
{
|
||||||
|
.bLength = 18,
|
||||||
|
.bDescriptorType = USB_DESCRIPTOR_DEVICE,
|
||||||
|
.bcdUSB = 0x210,
|
||||||
|
.bDeviceClass = 0x00,
|
||||||
|
.bDeviceSubClass = 0x00,
|
||||||
|
.bDeviceProtocol = 0x00,
|
||||||
|
.bMaxPacketSize = 0x40,
|
||||||
|
.idVendor = 0x11EC, // Nintendo: 0x057E, Nvidia: 0x0955
|
||||||
|
.idProduct = 0xA7E1, // Switch: 0x2000, usbd: 0x3000
|
||||||
|
.bcdDevice = 0x0101,
|
||||||
|
.iManufacturer = 1,
|
||||||
|
.iProduct = 2,
|
||||||
|
.iSerialNumber = 3,
|
||||||
|
.bNumConfigs = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_dev_descr_t usb_device_descriptor_hid_touch =
|
||||||
|
{
|
||||||
|
.bLength = 18,
|
||||||
|
.bDescriptorType = USB_DESCRIPTOR_DEVICE,
|
||||||
|
.bcdUSB = 0x210,
|
||||||
|
.bDeviceClass = 0x00,
|
||||||
|
.bDeviceSubClass = 0x00,
|
||||||
|
.bDeviceProtocol = 0x00,
|
||||||
|
.bMaxPacketSize = 0x40,
|
||||||
|
.idVendor = 0x11EC, // Nintendo: 0x057E, Nvidia: 0x0955
|
||||||
|
.idProduct = 0xA7E2, // Switch: 0x2000, usbd: 0x3000
|
||||||
|
.bcdDevice = 0x0101,
|
||||||
|
.iManufacturer = 1,
|
||||||
|
.iProduct = 2,
|
||||||
|
.iSerialNumber = 3,
|
||||||
|
.bNumConfigs = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
u8 hid_report_descriptor_jc[] =
|
||||||
|
{
|
||||||
|
0x05, 0x01, // USAGE_PAGE (Generic Desktop),
|
||||||
|
0x09, 0x04, // USAGE (Joystick),
|
||||||
|
0xa1, 0x01, // COLLECTION (Application),
|
||||||
|
0xa1, 0x02, // COLLECTION (Logical),
|
||||||
|
0x75, 0x08, // REPORT_SIZE (8),
|
||||||
|
0x95, 0x04, // REPORT_COUNT (4),
|
||||||
|
0x15, 0x00, // LOGICAL_MINIMUM (0),
|
||||||
|
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255),
|
||||||
|
0x35, 0x00, // PHYSICAL_MINIMUM (0),
|
||||||
|
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255),
|
||||||
|
0x09, 0x30, // USAGE (X_ID),
|
||||||
|
0x09, 0x31, // USAGE (Y_ID),
|
||||||
|
0x09, 0x32, // USAGE (Z_ID),
|
||||||
|
0x09, 0x35, // USAGE (Rz_ID),
|
||||||
|
0x81, 0x02, // INPUT (IOF_Variable),
|
||||||
|
0x75, 0x04, // REPORT_SIZE (4),
|
||||||
|
0x95, 0x01, // REPORT_COUNT (1),
|
||||||
|
0x25, 0x07, // LOGICAL_MAXIMUM (7),
|
||||||
|
0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM (315),
|
||||||
|
0x65, 0x14, // UNIT (Eng_Rot_Angular_Pos),
|
||||||
|
0x09, 0x39, // USAGE (Hat_Switch),
|
||||||
|
0x81, 0x42, // INPUT (IOF_NullposVar),
|
||||||
|
0x65, 0x00, // UNIT (Unit_None),
|
||||||
|
0x75, 0x01, // REPORT_SIZE (1),
|
||||||
|
0x95, 0x0c, // REPORT_COUNT (12),
|
||||||
|
0x25, 0x01, // LOGICAL_MAXIMUM (1),
|
||||||
|
0x45, 0x01, // PHYSICAL_MAXIMUM (1),
|
||||||
|
0x05, 0x09, // USAGE_PAGE (Button_ID),
|
||||||
|
0x19, 0x01, // USAGE_MINIMUM (1),
|
||||||
|
0x29, 0x0c, // USAGE_MAXIMUM (12),
|
||||||
|
0x81, 0x02, // INPUT (IOF_Variable),
|
||||||
|
0xc0, // END_COLLECTION(),
|
||||||
|
0xc0 // END_COLLECTION(),
|
||||||
|
};
|
||||||
|
|
||||||
|
u32 hid_report_descriptor_jc_size = sizeof(hid_report_descriptor_jc);
|
||||||
|
|
||||||
|
u8 hid_report_descriptor_touch[] =
|
||||||
|
{
|
||||||
|
0x05, 0x0d, // USAGE_PAGE (Digitizers)
|
||||||
|
0x09, 0x05, // USAGE (Touch Pad)
|
||||||
|
0xa1, 0x01, // COLLECTION (Application)
|
||||||
|
0x85, 0x05, // REPORT_ID (Touch pad)
|
||||||
|
0x09, 0x22, // USAGE (Finger)
|
||||||
|
0xa1, 0x02, // COLLECTION (Logical)
|
||||||
|
0x15, 0x00, // LOGICAL_MINIMUM (0)
|
||||||
|
0x25, 0x01, // LOGICAL_MAXIMUM (1)
|
||||||
|
0x09, 0x42, // USAGE (Tip switch)
|
||||||
|
0x95, 0x01, // REPORT_COUNT (1)
|
||||||
|
0x75, 0x01, // REPORT_SIZE (1)
|
||||||
|
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||||
|
|
||||||
|
0x15, 0x00, // LOGICAL_MINIMUM (1)
|
||||||
|
0x25, 0x01, // LOGICAL_MAXIMUM (1)
|
||||||
|
0x75, 0x01, // REPORT_SIZE (1)
|
||||||
|
0x95, 0x07, // REPORT_COUNT (7)
|
||||||
|
0x09, 0x54, // USAGE (Contact Count)
|
||||||
|
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||||
|
|
||||||
|
0x95, 0x01, // REPORT_COUNT (1)
|
||||||
|
0x75, 0x08, // REPORT_SIZE (8)
|
||||||
|
0x15, 0x00, // LOGICAL_MINIMUM (0)
|
||||||
|
0x25, 0x0A, // LOGICAL_MAXIMUM (10)
|
||||||
|
0x09, 0x51, // USAGE (Contact Identifier)
|
||||||
|
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||||
|
|
||||||
|
// 0x15, 0x00, // LOGICAL_MINIMUM (0)
|
||||||
|
// 0x26, 0xF8, 0x2A, // LOGICAL_MAXIMUM (11000)
|
||||||
|
// 0x95, 0x01, // REPORT_COUNT (1)
|
||||||
|
// 0x75, 0x08, // REPORT_SIZE (16)
|
||||||
|
// 0x09, 0x30, // USAGE (Pressure)
|
||||||
|
// 0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||||
|
|
||||||
|
0x05, 0x01, // USAGE_PAGE (Generic Desk..
|
||||||
|
0x15, 0x00, // LOGICAL_MINIMUM (0)
|
||||||
|
0x26, 0xff, 0x04, // LOGICAL_MAXIMUM (1279)
|
||||||
|
0x75, 0x10, // REPORT_SIZE (16)
|
||||||
|
0x55, 0x0e, // UNIT_EXPONENT (-2)
|
||||||
|
0x65, 0x13, // UNIT(Inch,EngLinear)
|
||||||
|
0x09, 0x30, // USAGE (X)
|
||||||
|
0x35, 0x00, // PHYSICAL_MINIMUM (0)
|
||||||
|
0x46, 0xFF, 0x04, // PHYSICAL_MAXIMUM (1279)
|
||||||
|
0x95, 0x01, // REPORT_COUNT (1)
|
||||||
|
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||||
|
0x26, 0xCF, 0x02, // LOGICAL_MAXIMUM (719)
|
||||||
|
0x46, 0xCF, 0x02, // PHYSICAL_MAXIMUM (719)
|
||||||
|
0x09, 0x31, // USAGE (Y)
|
||||||
|
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||||
|
|
||||||
|
0x05, 0x0d, // USAGE PAGE (Digitizers)
|
||||||
|
0xc0, // END_COLLECTION
|
||||||
|
0xc0, // END_COLLECTION
|
||||||
|
};
|
||||||
|
u32 hid_report_descriptor_touch_size = sizeof(hid_report_descriptor_touch);
|
||||||
|
|
||||||
|
static usb_cfg_hid_descr_t usb_configuration_descriptor_hid_jc =
|
||||||
|
{
|
||||||
|
/* Configuration descriptor structure */
|
||||||
|
.config.bLength = 9,
|
||||||
|
.config.bDescriptorType = USB_DESCRIPTOR_CONFIGURATION,
|
||||||
|
.config.wTotalLength = sizeof(usb_cfg_hid_descr_t),
|
||||||
|
.config.bNumInterfaces = 0x01,
|
||||||
|
.config.bConfigurationValue = 0x01,
|
||||||
|
.config.iConfiguration = 0x00,
|
||||||
|
.config.bmAttributes = USB_ATTR_SELF_POWERED | USB_ATTR_BUS_POWERED_RSVD,
|
||||||
|
.config.bMaxPower = 32 / 2,
|
||||||
|
|
||||||
|
/* Interface descriptor structure */
|
||||||
|
.interface.bLength = 9,
|
||||||
|
.interface.bDescriptorType = USB_DESCRIPTOR_INTERFACE,
|
||||||
|
.interface.bInterfaceNumber = 0,
|
||||||
|
.interface.bAlternateSetting = 0,
|
||||||
|
.interface.bNumEndpoints = 2,
|
||||||
|
.interface.bInterfaceClass = 0x03, // Human Interface Device Class.
|
||||||
|
.interface.bInterfaceSubClass = 0x00, // SCSI Transparent Command Set.
|
||||||
|
.interface.bInterfaceProtocol = 0x00, // Bulk-Only Transport.
|
||||||
|
.interface.iInterface = 0x00,
|
||||||
|
|
||||||
|
.hid.bLength = 9,
|
||||||
|
.hid.bDescriptorType = USB_DESCRIPTOR_HID,
|
||||||
|
.hid.bcdHID = 0x110,
|
||||||
|
.hid.bCountryCode = 0,
|
||||||
|
.hid.bNumDescriptors = 1,
|
||||||
|
.hid.bClassDescriptorType = USB_DESCRIPTOR_HID_REPORT,
|
||||||
|
.hid.bDescriptorLength = sizeof(hid_report_descriptor_jc),
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 IN */
|
||||||
|
.endpoint[0].bLength = 7,
|
||||||
|
.endpoint[0].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[0].bEndpointAddress = 0x81, // USB_EP_ADDR_BULK_IN.
|
||||||
|
.endpoint[0].bmAttributes = USB_EP_TYPE_INTR,
|
||||||
|
.endpoint[0].wMaxPacketSize = 0x200,
|
||||||
|
.endpoint[0].bInterval = 4, // 8ms on HS.
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 OUT */
|
||||||
|
.endpoint[1].bLength = 7,
|
||||||
|
.endpoint[1].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[1].bEndpointAddress = 0x01, // USB_EP_ADDR_BULK_OUT.
|
||||||
|
.endpoint[1].bmAttributes = USB_EP_TYPE_INTR,
|
||||||
|
.endpoint[1].wMaxPacketSize = 0x200,
|
||||||
|
.endpoint[1].bInterval = 4 // 8ms on HS.
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 usb_vendor_string_descriptor_hid[22] =
|
||||||
|
{
|
||||||
|
16, 0x03,
|
||||||
|
'N', 0, 'y', 0, 'x', 0, ' ', 0,
|
||||||
|
'U', 0, 'S', 0, 'B', 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 usb_product_string_descriptor_hid_jc[24] =
|
||||||
|
{
|
||||||
|
24, 0x03,
|
||||||
|
'N', 0, 'y', 0, 'x', 0, ' ', 0,
|
||||||
|
'J', 0, 'o', 0, 'y', 0, '-', 0, 'C', 0, 'o', 0, 'n', 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 usb_product_string_descriptor_hid_touch[26] =
|
||||||
|
{
|
||||||
|
26, 0x03,
|
||||||
|
'N', 0, 'y', 0, 'x', 0, ' ', 0,
|
||||||
|
'T', 0, 'o', 0, 'u', 0, 'c', 0, 'h', 0, 'p', 0, 'a', 0, 'd', 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static usb_cfg_hid_descr_t usb_configuration_descriptor_hid_touch =
|
||||||
|
{
|
||||||
|
/* Configuration descriptor structure */
|
||||||
|
.config.bLength = 9,
|
||||||
|
.config.bDescriptorType = USB_DESCRIPTOR_CONFIGURATION,
|
||||||
|
.config.wTotalLength = sizeof(usb_cfg_hid_descr_t),
|
||||||
|
.config.bNumInterfaces = 0x01,
|
||||||
|
.config.bConfigurationValue = 0x01,
|
||||||
|
.config.iConfiguration = 0x00,
|
||||||
|
.config.bmAttributes = USB_ATTR_SELF_POWERED | USB_ATTR_BUS_POWERED_RSVD,
|
||||||
|
.config.bMaxPower = 32 / 2,
|
||||||
|
|
||||||
|
/* Interface descriptor structure */
|
||||||
|
.interface.bLength = 9,
|
||||||
|
.interface.bDescriptorType = USB_DESCRIPTOR_INTERFACE,
|
||||||
|
.interface.bInterfaceNumber = 0,
|
||||||
|
.interface.bAlternateSetting = 0,
|
||||||
|
.interface.bNumEndpoints = 2,
|
||||||
|
.interface.bInterfaceClass = 0x03, // Human Interface Device Class.
|
||||||
|
.interface.bInterfaceSubClass = 0x00, // SCSI Transparent Command Set.
|
||||||
|
.interface.bInterfaceProtocol = 0x00, // Bulk-Only Transport.
|
||||||
|
.interface.iInterface = 0x00,
|
||||||
|
|
||||||
|
.hid.bLength = 9,
|
||||||
|
.hid.bDescriptorType = USB_DESCRIPTOR_HID,
|
||||||
|
.hid.bcdHID = 0x111,
|
||||||
|
.hid.bCountryCode = 0,
|
||||||
|
.hid.bNumDescriptors = 1,
|
||||||
|
.hid.bClassDescriptorType = USB_DESCRIPTOR_HID_REPORT,
|
||||||
|
.hid.bDescriptorLength = sizeof(hid_report_descriptor_touch),
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 IN */
|
||||||
|
.endpoint[0].bLength = 7,
|
||||||
|
.endpoint[0].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[0].bEndpointAddress = 0x81, // USB_EP_ADDR_BULK_IN.
|
||||||
|
.endpoint[0].bmAttributes = USB_EP_TYPE_INTR,
|
||||||
|
.endpoint[0].wMaxPacketSize = 0x200,
|
||||||
|
.endpoint[0].bInterval = 3, // 4ms on HS.
|
||||||
|
|
||||||
|
/* Endpoint descriptor structure EP1 OUT */
|
||||||
|
.endpoint[1].bLength = 7,
|
||||||
|
.endpoint[1].bDescriptorType = USB_DESCRIPTOR_ENDPOINT,
|
||||||
|
.endpoint[1].bEndpointAddress = 0x01, // USB_EP_ADDR_BULK_OUT.
|
||||||
|
.endpoint[1].bmAttributes = USB_EP_TYPE_INTR,
|
||||||
|
.endpoint[1].wMaxPacketSize = 0x200,
|
||||||
|
.endpoint[1].bInterval = 3 // 4ms on HS.
|
||||||
|
};
|
||||||
|
|
||||||
|
usb_desc_t usb_gadget_ums_descriptors =
|
||||||
|
{
|
||||||
|
.dev = &usb_device_descriptor_ums,
|
||||||
|
.dev_qual = &usb_device_qualifier_descriptor,
|
||||||
|
.cfg = &usb_configuration_descriptor_ums,
|
||||||
|
.cfg_other = &usb_other_speed_config_descriptor_ums,
|
||||||
|
.dev_bot = &usb_device_binary_object_descriptor,
|
||||||
|
.vendor = usb_vendor_string_descriptor_ums,
|
||||||
|
.product = usb_product_string_descriptor_ums,
|
||||||
|
.serial = usb_serial_string_descriptor,
|
||||||
|
.lang_id = usb_lang_id_string_descriptor,
|
||||||
|
.ms_os = &usb_ms_os_descriptor,
|
||||||
|
.ms_cid = &usb_ms_cid_descriptor,
|
||||||
|
.mx_ext = &usb_ms_ext_prop_descriptor_ums
|
||||||
|
};
|
||||||
|
|
||||||
|
usb_desc_t usb_gadget_hid_jc_descriptors =
|
||||||
|
{
|
||||||
|
.dev = &usb_device_descriptor_hid_jc,
|
||||||
|
.dev_qual = &usb_device_qualifier_descriptor,
|
||||||
|
.cfg = (usb_cfg_simple_descr_t *)&usb_configuration_descriptor_hid_jc,
|
||||||
|
.cfg_other = NULL,
|
||||||
|
.dev_bot = &usb_device_binary_object_descriptor,
|
||||||
|
.vendor = usb_vendor_string_descriptor_hid,
|
||||||
|
.product = usb_product_string_descriptor_hid_jc,
|
||||||
|
.serial = usb_serial_string_descriptor,
|
||||||
|
.lang_id = usb_lang_id_string_descriptor,
|
||||||
|
.ms_os = &usb_ms_os_descriptor,
|
||||||
|
.ms_cid = &usb_ms_cid_descriptor,
|
||||||
|
.mx_ext = &usb_ms_ext_prop_descriptor_hid
|
||||||
|
};
|
||||||
|
|
||||||
|
usb_desc_t usb_gadget_hid_touch_descriptors =
|
||||||
|
{
|
||||||
|
.dev = &usb_device_descriptor_hid_touch,
|
||||||
|
.dev_qual = &usb_device_qualifier_descriptor,
|
||||||
|
.cfg = (usb_cfg_simple_descr_t *)&usb_configuration_descriptor_hid_touch,
|
||||||
|
.cfg_other = NULL,
|
||||||
|
.dev_bot = &usb_device_binary_object_descriptor,
|
||||||
|
.vendor = usb_vendor_string_descriptor_hid,
|
||||||
|
.product = usb_product_string_descriptor_hid_touch,
|
||||||
|
.serial = usb_serial_string_descriptor,
|
||||||
|
.lang_id = usb_lang_id_string_descriptor,
|
||||||
|
.ms_os = &usb_ms_os_descriptor,
|
||||||
|
.ms_cid = &usb_ms_cid_descriptor,
|
||||||
|
.mx_ext = &usb_ms_ext_prop_descriptor_hid
|
||||||
|
};
|
||||||
441
bdk/usb/usb_gadget_hid.c
Normal file
441
bdk/usb/usb_gadget_hid.c
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
/*
|
||||||
|
* USB Gadget HID driver for Tegra X1
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <usb/usbd.h>
|
||||||
|
#include <gfx_utils.h>
|
||||||
|
#include <input/joycon.h>
|
||||||
|
#include <input/touch.h>
|
||||||
|
#include <soc/hw_init.h>
|
||||||
|
#include <soc/t210.h>
|
||||||
|
#include <utils/util.h>
|
||||||
|
|
||||||
|
#include <memory_map.h>
|
||||||
|
|
||||||
|
//#define DPRINTF(...) gfx_printf(__VA_ARGS__)
|
||||||
|
#define DPRINTF(...)
|
||||||
|
|
||||||
|
typedef struct _gamepad_report_t
|
||||||
|
{
|
||||||
|
u8 x;
|
||||||
|
u8 y;
|
||||||
|
u8 z;
|
||||||
|
u8 rz;
|
||||||
|
|
||||||
|
u8 hat:4;
|
||||||
|
u8 btn1:1;
|
||||||
|
u8 btn2:1;
|
||||||
|
u8 btn3:1;
|
||||||
|
u8 btn4:1;
|
||||||
|
|
||||||
|
u8 btn5:1;
|
||||||
|
u8 btn6:1;
|
||||||
|
u8 btn7:1;
|
||||||
|
u8 btn8:1;
|
||||||
|
u8 btn9:1;
|
||||||
|
u8 btn10:1;
|
||||||
|
u8 btn11:1;
|
||||||
|
u8 btn12:1;
|
||||||
|
} __attribute__((packed)) gamepad_report_t;
|
||||||
|
|
||||||
|
typedef struct _jc_cal_t
|
||||||
|
{
|
||||||
|
bool cl_done;
|
||||||
|
bool cr_done;
|
||||||
|
u16 clx_max;
|
||||||
|
u16 clx_min;
|
||||||
|
u16 cly_max;
|
||||||
|
u16 cly_min;
|
||||||
|
u16 crx_max;
|
||||||
|
u16 crx_min;
|
||||||
|
u16 cry_max;
|
||||||
|
u16 cry_min;
|
||||||
|
} jc_cal_t;
|
||||||
|
|
||||||
|
static jc_cal_t jc_cal_ctx;
|
||||||
|
static usb_ops_t usb_ops;
|
||||||
|
|
||||||
|
static bool _jc_calibration(jc_gamepad_rpt_t *jc_pad)
|
||||||
|
{
|
||||||
|
// Calibrate left stick.
|
||||||
|
if (!jc_cal_ctx.cl_done)
|
||||||
|
{
|
||||||
|
if (jc_pad->conn_l
|
||||||
|
&& jc_pad->lstick_x > 0x400 && jc_pad->lstick_y > 0x400
|
||||||
|
&& jc_pad->lstick_x < 0xC00 && jc_pad->lstick_y < 0xC00)
|
||||||
|
{
|
||||||
|
jc_cal_ctx.clx_max = jc_pad->lstick_x + 0x72;
|
||||||
|
jc_cal_ctx.clx_min = jc_pad->lstick_x - 0x72;
|
||||||
|
jc_cal_ctx.cly_max = jc_pad->lstick_y + 0x72;
|
||||||
|
jc_cal_ctx.cly_min = jc_pad->lstick_y - 0x72;
|
||||||
|
jc_cal_ctx.cl_done = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calibrate right stick.
|
||||||
|
if (!jc_cal_ctx.cr_done)
|
||||||
|
{
|
||||||
|
if (jc_pad->conn_r
|
||||||
|
&& jc_pad->rstick_x > 0x400 && jc_pad->rstick_y > 0x400
|
||||||
|
&& jc_pad->rstick_x < 0xC00 && jc_pad->rstick_y < 0xC00)
|
||||||
|
{
|
||||||
|
jc_cal_ctx.crx_max = jc_pad->rstick_x + 0x72;
|
||||||
|
jc_cal_ctx.crx_min = jc_pad->rstick_x - 0x72;
|
||||||
|
jc_cal_ctx.cry_max = jc_pad->rstick_y + 0x72;
|
||||||
|
jc_cal_ctx.cry_min = jc_pad->rstick_y - 0x72;
|
||||||
|
jc_cal_ctx.cr_done = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool _jc_poll(gamepad_report_t *rpt)
|
||||||
|
{
|
||||||
|
// Poll Joy-Con.
|
||||||
|
jc_gamepad_rpt_t *jc_pad = joycon_poll();
|
||||||
|
|
||||||
|
if (!jc_pad)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Exit emulation if Left stick and Home are pressed.
|
||||||
|
if (jc_pad->l3 && jc_pad->home)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!jc_cal_ctx.cl_done || !jc_cal_ctx.cr_done)
|
||||||
|
{
|
||||||
|
if (!_jc_calibration(jc_pad))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-calibrate on disconnection.
|
||||||
|
if (!jc_pad->conn_l)
|
||||||
|
jc_cal_ctx.cl_done = false;
|
||||||
|
if (!jc_pad->conn_r)
|
||||||
|
jc_cal_ctx.cr_done = false;
|
||||||
|
|
||||||
|
// Calculate left analog stick.
|
||||||
|
if (jc_pad->lstick_x <= jc_cal_ctx.clx_max && jc_pad->lstick_x >= jc_cal_ctx.clx_min)
|
||||||
|
rpt->x = 0x7F;
|
||||||
|
else if (jc_pad->lstick_x > jc_cal_ctx.clx_max)
|
||||||
|
{
|
||||||
|
u16 x_raw = (jc_pad->lstick_x - jc_cal_ctx.clx_max) / 7;
|
||||||
|
if (x_raw > 0x7F)
|
||||||
|
x_raw = 0x7F;
|
||||||
|
rpt->x = 0x7F + x_raw;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u16 x_raw = (jc_cal_ctx.clx_min - jc_pad->lstick_x) / 7;
|
||||||
|
if (x_raw > 0x7F)
|
||||||
|
x_raw = 0x7F;
|
||||||
|
rpt->x = 0x7F - x_raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jc_pad->lstick_y <= jc_cal_ctx.cly_max && jc_pad->lstick_y >= jc_cal_ctx.cly_min)
|
||||||
|
rpt->y = 0x7F;
|
||||||
|
else if (jc_pad->lstick_y > jc_cal_ctx.cly_max)
|
||||||
|
{
|
||||||
|
u16 y_raw = (jc_pad->lstick_y - jc_cal_ctx.cly_max) / 7;
|
||||||
|
if (y_raw > 0x7F)
|
||||||
|
y_raw = 0x7F;
|
||||||
|
rpt->y = 0x7F - y_raw;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u16 y_raw = (jc_cal_ctx.cly_min - jc_pad->lstick_y) / 7;
|
||||||
|
if (y_raw > 0x7F)
|
||||||
|
y_raw = 0x7F;
|
||||||
|
rpt->y = 0x7F + y_raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate right analog stick.
|
||||||
|
if (jc_pad->rstick_x <= jc_cal_ctx.crx_max && jc_pad->rstick_x >= jc_cal_ctx.crx_min)
|
||||||
|
rpt->z = 0x7F;
|
||||||
|
else if (jc_pad->rstick_x > jc_cal_ctx.crx_max)
|
||||||
|
{
|
||||||
|
u16 x_raw = (jc_pad->rstick_x - jc_cal_ctx.crx_max) / 7;
|
||||||
|
if (x_raw > 0x7F)
|
||||||
|
x_raw = 0x7F;
|
||||||
|
rpt->z = 0x7F + x_raw;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u16 x_raw = (jc_cal_ctx.crx_min - jc_pad->rstick_x) / 7;
|
||||||
|
if (x_raw > 0x7F)
|
||||||
|
x_raw = 0x7F;
|
||||||
|
rpt->z = 0x7F - x_raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jc_pad->rstick_y <= jc_cal_ctx.cry_max && jc_pad->rstick_y >= jc_cal_ctx.cry_min)
|
||||||
|
rpt->rz = 0x7F;
|
||||||
|
else if (jc_pad->rstick_y > jc_cal_ctx.cry_max)
|
||||||
|
{
|
||||||
|
u16 y_raw = (jc_pad->rstick_y - jc_cal_ctx.cry_max) / 7;
|
||||||
|
if (y_raw > 0x7F)
|
||||||
|
y_raw = 0x7F;
|
||||||
|
rpt->rz = 0x7F - y_raw;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u16 y_raw = (jc_cal_ctx.cry_min - jc_pad->rstick_y) / 7;
|
||||||
|
if (y_raw > 0x7F)
|
||||||
|
y_raw = 0x7F;
|
||||||
|
rpt->rz = 0x7F + y_raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set D-pad.
|
||||||
|
switch ((jc_pad->buttons >> 16) & 0xF)
|
||||||
|
{
|
||||||
|
case 0: // none
|
||||||
|
rpt->hat = 0xF;
|
||||||
|
break;
|
||||||
|
case 1: // down
|
||||||
|
rpt->hat = 4;
|
||||||
|
break;
|
||||||
|
case 2: // up
|
||||||
|
rpt->hat = 0;
|
||||||
|
break;
|
||||||
|
case 4: // right
|
||||||
|
rpt->hat = 2;
|
||||||
|
break;
|
||||||
|
case 5: // down + right
|
||||||
|
rpt->hat = 3;
|
||||||
|
break;
|
||||||
|
case 6: // up + right
|
||||||
|
rpt->hat = 1;
|
||||||
|
break;
|
||||||
|
case 8: // left
|
||||||
|
rpt->hat = 6;
|
||||||
|
break;
|
||||||
|
case 9: // down + left
|
||||||
|
rpt->hat = 5;
|
||||||
|
break;
|
||||||
|
case 10: // up + left
|
||||||
|
rpt->hat = 7;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rpt->hat = 0xF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set buttons.
|
||||||
|
rpt->btn1 = jc_pad->b; // x.
|
||||||
|
rpt->btn2 = jc_pad->a; // a.
|
||||||
|
rpt->btn3 = jc_pad->y; // b.
|
||||||
|
rpt->btn4 = jc_pad->x; // y.
|
||||||
|
|
||||||
|
rpt->btn5 = jc_pad->l;
|
||||||
|
rpt->btn6 = jc_pad->r;
|
||||||
|
rpt->btn7 = jc_pad->zl;
|
||||||
|
rpt->btn8 = jc_pad->zr;
|
||||||
|
rpt->btn9 = jc_pad->minus;
|
||||||
|
rpt->btn10 = jc_pad->plus;
|
||||||
|
rpt->btn11 = jc_pad->l3;
|
||||||
|
rpt->btn12 = jc_pad->r3;
|
||||||
|
|
||||||
|
//rpt->btn13 = jc_pad->cap;
|
||||||
|
//rpt->btn14 = jc_pad->home;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct _touchpad_report_t
|
||||||
|
{
|
||||||
|
u8 rpt_id;
|
||||||
|
u8 tip_switch:1;
|
||||||
|
u8 count:7;
|
||||||
|
|
||||||
|
u8 id;
|
||||||
|
|
||||||
|
//u16 z;
|
||||||
|
u16 x;
|
||||||
|
u16 y;
|
||||||
|
} __attribute__((packed)) touchpad_report_t;
|
||||||
|
|
||||||
|
static bool _fts_touch_read(touchpad_report_t *rpt)
|
||||||
|
{
|
||||||
|
static touch_event touchpad;
|
||||||
|
|
||||||
|
touch_poll(&touchpad);
|
||||||
|
|
||||||
|
rpt->rpt_id = 5;
|
||||||
|
rpt->count = 1;
|
||||||
|
|
||||||
|
// Decide touch enable.
|
||||||
|
switch (touchpad.type & STMFTS_MASK_EVENT_ID)
|
||||||
|
{
|
||||||
|
//case STMFTS_EV_MULTI_TOUCH_ENTER:
|
||||||
|
case STMFTS_EV_MULTI_TOUCH_MOTION:
|
||||||
|
rpt->x = touchpad.x;
|
||||||
|
rpt->y = touchpad.y;
|
||||||
|
//rpt->z = touchpad.z;
|
||||||
|
rpt->id = touchpad.fingers ? touchpad.fingers - 1 : 0;
|
||||||
|
rpt->tip_switch = 1;
|
||||||
|
break;
|
||||||
|
case STMFTS_EV_MULTI_TOUCH_LEAVE:
|
||||||
|
rpt->x = touchpad.x;
|
||||||
|
rpt->y = touchpad.y;
|
||||||
|
//rpt->z = touchpad.z;
|
||||||
|
rpt->id = touchpad.fingers ? touchpad.fingers - 1 : 0;
|
||||||
|
rpt->tip_switch = 0;
|
||||||
|
break;
|
||||||
|
case STMFTS_EV_NO_EVENT:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 _hid_transfer_start(usb_ctxt_t *usbs, u32 len)
|
||||||
|
{
|
||||||
|
u8 status = usb_ops.usb_device_ep1_in_write((u8 *)USB_EP_BULK_IN_BUF_ADDR, len, NULL, USB_XFER_SYNCED_CMD);
|
||||||
|
if (status == USB_ERROR_XFER_ERROR)
|
||||||
|
{
|
||||||
|
usbs->set_text(usbs->label, "#FFDD00 Error:# EP IN transfer!");
|
||||||
|
if (usb_ops.usbd_flush_endpoint)
|
||||||
|
usb_ops.usbd_flush_endpoint(USB_EP_BULK_IN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linux mitigation: If timed out, clear status.
|
||||||
|
if (status == USB_ERROR_TIMEOUT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool _hid_poll_jc(usb_ctxt_t *usbs)
|
||||||
|
{
|
||||||
|
if (_jc_poll((gamepad_report_t *)USB_EP_BULK_IN_BUF_ADDR))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Send HID report.
|
||||||
|
if (_hid_transfer_start(usbs, sizeof(gamepad_report_t)))
|
||||||
|
return true; // EP Error.
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool _hid_poll_touch(usb_ctxt_t *usbs)
|
||||||
|
{
|
||||||
|
_fts_touch_read((touchpad_report_t *)USB_EP_BULK_IN_BUF_ADDR);
|
||||||
|
|
||||||
|
// Send HID report.
|
||||||
|
if (_hid_transfer_start(usbs, sizeof(touchpad_report_t)))
|
||||||
|
return true; // EP Error.
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int usb_device_gadget_hid(usb_ctxt_t *usbs)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
u32 gadget_type;
|
||||||
|
u32 polling_time;
|
||||||
|
|
||||||
|
// Get USB Controller ops.
|
||||||
|
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210)
|
||||||
|
usb_device_get_ops(&usb_ops);
|
||||||
|
else
|
||||||
|
xusb_device_get_ops(&usb_ops);
|
||||||
|
|
||||||
|
if (usbs->type == USB_HID_GAMEPAD)
|
||||||
|
{
|
||||||
|
polling_time = 8000;
|
||||||
|
gadget_type = USB_GADGET_HID_GAMEPAD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
polling_time = 4000;
|
||||||
|
gadget_type = USB_GADGET_HID_TOUCHPAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
usbs->set_text(usbs->label, "#C7EA46 Status:# Started USB");
|
||||||
|
|
||||||
|
if (usb_ops.usb_device_init())
|
||||||
|
{
|
||||||
|
usb_ops.usbd_end(false, true);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
usbs->set_text(usbs->label, "#C7EA46 Status:# Waiting for connection");
|
||||||
|
|
||||||
|
// Initialize Control Endpoint.
|
||||||
|
if (usb_ops.usb_device_enumerate(gadget_type))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
usbs->set_text(usbs->label, "#C7EA46 Status:# Waiting for HID report request");
|
||||||
|
|
||||||
|
if (usb_ops.usb_device_class_send_hid_report())
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
usbs->set_text(usbs->label, "#C7EA46 Status:# Started HID emulation");
|
||||||
|
|
||||||
|
u32 timer_sys = get_tmr_ms() + 5000;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
u32 timer = get_tmr_us();
|
||||||
|
|
||||||
|
// Parse input device.
|
||||||
|
if (usbs->type == USB_HID_GAMEPAD)
|
||||||
|
{
|
||||||
|
if (_hid_poll_jc(usbs))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_hid_poll_touch(usbs))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for suspended USB in case the cable was pulled.
|
||||||
|
if (usb_ops.usb_device_get_suspended())
|
||||||
|
break; // Disconnected.
|
||||||
|
|
||||||
|
// Handle control endpoint.
|
||||||
|
usb_ops.usbd_handle_ep0_ctrl_setup();
|
||||||
|
|
||||||
|
// Wait max gadget timing.
|
||||||
|
timer = get_tmr_us() - timer;
|
||||||
|
if (timer < polling_time)
|
||||||
|
usleep(polling_time - timer);
|
||||||
|
|
||||||
|
if (timer_sys < get_tmr_ms())
|
||||||
|
{
|
||||||
|
usbs->system_maintenance(true);
|
||||||
|
timer_sys = get_tmr_ms() + 5000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
usbs->set_text(usbs->label, "#C7EA46 Status:# HID ended");
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
error:
|
||||||
|
usbs->set_text(usbs->label, "#FFDD00 Error:# Timed out or canceled");
|
||||||
|
res = 1;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
usb_ops.usbd_end(true, false);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
1924
bdk/usb/usb_gadget_ums.c
Normal file
1924
bdk/usb/usb_gadget_ums.c
Normal file
File diff suppressed because it is too large
Load Diff
293
bdk/usb/usb_t210.h
Normal file
293
bdk/usb/usb_t210.h
Normal file
@@ -0,0 +1,293 @@
|
|||||||
|
/*
|
||||||
|
* Enhanced & eXtensible USB device (EDCI & XDCI) driver for Tegra X1
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019-2020 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _USB_T210_H_
|
||||||
|
#define _USB_T210_H_
|
||||||
|
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
|
/* EHCI USB */
|
||||||
|
|
||||||
|
/* General USB registers */
|
||||||
|
#define USB1_IF_USB_SUSP_CTRL 0x400
|
||||||
|
#define SUSP_CTRL_USB_WAKE_ON_CNNT_EN_DEV BIT(3)
|
||||||
|
#define SUSP_CTRL_USB_WAKE_ON_DISCON_EN_DEV BIT(4)
|
||||||
|
#define SUSP_CTRL_USB_PHY_CLK_VALID BIT(7)
|
||||||
|
#define SUSP_CTRL_UTMIP_RESET BIT(11)
|
||||||
|
#define SUSP_CTRL_UTMIP_PHY_ENB BIT(12)
|
||||||
|
#define SUSP_CTRL_UTMIP_UTMIP_SUSPL1_SET BIT(25)
|
||||||
|
#define USB1_IF_USB_PHY_VBUS_SENSORS 0x404
|
||||||
|
#define USB1_UTMIP_XCVR_CFG0 0x808
|
||||||
|
#define USB1_UTMIP_BIAS_CFG0 0x80C
|
||||||
|
#define USB1_UTMIP_HSRX_CFG0 0x810
|
||||||
|
#define USB1_UTMIP_HSRX_CFG1 0x814
|
||||||
|
#define USB1_UTMIP_TX_CFG0 0x820
|
||||||
|
#define USB1_UTMIP_MISC_CFG1 0x828
|
||||||
|
#define USB1_UTMIP_DEBOUNCE_CFG0 0x82C
|
||||||
|
#define USB1_UTMIP_BAT_CHRG_CFG0 0x830
|
||||||
|
#define BAT_CHRG_CFG0_PWRDOWN_CHRG BIT(0)
|
||||||
|
#define BAT_CHRG_CFG0_OP_SRC_EN BIT(3)
|
||||||
|
#define USB1_UTMIP_SPARE_CFG0 0x834
|
||||||
|
#define USB1_UTMIP_XCVR_CFG1 0x838
|
||||||
|
#define USB1_UTMIP_BIAS_CFG1 0x83C
|
||||||
|
#define USB1_UTMIP_BIAS_CFG2 0x850
|
||||||
|
#define USB1_UTMIP_XCVR_CFG2 0x854
|
||||||
|
#define USB1_UTMIP_XCVR_CFG3 0x858
|
||||||
|
|
||||||
|
/* USB Queue Head Descriptor */
|
||||||
|
#define USB2_QH_USB2D_QH_EP_BASE (USB_BASE + 0x1000)
|
||||||
|
#define USB_QHD_EP_CAP_IOS_ENABLE BIT(15)
|
||||||
|
#define USB_QHD_EP_CAP_MAX_PKT_LEN_MASK 0x7FF
|
||||||
|
#define USB_QHD_EP_CAP_ZERO_LEN_TERM_DIS BIT(29)
|
||||||
|
#define USB_QHD_EP_CAP_MULTI_NON_ISO (0 << 30)
|
||||||
|
#define USB_QHD_EP_CAP_MULTI_1 (1 << 30)
|
||||||
|
#define USB_QHD_EP_CAP_MULTI_2 (2 << 30)
|
||||||
|
#define USB_QHD_EP_CAP_MULTI_3 (3 << 30)
|
||||||
|
|
||||||
|
#define USB_QHD_TOKEN_XFER_ERROR BIT(3)
|
||||||
|
#define USB_QHD_TOKEN_BUFFER_ERROR BIT(5)
|
||||||
|
#define USB_QHD_TOKEN_HALTED BIT(6)
|
||||||
|
#define USB_QHD_TOKEN_ACTIVE BIT(7)
|
||||||
|
#define USB_QHD_TOKEN_MULT_OVERR_MASK (2 << 10)
|
||||||
|
#define USB_QHD_TOKEN_IRQ_ON_COMPLETE BIT(15)
|
||||||
|
#define USB_QHD_TOKEN_TOTAL_BYTES_SHIFT 16
|
||||||
|
|
||||||
|
/* USB_OTG/USB_1 controllers register bits */
|
||||||
|
#define USB2D_PORTSC1_SUSP BIT(7)
|
||||||
|
|
||||||
|
#define USB2D_USBCMD_RUN BIT(0)
|
||||||
|
#define USB2D_USBCMD_RESET BIT(1)
|
||||||
|
#define USB2D_USBCMD_ITC_MASK (0xFF << 16)
|
||||||
|
|
||||||
|
#define USB2D_USBSTS_UI BIT(0)
|
||||||
|
#define USB2D_USBSTS_UEI BIT(1)
|
||||||
|
#define USB2D_USBSTS_PCI BIT(2)
|
||||||
|
#define USB2D_USBSTS_FRI BIT(3)
|
||||||
|
#define USB2D_USBSTS_SEI BIT(4)
|
||||||
|
#define USB2D_USBSTS_AAI BIT(5)
|
||||||
|
#define USB2D_USBSTS_URI BIT(6)
|
||||||
|
#define USB2D_USBSTS_SRI BIT(7)
|
||||||
|
#define USB2D_USBSTS_SLI BIT(8)
|
||||||
|
|
||||||
|
#define USB2D_USBMODE_CM_MASK (3 << 0)
|
||||||
|
#define USB2D_USBMODE_CM_IDLE 0
|
||||||
|
#define USB2D_USBMODE_CM_RSVD 1
|
||||||
|
#define USB2D_USBMODE_CM_DEVICE 2
|
||||||
|
#define USB2D_USBMODE_CM_HOST 3
|
||||||
|
|
||||||
|
#define USB2D_ENDPT_STATUS_RX_OFFSET BIT(0)
|
||||||
|
#define USB2D_ENDPT_STATUS_TX_OFFSET BIT(16)
|
||||||
|
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_STALL BIT(0)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_TYPE_CTRL (0 << 2)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_TYPE_ISO (1 << 2)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_TYPE_BULK (2 << 2)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_TYPE_INTR (3 << 2)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_TYPE_MASK (3 << 2)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_INHIBIT BIT(5)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_RESET BIT(6)
|
||||||
|
#define USB2D_ENDPTCTRL_RX_EP_ENABLE BIT(7)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_STALL BIT(16)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_TYPE_CTRL (0 << 18)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_TYPE_ISO (1 << 18)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_TYPE_BULK (2 << 18)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_TYPE_INTR (3 << 18)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_TYPE_MASK (3 << 18)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_INHIBIT BIT(21)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_RESET BIT(22)
|
||||||
|
#define USB2D_ENDPTCTRL_TX_EP_ENABLE BIT(23)
|
||||||
|
|
||||||
|
#define USB2D_HOSTPC1_DEVLC_ASUS BIT(17)
|
||||||
|
#define USB2D_HOSTPC1_DEVLC_PHCD BIT(22)
|
||||||
|
#define USB2D_HOSTPC1_DEVLC_PSPD_MASK (3 << 25)
|
||||||
|
|
||||||
|
#define USB2D_OTGSC_USB_ID_PULLUP BIT(5)
|
||||||
|
#define USB2D_OTGSC_USB_IRQ_STS_MASK (0x7F << 16)
|
||||||
|
|
||||||
|
/* USB_OTG/USB_1 controllers registers */
|
||||||
|
typedef struct _t210_usb2d_t
|
||||||
|
{
|
||||||
|
vu32 id;
|
||||||
|
vu32 unk0;
|
||||||
|
vu32 hw_host;
|
||||||
|
vu32 hw_device;
|
||||||
|
vu32 hw_txbuf;
|
||||||
|
vu32 hw_rxbuf;
|
||||||
|
vu32 unk1[26];
|
||||||
|
vu32 gptimer0ld;
|
||||||
|
vu32 gptimer0ctrl;
|
||||||
|
vu32 gptimer1ld;
|
||||||
|
vu32 gptimer1ctrl;
|
||||||
|
vu32 unk2[28];
|
||||||
|
vu16 caplength;
|
||||||
|
vu16 hciversion;
|
||||||
|
vu32 hcsparams;
|
||||||
|
vu32 hccparams;
|
||||||
|
vu32 unk3[5];
|
||||||
|
vu32 dciversion;
|
||||||
|
vu32 dccparams;
|
||||||
|
vu32 extsts;
|
||||||
|
vu32 usbextintr;
|
||||||
|
vu32 usbcmd;
|
||||||
|
vu32 usbsts;
|
||||||
|
vu32 usbintr;
|
||||||
|
vu32 frindex;
|
||||||
|
vu32 unk4;
|
||||||
|
vu32 periodiclistbase;
|
||||||
|
vu32 asynclistaddr;
|
||||||
|
vu32 asyncttsts;
|
||||||
|
vu32 burstsize;
|
||||||
|
vu32 txfilltuning;
|
||||||
|
vu32 unk6;
|
||||||
|
vu32 icusb_ctrl;
|
||||||
|
vu32 ulpi_viewport;
|
||||||
|
vu32 rsvd0[4];
|
||||||
|
vu32 portsc1;
|
||||||
|
vu32 rsvd1[15];
|
||||||
|
vu32 hostpc1_devlc;
|
||||||
|
vu32 rsvd2[15];
|
||||||
|
vu32 otgsc;
|
||||||
|
vu32 usbmode;
|
||||||
|
vu32 unk10;
|
||||||
|
vu32 endptnak;
|
||||||
|
vu32 endptnak_enable;
|
||||||
|
vu32 endptsetupstat;
|
||||||
|
vu32 endptprime;
|
||||||
|
vu32 endptflush;
|
||||||
|
vu32 endptstatus;
|
||||||
|
vu32 endptcomplete;
|
||||||
|
vu32 endptctrl[16];
|
||||||
|
} t210_usb2d_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* XHCI USB */
|
||||||
|
|
||||||
|
/* XUSB DEV XHCI registers */
|
||||||
|
#define XUSB_DEV_XHCI_DB 0x4
|
||||||
|
#define XUSB_DEV_XHCI_ERSTSZ 0x8
|
||||||
|
#define XUSB_DEV_XHCI_ERST0BALO 0x10
|
||||||
|
#define XUSB_DEV_XHCI_ERST0BAHI 0x14
|
||||||
|
#define XUSB_DEV_XHCI_ERST1BALO 0x18
|
||||||
|
#define XUSB_DEV_XHCI_ERST1BAHI 0x1C
|
||||||
|
#define XUSB_DEV_XHCI_ERDPLO 0x20
|
||||||
|
#define XHCI_ERDPLO_EHB BIT(3)
|
||||||
|
#define XUSB_DEV_XHCI_ERDPHI 0x24
|
||||||
|
#define XUSB_DEV_XHCI_EREPLO 0x28
|
||||||
|
#define XCHI_ECS BIT(0)
|
||||||
|
#define XUSB_DEV_XHCI_EREPHI 0x2C
|
||||||
|
#define XUSB_DEV_XHCI_CTRL 0x30
|
||||||
|
#define XHCI_CTRL_RUN BIT(0)
|
||||||
|
#define XHCI_CTRL_LSE BIT(1)
|
||||||
|
#define XHCI_CTRL_IE BIT(4)
|
||||||
|
#define XHCI_CTRL_ENABLE BIT(31)
|
||||||
|
#define XUSB_DEV_XHCI_ST 0x34
|
||||||
|
#define XHCI_ST_RC BIT(0)
|
||||||
|
#define XHCI_ST_IP BIT(4)
|
||||||
|
#define XUSB_DEV_XHCI_RT_IMOD 0x38
|
||||||
|
#define XUSB_DEV_XHCI_PORTSC 0x3C
|
||||||
|
#define XHCI_PORTSC_PR BIT(4)
|
||||||
|
#define XHCI_PORTSC_PLS_MASK (0xF << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_U0 (0 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_U1 (1 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_U2 (2 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_U3 (3 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_DISABLED (4 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_RXDETECT (5 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_INACTIVE (6 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_POLLING (7 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_RECOVERY (8 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_HOTRESET (9 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_COMPLIANCE (10 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_LOOPBACK (11 << 5)
|
||||||
|
#define XHCI_PORTSC_PLS_RESUME (15 << 5)
|
||||||
|
#define XHCI_PORTSC_PS (0xF << 10)
|
||||||
|
#define XHCI_PORTSC_LWS BIT(16)
|
||||||
|
#define XHCI_PORTSC_CSC BIT(17)
|
||||||
|
#define XHCI_PORTSC_WRC BIT(19)
|
||||||
|
#define XHCI_PORTSC_PRC BIT(21)
|
||||||
|
#define XHCI_PORTSC_PLC BIT(22)
|
||||||
|
#define XHCI_PORTSC_CEC BIT(23)
|
||||||
|
#define XHCI_PORTSC_WPR BIT(30)
|
||||||
|
#define XUSB_DEV_XHCI_ECPLO 0x40
|
||||||
|
#define XUSB_DEV_XHCI_ECPHI 0x44
|
||||||
|
#define XUSB_DEV_XHCI_EP_HALT 0x50
|
||||||
|
#define XHCI_EP_HALT_DCI BIT(0)
|
||||||
|
#define XUSB_DEV_XHCI_EP_PAUSE 0x54
|
||||||
|
#define XUSB_DEV_XHCI_EP_RELOAD 0x58
|
||||||
|
#define XUSB_DEV_XHCI_EP_STCHG 0x5C
|
||||||
|
#define XUSB_DEV_XHCI_PORTHALT 0x6C
|
||||||
|
#define XHCI_PORTHALT_HALT_LTSSM BIT(0)
|
||||||
|
#define XHCI_PORTHALT_STCHG_REQ BIT(20)
|
||||||
|
#define XUSB_DEV_XHCI_CFG_DEV_FE 0x85C
|
||||||
|
#define XHCI_CFG_DEV_FE_PORTREGSEL_MASK (3 << 0)
|
||||||
|
#define XHCI_CFG_DEV_FE_PORTREGSEL_SS (1 << 0)
|
||||||
|
#define XHCI_CFG_DEV_FE_PORTREGSEL_HSFS (2 << 0)
|
||||||
|
|
||||||
|
/* XUSB DEV PCI registers */
|
||||||
|
#define XUSB_CFG_1 0x4
|
||||||
|
#define CFG_1_IO_SPACE BIT(0)
|
||||||
|
#define CFG_1_MEMORY_SPACE BIT(1)
|
||||||
|
#define CFG_1_BUS_MASTER BIT(2)
|
||||||
|
#define XUSB_CFG_4 0x10
|
||||||
|
#define CFG_4_ADDRESS_TYPE_32_BIT (0 << 1)
|
||||||
|
#define CFG_4_ADDRESS_TYPE_64_BIT (2 << 1)
|
||||||
|
|
||||||
|
/* XUSB DEV Device registers */
|
||||||
|
#define XUSB_DEV_CONFIGURATION 0x180
|
||||||
|
#define DEV_CONFIGURATION_EN_FPCI BIT(0)
|
||||||
|
#define XUSB_DEV_INTR_MASK 0x188
|
||||||
|
#define DEV_INTR_MASK_IP_INT_MASK BIT(16)
|
||||||
|
|
||||||
|
/* XUSB Pad Control registers */
|
||||||
|
#define XUSB_PADCTL_USB2_PAD_MUX 0x4
|
||||||
|
#define PADCTL_USB2_PAD_MUX_USB2_OTG_PAD_PORT0_USB2 (0 << 0)
|
||||||
|
#define PADCTL_USB2_PAD_MUX_USB2_OTG_PAD_PORT0_XUSB (1 << 0)
|
||||||
|
#define PADCTL_USB2_PAD_MUX_USB2_OTG_PAD_PORT0_MASK (3 << 0)
|
||||||
|
#define PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_USB2 (0 << 18)
|
||||||
|
#define PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB (1 << 18)
|
||||||
|
#define PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_MASK (3 << 18)
|
||||||
|
#define XUSB_PADCTL_USB2_PORT_CAP 0x8
|
||||||
|
#define PADCTL_USB2_PORT_CAP_PORT_0_CAP_DIS (0 << 0)
|
||||||
|
#define PADCTL_USB2_PORT_CAP_PORT_0_CAP_HOST (1 << 0)
|
||||||
|
#define PADCTL_USB2_PORT_CAP_PORT_0_CAP_DEV (2 << 0)
|
||||||
|
#define PADCTL_USB2_PORT_CAP_PORT_0_CAP_OTG (3 << 0)
|
||||||
|
#define PADCTL_USB2_PORT_CAP_PORT_0_CAP_MASK (3 << 0)
|
||||||
|
#define XUSB_PADCTL_SS_PORT_MAP 0x14
|
||||||
|
#define PADCTL_SS_PORT_MAP_PORT0_MASK (0xF << 0)
|
||||||
|
#define XUSB_PADCTL_ELPG_PROGRAM_0 0x20
|
||||||
|
#define XUSB_PADCTL_ELPG_PROGRAM_1 0x24
|
||||||
|
#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD0_CTL0 0x80
|
||||||
|
#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD0_CTL1 0x84
|
||||||
|
#define XUSB_PADCTL_USB2_OTG_PAD0_CTL_0 0x88
|
||||||
|
#define XUSB_PADCTL_USB2_OTG_PAD0_CTL_1 0x8C
|
||||||
|
#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_0 0x284
|
||||||
|
#define XUSB_PADCTL_USB2_BIAS_PAD_CTL_1 0x288
|
||||||
|
#define XUSB_PADCTL_USB2_VBUS_ID 0xC60
|
||||||
|
#define PADCTL_USB2_VBUS_ID_VBUS_OVR_EN (1 << 12)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_VBUS_OVR_MASK (3 << 12)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_VBUS_ON BIT(14)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_SRC_ID_OVR_EN (1 << 16)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_SRC_MASK (3 << 16)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_OVR_GND (0 << 18)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_OVR_C (1 << 18)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_OVR_B (2 << 18)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_OVR_A (4 << 18)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_OVR_FLOAT (8 << 18)
|
||||||
|
#define PADCTL_USB2_VBUS_ID_OVR_MASK (0xF << 18)
|
||||||
|
|
||||||
|
#endif
|
||||||
1595
bdk/usb/usbd.c
Normal file
1595
bdk/usb/usbd.c
Normal file
File diff suppressed because it is too large
Load Diff
203
bdk/usb/usbd.h
Normal file
203
bdk/usb/usbd.h
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
/*
|
||||||
|
* Enhanced & eXtensible USB Device (EDCI & XDCI) driver for Tegra X1
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 CTCaer
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope 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.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _USB_H_
|
||||||
|
#define _USB_H_
|
||||||
|
|
||||||
|
#include <utils/types.h>
|
||||||
|
|
||||||
|
#define USB_TD_BUFFER_PAGE_SIZE 0x1000
|
||||||
|
#define USB_TD_BUFFER_MAX_SIZE (USB_TD_BUFFER_PAGE_SIZE * 4)
|
||||||
|
//#define USB_HW_BUFFER_5_PAGES 0x5000
|
||||||
|
#define USB_EP_BUFFER_1_TD (USB_TD_BUFFER_MAX_SIZE)
|
||||||
|
#define USB_EP_BUFFER_2_TD (USB_TD_BUFFER_MAX_SIZE * 2)
|
||||||
|
#define USB_EP_BUFFER_4_TD (USB_TD_BUFFER_MAX_SIZE * 4)
|
||||||
|
#define USB_EP_BUFFER_MAX_SIZE (USB_EP_BUFFER_4_TD)
|
||||||
|
#define USB_EP_BUFFER_ALIGN (USB_TD_BUFFER_PAGE_SIZE)
|
||||||
|
|
||||||
|
#define USB_XFER_START 0
|
||||||
|
#define USB_XFER_SYNCED_ENUM 1000000
|
||||||
|
#define USB_XFER_SYNCED_CMD 1000000
|
||||||
|
#define USB_XFER_SYNCED_DATA 2000000
|
||||||
|
#define USB_XFER_SYNCED_CLASS 5000000
|
||||||
|
#define USB_XFER_SYNCED -1
|
||||||
|
|
||||||
|
typedef enum _usb_hid_type
|
||||||
|
{
|
||||||
|
USB_HID_GAMEPAD,
|
||||||
|
USB_HID_TOUCHPAD
|
||||||
|
} usb_hid_type;
|
||||||
|
|
||||||
|
typedef enum _usb_gadget_type
|
||||||
|
{
|
||||||
|
USB_GADGET_UMS = 0,
|
||||||
|
USB_GADGET_HID_GAMEPAD = 1,
|
||||||
|
USB_GADGET_HID_TOUCHPAD = 2,
|
||||||
|
} usb_gadget_type;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_DIR_OUT = 0,
|
||||||
|
USB_DIR_IN = 1,
|
||||||
|
} usb_dir_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
XUSB_EP_CTRL_IN = 0, // EP0.
|
||||||
|
XUSB_EP_CTRL_OUT = 1, // EP0.
|
||||||
|
|
||||||
|
USB_EP_CTRL_OUT = 0, // EP0.
|
||||||
|
USB_EP_CTRL_IN = 1, // EP0.
|
||||||
|
|
||||||
|
USB_EP_BULK_OUT = 2, // EP1.
|
||||||
|
USB_EP_BULK_IN = 3, // EP1.
|
||||||
|
USB_EP_ALL = 0xFFFFFFFF
|
||||||
|
} usb_ep_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
USB_EP_ADDR_CTRL_OUT = 0x00,
|
||||||
|
USB_EP_ADDR_CTRL_IN = 0x80,
|
||||||
|
USB_EP_ADDR_BULK_OUT = 0x01,
|
||||||
|
USB_EP_ADDR_BULK_IN = 0x81,
|
||||||
|
} usb_ep_addr_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
USB_EP_CFG_CLEAR = 0,
|
||||||
|
USB_EP_CFG_RESET = 0,
|
||||||
|
USB_EP_CFG_STALL = 1
|
||||||
|
} usb_ep_cfg_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_STATUS_EP_OK = 0,
|
||||||
|
USB_STATUS_EP_HALTED = 1,
|
||||||
|
|
||||||
|
USB_STATUS_DEV_SELF_POWERED = 1,
|
||||||
|
USB_STATUS_DEV_REMOTE_WAKE = 2,
|
||||||
|
} usb_set_clear_feature_req_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_SETUP_RECIPIENT_DEVICE = 0,
|
||||||
|
USB_SETUP_RECIPIENT_INTERFACE = 1,
|
||||||
|
USB_SETUP_RECIPIENT_ENDPOINT = 2,
|
||||||
|
USB_SETUP_RECIPIENT_OTHER = 3,
|
||||||
|
|
||||||
|
USB_SETUP_TYPE_STANDARD = 0x00,
|
||||||
|
USB_SETUP_TYPE_CLASS = 0x20,
|
||||||
|
USB_SETUP_TYPE_VENDOR = 0x40,
|
||||||
|
USB_SETUP_TYPE_RESERVED = 0x60,
|
||||||
|
|
||||||
|
USB_SETUP_HOST_TO_DEVICE = 0x00,
|
||||||
|
USB_SETUP_DEVICE_TO_HOST = 0x80,
|
||||||
|
} usb_setup_req_type_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_REQUEST_GET_STATUS = 0,
|
||||||
|
USB_REQUEST_CLEAR_FEATURE = 1,
|
||||||
|
USB_REQUEST_SET_FEATURE = 3,
|
||||||
|
USB_REQUEST_SET_ADDRESS = 5,
|
||||||
|
USB_REQUEST_GET_DESCRIPTOR = 6,
|
||||||
|
USB_REQUEST_SET_DESCRIPTOR = 7,
|
||||||
|
USB_REQUEST_GET_CONFIGURATION = 8,
|
||||||
|
USB_REQUEST_SET_CONFIGURATION = 9,
|
||||||
|
USB_REQUEST_GET_INTERFACE = 10,
|
||||||
|
USB_REQUEST_SET_INTERFACE = 11,
|
||||||
|
USB_REQUEST_SYNCH_FRAME = 12,
|
||||||
|
USB_REQUEST_SET_SEL = 13,
|
||||||
|
|
||||||
|
USB_REQUEST_GET_MS_DESCRIPTOR = 0x99,
|
||||||
|
|
||||||
|
USB_REQUEST_BULK_GET_MAX_LUN = 0xFE,
|
||||||
|
USB_REQUEST_BULK_RESET = 0xFF
|
||||||
|
} usb_standard_req_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
USB_FEATURE_ENDPOINT_HALT = 0,
|
||||||
|
USB_FEATURE_DEVICE_REMOTE_WAKEUP = 1,
|
||||||
|
USB_FEATURE_TEST_MODE = 2,
|
||||||
|
} usb_get_status_req_t;
|
||||||
|
|
||||||
|
typedef enum _usb_error_t
|
||||||
|
{
|
||||||
|
USB_RES_OK = 0,
|
||||||
|
USB_RES_BULK_RESET = 1,
|
||||||
|
|
||||||
|
USB_ERROR_USER_ABORT = 2,
|
||||||
|
USB_ERROR_TIMEOUT = 3,
|
||||||
|
USB_ERROR_INIT = 4,
|
||||||
|
USB_ERROR_XFER_ERROR = 5,
|
||||||
|
|
||||||
|
USB2_ERROR_XFER_EP_DISABLED = 28,
|
||||||
|
USB2_ERROR_XFER_NOT_ALIGNED = 29,
|
||||||
|
|
||||||
|
XUSB_ERROR_INVALID_EP = USB_ERROR_XFER_ERROR, // From 2.
|
||||||
|
XUSB_ERROR_XFER_BULK_IN_RESIDUE = 7,
|
||||||
|
XUSB_ERROR_INVALID_CYCLE = USB2_ERROR_XFER_EP_DISABLED, // From 8.
|
||||||
|
XUSB_ERROR_SEQ_NUM = 51,
|
||||||
|
XUSB_ERROR_XFER_DIR = 52,
|
||||||
|
XUSB_ERROR_PORT_CFG = 54
|
||||||
|
} usb_error_t;
|
||||||
|
|
||||||
|
typedef struct _usb_ctrl_setup_t
|
||||||
|
{
|
||||||
|
u8 bmRequestType;
|
||||||
|
u8 bRequest;
|
||||||
|
u16 wValue;
|
||||||
|
u16 wIndex;
|
||||||
|
u16 wLength;
|
||||||
|
} usb_ctrl_setup_t;
|
||||||
|
|
||||||
|
typedef struct _usb_ops_t
|
||||||
|
{
|
||||||
|
int (*usbd_flush_endpoint)(u32);
|
||||||
|
int (*usbd_set_ep_stall)(u32, int);
|
||||||
|
int (*usbd_handle_ep0_ctrl_setup)();
|
||||||
|
void (*usbd_end)(bool, bool);
|
||||||
|
int (*usb_device_init)();
|
||||||
|
int (*usb_device_enumerate)(usb_gadget_type gadget);
|
||||||
|
int (*usb_device_class_send_max_lun)(u8);
|
||||||
|
int (*usb_device_class_send_hid_report)();
|
||||||
|
|
||||||
|
int (*usb_device_ep1_out_read)(u8 *, u32, u32 *, u32);
|
||||||
|
int (*usb_device_ep1_out_read_big)(u8 *, u32, u32 *);
|
||||||
|
int (*usb_device_ep1_out_reading_finish)(u32 *);
|
||||||
|
int (*usb_device_ep1_in_write)(u8 *, u32, u32 *, u32);
|
||||||
|
int (*usb_device_ep1_in_writing_finish)(u32 *);
|
||||||
|
bool (*usb_device_get_suspended)();
|
||||||
|
bool (*usb_device_get_port_in_sleep)();
|
||||||
|
} usb_ops_t;
|
||||||
|
|
||||||
|
typedef struct _usb_ctxt_t
|
||||||
|
{
|
||||||
|
u32 type;
|
||||||
|
u32 partition;
|
||||||
|
u32 offset;
|
||||||
|
u32 sectors;
|
||||||
|
u32 ro;
|
||||||
|
void (*system_maintenance)(bool);
|
||||||
|
void *label;
|
||||||
|
void (*set_text)(void *, const char *);
|
||||||
|
} usb_ctxt_t;
|
||||||
|
|
||||||
|
void usb_device_get_ops(usb_ops_t *ops);
|
||||||
|
void xusb_device_get_ops(usb_ops_t *ops);
|
||||||
|
|
||||||
|
int usb_device_gadget_ums(usb_ctxt_t *usbs);
|
||||||
|
int usb_device_gadget_hid(usb_ctxt_t *usbs);
|
||||||
|
|
||||||
|
#endif
|
||||||
2026
bdk/usb/xusbd.c
Normal file
2026
bdk/usb/xusbd.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -29,7 +29,7 @@ u8 btn_read()
|
|||||||
res |= BTN_VOL_DOWN;
|
res |= BTN_VOL_DOWN;
|
||||||
if (!gpio_read(GPIO_PORT_X, GPIO_PIN_6))
|
if (!gpio_read(GPIO_PORT_X, GPIO_PIN_6))
|
||||||
res |= BTN_VOL_UP;
|
res |= BTN_VOL_UP;
|
||||||
if (i2c_recv_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_ONOFFSTAT) & MAX77620_ONOFFSTAT_EN0)
|
if (i2c_recv_byte(4, MAX77620_I2C_ADDR, MAX77620_REG_ONOFFSTAT) & 0x4)
|
||||||
res |= BTN_POWER;
|
res |= BTN_POWER;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -44,11 +44,6 @@ u8 btn_read_vol()
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 btn_read_home()
|
|
||||||
{
|
|
||||||
return (!gpio_read(GPIO_PORT_Y, GPIO_PIN_1)) ? BTN_HOME : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 btn_wait()
|
u8 btn_wait()
|
||||||
{
|
{
|
||||||
u8 res = 0, btn = btn_read();
|
u8 res = 0, btn = btn_read();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -23,12 +23,10 @@
|
|||||||
#define BTN_POWER BIT(0)
|
#define BTN_POWER BIT(0)
|
||||||
#define BTN_VOL_DOWN BIT(1)
|
#define BTN_VOL_DOWN BIT(1)
|
||||||
#define BTN_VOL_UP BIT(2)
|
#define BTN_VOL_UP BIT(2)
|
||||||
#define BTN_HOME BIT(3)
|
|
||||||
#define BTN_SINGLE BIT(7)
|
#define BTN_SINGLE BIT(7)
|
||||||
|
|
||||||
u8 btn_read();
|
u8 btn_read();
|
||||||
u8 btn_read_vol();
|
u8 btn_read_vol();
|
||||||
u8 btn_read_home();
|
|
||||||
u8 btn_wait();
|
u8 btn_wait();
|
||||||
u8 btn_wait_timeout(u32 time_ms, u8 mask);
|
u8 btn_wait_timeout(u32 time_ms, u8 mask);
|
||||||
u8 btn_wait_timeout_single(u32 time_ms, u8 mask);
|
u8 btn_wait_timeout_single(u32 time_ms, u8 mask);
|
||||||
|
|||||||
@@ -21,16 +21,16 @@
|
|||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
#define MAX_ENTRIES 64
|
|
||||||
|
|
||||||
char *dirlist(const char *directory, const char *pattern, bool includeHiddenFiles, bool parse_dirs)
|
char *dirlist(const char *directory, const char *pattern, bool includeHiddenFiles, bool parse_dirs)
|
||||||
{
|
{
|
||||||
|
u8 max_entries = 61;
|
||||||
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
u32 i = 0, j = 0, k = 0;
|
u32 i = 0, j = 0, k = 0;
|
||||||
DIR dir;
|
DIR dir;
|
||||||
FILINFO fno;
|
FILINFO fno;
|
||||||
|
|
||||||
char *dir_entries = (char *)calloc(MAX_ENTRIES, 256);
|
char *dir_entries = (char *)calloc(max_entries, 256);
|
||||||
char *temp = (char *)calloc(1, 256);
|
char *temp = (char *)calloc(1, 256);
|
||||||
|
|
||||||
if (!pattern && !f_opendir(&dir, directory))
|
if (!pattern && !f_opendir(&dir, directory))
|
||||||
@@ -49,7 +49,7 @@ char *dirlist(const char *directory, const char *pattern, bool includeHiddenFile
|
|||||||
{
|
{
|
||||||
strcpy(dir_entries + (k * 256), fno.fname);
|
strcpy(dir_entries + (k * 256), fno.fname);
|
||||||
k++;
|
k++;
|
||||||
if (k > (MAX_ENTRIES - 1))
|
if (k > (max_entries - 1))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ char *dirlist(const char *directory, const char *pattern, bool includeHiddenFile
|
|||||||
{
|
{
|
||||||
strcpy(dir_entries + (k * 256), fno.fname);
|
strcpy(dir_entries + (k * 256), fno.fname);
|
||||||
k++;
|
k++;
|
||||||
if (k > (MAX_ENTRIES - 1))
|
if (k > (max_entries - 1))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
res = f_findnext(&dir, &fno);
|
res = f_findnext(&dir, &fno);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2022 CTCaer
|
* Copyright (c) 2018-2020 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -21,7 +21,25 @@
|
|||||||
#include <libs/fatfs/ff.h>
|
#include <libs/fatfs/ff.h>
|
||||||
#include <mem/heap.h>
|
#include <mem/heap.h>
|
||||||
#include <utils/dirlist.h>
|
#include <utils/dirlist.h>
|
||||||
#include <utils/util.h>
|
|
||||||
|
static char *_strdup(char *str)
|
||||||
|
{
|
||||||
|
if (!str)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// Remove starting space.
|
||||||
|
if (str[0] == ' ' && strlen(str))
|
||||||
|
str++;
|
||||||
|
|
||||||
|
char *res = (char *)malloc(strlen(str) + 1);
|
||||||
|
strcpy(res, str);
|
||||||
|
|
||||||
|
// Remove trailing space.
|
||||||
|
if (strlen(res) && res[strlen(res) - 1] == ' ')
|
||||||
|
res[strlen(res) - 1] = 0;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
u32 _find_section_name(char *lbuf, u32 lblen, char schar)
|
u32 _find_section_name(char *lbuf, u32 lblen, char schar)
|
||||||
{
|
{
|
||||||
@@ -39,12 +57,8 @@ ini_sec_t *_ini_create_section(link_t *dst, ini_sec_t *csec, char *name, u8 type
|
|||||||
if (csec)
|
if (csec)
|
||||||
list_append(dst, &csec->link);
|
list_append(dst, &csec->link);
|
||||||
|
|
||||||
// Calculate total allocation size.
|
csec = (ini_sec_t *)calloc(sizeof(ini_sec_t), 1);
|
||||||
u32 len = name ? strlen(name) + 1 : 0;
|
csec->name = _strdup(name);
|
||||||
char *buf = calloc(sizeof(ini_sec_t) + len, 1);
|
|
||||||
|
|
||||||
csec = (ini_sec_t *)buf;
|
|
||||||
csec->name = strcpy_ns(buf + sizeof(ini_sec_t), name);
|
|
||||||
csec->type = type;
|
csec->type = type;
|
||||||
|
|
||||||
return csec;
|
return csec;
|
||||||
@@ -52,14 +66,14 @@ ini_sec_t *_ini_create_section(link_t *dst, ini_sec_t *csec, char *name, u8 type
|
|||||||
|
|
||||||
int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
||||||
{
|
{
|
||||||
FIL fp;
|
|
||||||
u32 lblen;
|
u32 lblen;
|
||||||
u32 pathlen = strlen(ini_path);
|
u32 pathlen = strlen(ini_path);
|
||||||
u32 k = 0;
|
u32 k = 0;
|
||||||
|
char lbuf[512];
|
||||||
|
char *filelist = NULL;
|
||||||
|
FIL fp;
|
||||||
ini_sec_t *csec = NULL;
|
ini_sec_t *csec = NULL;
|
||||||
|
|
||||||
char *lbuf = NULL;
|
|
||||||
char *filelist = NULL;
|
|
||||||
char *filename = (char *)malloc(256);
|
char *filename = (char *)malloc(256);
|
||||||
|
|
||||||
strcpy(filename, ini_path);
|
strcpy(filename, ini_path);
|
||||||
@@ -100,7 +114,6 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lbuf = malloc(512);
|
|
||||||
csec = _ini_create_section(dst, csec, "Unknown", INI_CHOICE);
|
csec = _ini_create_section(dst, csec, "Unknown", INI_CHOICE);
|
||||||
list_init(&csec->kvs);
|
list_init(&csec->kvs);
|
||||||
|
|
||||||
@@ -141,16 +154,9 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
|||||||
{
|
{
|
||||||
u32 i = _find_section_name(lbuf, lblen, '=');
|
u32 i = _find_section_name(lbuf, lblen, '=');
|
||||||
|
|
||||||
// Calculate total allocation size.
|
ini_kv_t *kv = (ini_kv_t *)calloc(sizeof(ini_kv_t), 1);
|
||||||
u32 klen = strlen(&lbuf[0]) + 1;
|
kv->key = _strdup(&lbuf[0]);
|
||||||
u32 vlen = strlen(&lbuf[i + 1]) + 1;
|
kv->val = _strdup(&lbuf[i + 1]);
|
||||||
char *buf = calloc(sizeof(ini_kv_t) + klen + vlen, 1);
|
|
||||||
|
|
||||||
ini_kv_t *kv = (ini_kv_t *)buf;
|
|
||||||
buf += sizeof(ini_kv_t);
|
|
||||||
kv->key = strcpy_ns(buf, &lbuf[0]);
|
|
||||||
buf += klen;
|
|
||||||
kv->val = strcpy_ns(buf, &lbuf[i + 1]);
|
|
||||||
list_append(&csec->kvs, &kv->link);
|
list_append(&csec->kvs, &kv->link);
|
||||||
}
|
}
|
||||||
} while (!f_eof(&fp));
|
} while (!f_eof(&fp));
|
||||||
@@ -165,7 +171,6 @@ int ini_parse(link_t *dst, char *ini_path, bool is_dir)
|
|||||||
}
|
}
|
||||||
} while (is_dir);
|
} while (is_dir);
|
||||||
|
|
||||||
free(lbuf);
|
|
||||||
free(filename);
|
free(filename);
|
||||||
free(filelist);
|
free(filelist);
|
||||||
|
|
||||||
|
|||||||
@@ -1,201 +1,123 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2019-2020 shchmue
|
||||||
* Copyright (c) 2019-2022 CTCaer
|
*
|
||||||
*
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* under the terms and conditions of the GNU General Public License,
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* version 2, as published by the Free Software Foundation.
|
||||||
* version 2, as published by the Free Software Foundation.
|
*
|
||||||
*
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* more details.
|
||||||
* more details.
|
*
|
||||||
*
|
* You should have received a copy of the GNU General Public License
|
||||||
* You should have received a copy of the GNU General Public License
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*/
|
||||||
*/
|
|
||||||
|
#include "sprintf.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <utils/types.h>
|
static void _putc(char *buffer, const char c) {
|
||||||
|
*buffer = c;
|
||||||
char **sout_buf;
|
|
||||||
|
|
||||||
static void _s_putc(char c)
|
|
||||||
{
|
|
||||||
**sout_buf = c;
|
|
||||||
*sout_buf += 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _s_puts(char *s)
|
static u32 _puts(char *buffer, const char *s) {
|
||||||
{
|
u32 count = 0;
|
||||||
for (; *s; s++)
|
for (; *s; s++, count++)
|
||||||
_s_putc(*s);
|
_putc(buffer + count, *s);
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _s_putn(u32 v, int base, char fill, int fcnt)
|
static u32 _putn(char *buffer, u32 v, int base, char fill, int fcnt) {
|
||||||
{
|
char buf[0x121];
|
||||||
char buf[65];
|
static const char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
||||||
static const char digits[] = "0123456789ABCDEFghijklmnopqrstuvwxyz";
|
char *p;
|
||||||
char *p;
|
int c = fcnt;
|
||||||
int c = fcnt;
|
|
||||||
|
|
||||||
if (base > 36)
|
if (base > 36)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
p = buf + 64;
|
p = buf + 0x120;
|
||||||
*p = 0;
|
*p = 0;
|
||||||
do
|
do {
|
||||||
{
|
c--;
|
||||||
c--;
|
*--p = digits[v % base];
|
||||||
*--p = digits[v % base];
|
v /= base;
|
||||||
v /= base;
|
} while (v);
|
||||||
} while (v);
|
|
||||||
|
|
||||||
if (fill != 0)
|
if (fill != 0) {
|
||||||
{
|
while (c > 0) {
|
||||||
while (c > 0)
|
*--p = fill;
|
||||||
{
|
c--;
|
||||||
*--p = fill;
|
}
|
||||||
c--;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_s_puts(p);
|
return _puts(buffer, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void s_printf(char *out_buf, const char *fmt, ...)
|
u32 sprintf(char *buffer, const char *fmt, ...) {
|
||||||
{
|
va_list ap;
|
||||||
va_list ap;
|
int fill, fcnt;
|
||||||
int fill, fcnt;
|
u32 count = 0;
|
||||||
|
|
||||||
sout_buf = &out_buf;
|
va_start(ap, fmt);
|
||||||
|
while(*fmt) {
|
||||||
|
if (*fmt == '%') {
|
||||||
|
fmt++;
|
||||||
|
fill = 0;
|
||||||
|
fcnt = 0;
|
||||||
|
if ((*fmt >= '0' && *fmt <= '9') || *fmt == ' ') {
|
||||||
|
fcnt = *fmt;
|
||||||
|
fmt++;
|
||||||
|
if (*fmt >= '0' && *fmt <= '9') {
|
||||||
|
fill = fcnt;
|
||||||
|
fcnt = *fmt - '0';
|
||||||
|
fmt++;
|
||||||
|
} else {
|
||||||
|
fill = ' ';
|
||||||
|
fcnt -= '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (*fmt) {
|
||||||
|
case 'c':
|
||||||
|
_putc(buffer + count, va_arg(ap, u32));
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
count += _puts(buffer + count, va_arg(ap, char *));
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
count += _putn(buffer + count, va_arg(ap, u32), 10, fill, fcnt);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
case 'P':
|
||||||
|
case 'x':
|
||||||
|
case 'X':
|
||||||
|
count += _putn(buffer + count, va_arg(ap, u32), 16, fill, fcnt);
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
_putc(buffer + count, '%');
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
case '\0':
|
||||||
|
goto out;
|
||||||
|
default:
|
||||||
|
_putc(buffer + count, '%');
|
||||||
|
count++;
|
||||||
|
_putc(buffer + count, *fmt);
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_putc(buffer + count, *fmt);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
fmt++;
|
||||||
|
}
|
||||||
|
|
||||||
va_start(ap, fmt);
|
out:
|
||||||
while(*fmt)
|
buffer[count] = 0;
|
||||||
{
|
va_end(ap);
|
||||||
if(*fmt == '%')
|
return count;
|
||||||
{
|
}
|
||||||
fmt++;
|
|
||||||
fill = 0;
|
|
||||||
fcnt = 0;
|
|
||||||
if ((*fmt >= '0' && *fmt <= '9') || *fmt == ' ')
|
|
||||||
{
|
|
||||||
fcnt = *fmt;
|
|
||||||
fmt++;
|
|
||||||
if (*fmt >= '0' && *fmt <= '9')
|
|
||||||
{
|
|
||||||
fill = fcnt;
|
|
||||||
fcnt = *fmt - '0';
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fill = ' ';
|
|
||||||
fcnt -= '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch(*fmt)
|
|
||||||
{
|
|
||||||
case 'c':
|
|
||||||
_s_putc(va_arg(ap, u32));
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
_s_puts(va_arg(ap, char *));
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
_s_putn(va_arg(ap, u32), 10, fill, fcnt);
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
case 'P':
|
|
||||||
case 'x':
|
|
||||||
case 'X':
|
|
||||||
_s_putn(va_arg(ap, u32), 16, fill, fcnt);
|
|
||||||
break;
|
|
||||||
case '%':
|
|
||||||
_s_putc('%');
|
|
||||||
break;
|
|
||||||
case '\0':
|
|
||||||
goto out;
|
|
||||||
default:
|
|
||||||
_s_putc('%');
|
|
||||||
_s_putc(*fmt);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_s_putc(*fmt);
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
**sout_buf = '\0';
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void s_vprintf(char *out_buf, const char *fmt, va_list ap)
|
|
||||||
{
|
|
||||||
int fill, fcnt;
|
|
||||||
|
|
||||||
sout_buf = &out_buf;
|
|
||||||
|
|
||||||
while(*fmt)
|
|
||||||
{
|
|
||||||
if(*fmt == '%')
|
|
||||||
{
|
|
||||||
fmt++;
|
|
||||||
fill = 0;
|
|
||||||
fcnt = 0;
|
|
||||||
if ((*fmt >= '0' && *fmt <= '9') || *fmt == ' ')
|
|
||||||
{
|
|
||||||
fcnt = *fmt;
|
|
||||||
fmt++;
|
|
||||||
if (*fmt >= '0' && *fmt <= '9')
|
|
||||||
{
|
|
||||||
fill = fcnt;
|
|
||||||
fcnt = *fmt - '0';
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fill = ' ';
|
|
||||||
fcnt -= '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch(*fmt)
|
|
||||||
{
|
|
||||||
case 'c':
|
|
||||||
_s_putc(va_arg(ap, u32));
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
_s_puts(va_arg(ap, char *));
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
_s_putn(va_arg(ap, u32), 10, fill, fcnt);
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
case 'P':
|
|
||||||
case 'x':
|
|
||||||
case 'X':
|
|
||||||
_s_putn(va_arg(ap, u32), 16, fill, fcnt);
|
|
||||||
break;
|
|
||||||
case '%':
|
|
||||||
_s_putc('%');
|
|
||||||
break;
|
|
||||||
case '\0':
|
|
||||||
goto out;
|
|
||||||
default:
|
|
||||||
_s_putc('%');
|
|
||||||
_s_putc(*fmt);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_s_putc(*fmt);
|
|
||||||
fmt++;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
**sout_buf = '\0';
|
|
||||||
}
|
|
||||||
@@ -1,27 +1,24 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019 CTCaer
|
* Copyright (c) 2019-2020 shchmue
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SPRINTF_H_
|
#ifndef _SPRINTF_H_
|
||||||
#define _SPRINTF_H_
|
#define _SPRINTF_H_
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include "types.h"
|
||||||
|
|
||||||
#include <utils/types.h>
|
u32 sprintf(char *buffer, const char *fmt, ...);
|
||||||
|
|
||||||
void s_printf(char *out_buf, const char *fmt, ...);
|
#endif
|
||||||
void s_vprintf(char *out_buf, const char *fmt, va_list ap);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018-2021 CTCaer
|
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -18,10 +17,22 @@
|
|||||||
#ifndef _TYPES_H_
|
#ifndef _TYPES_H_
|
||||||
#define _TYPES_H_
|
#define _TYPES_H_
|
||||||
|
|
||||||
#include <assert.h>
|
#define NULL ((void *)0)
|
||||||
|
|
||||||
#define ALWAYS_INLINE inline __attribute__((always_inline))
|
#define ALWAYS_INLINE inline __attribute__((always_inline))
|
||||||
|
|
||||||
|
#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
|
||||||
|
#define ALIGN_DOWN(x, a) (((x) - ((a) - 1)) & ~((a) - 1))
|
||||||
|
#define BIT(n) (1U << (n))
|
||||||
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
#define DIV_ROUND_UP(a, b) ((a + b - 1) / b)
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
|
||||||
|
#define LOG2(n) (32 - __builtin_clz(n) - 1)
|
||||||
|
|
||||||
|
#define OFFSET_OF(t, m) ((u32)&((t *)NULL)->m)
|
||||||
|
#define CONTAINER_OF(mp, t, mn) ((t *)((u32)mp - OFFSET_OF(t, mn)))
|
||||||
|
|
||||||
#define COLOR_RED 0xFFE70000
|
#define COLOR_RED 0xFFE70000
|
||||||
#define COLOR_ORANGE 0xFFFF8C00
|
#define COLOR_ORANGE 0xFFFF8C00
|
||||||
@@ -30,16 +41,13 @@
|
|||||||
#define COLOR_BLUE 0xFF00DDFF
|
#define COLOR_BLUE 0xFF00DDFF
|
||||||
#define COLOR_VIOLET 0xFF8040FF
|
#define COLOR_VIOLET 0xFF8040FF
|
||||||
|
|
||||||
/* Types */
|
|
||||||
typedef signed char s8;
|
typedef signed char s8;
|
||||||
typedef short s16;
|
typedef short s16;
|
||||||
typedef short SHORT;
|
typedef short SHORT;
|
||||||
typedef int s32;
|
typedef int s32;
|
||||||
typedef int INT;
|
typedef int INT;
|
||||||
typedef int bool;
|
|
||||||
typedef long LONG;
|
typedef long LONG;
|
||||||
typedef long long int s64;
|
typedef long long int s64;
|
||||||
|
|
||||||
typedef unsigned char u8;
|
typedef unsigned char u8;
|
||||||
typedef unsigned char BYTE;
|
typedef unsigned char BYTE;
|
||||||
typedef unsigned short u16;
|
typedef unsigned short u16;
|
||||||
@@ -50,94 +58,32 @@ typedef unsigned int UINT;
|
|||||||
typedef unsigned long DWORD;
|
typedef unsigned long DWORD;
|
||||||
typedef unsigned long long QWORD;
|
typedef unsigned long long QWORD;
|
||||||
typedef unsigned long long int u64;
|
typedef unsigned long long int u64;
|
||||||
|
|
||||||
typedef volatile unsigned char vu8;
|
typedef volatile unsigned char vu8;
|
||||||
typedef volatile unsigned short vu16;
|
typedef volatile unsigned short vu16;
|
||||||
typedef volatile unsigned int vu32;
|
typedef volatile unsigned int vu32;
|
||||||
|
|
||||||
#ifdef __aarch64__
|
#ifdef __aarch64__
|
||||||
typedef unsigned long long uptr;
|
typedef u64 uptr;
|
||||||
#else /* __arm__ or __thumb__ */
|
#else /* __arm__ or __thumb__ */
|
||||||
typedef unsigned long uptr;
|
typedef u32 uptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Important */
|
static const u32 colors[6] = {COLOR_RED, COLOR_ORANGE, COLOR_YELLOW, COLOR_GREEN, COLOR_BLUE, COLOR_VIOLET};
|
||||||
#define false 0
|
|
||||||
|
typedef int bool;
|
||||||
#define true 1
|
#define true 1
|
||||||
|
#define false 0
|
||||||
|
|
||||||
#define NULL ((void *)0)
|
|
||||||
|
|
||||||
/* Misc */
|
|
||||||
#define DISABLE 0
|
#define DISABLE 0
|
||||||
#define ENABLE 1
|
#define ENABLE 1
|
||||||
|
|
||||||
/* Sizes */
|
|
||||||
#define SZ_1K 0x400
|
|
||||||
#define SZ_2K 0x800
|
|
||||||
#define SZ_4K 0x1000
|
|
||||||
#define SZ_8K 0x2000
|
|
||||||
#define SZ_16K 0x4000
|
|
||||||
#define SZ_32K 0x8000
|
|
||||||
#define SZ_64K 0x10000
|
|
||||||
#define SZ_128K 0x20000
|
|
||||||
#define SZ_256K 0x40000
|
|
||||||
#define SZ_512K 0x80000
|
|
||||||
#define SZ_1M 0x100000
|
|
||||||
#define SZ_2M 0x200000
|
|
||||||
#define SZ_4M 0x400000
|
|
||||||
#define SZ_8M 0x800000
|
|
||||||
#define SZ_16M 0x1000000
|
|
||||||
#define SZ_32M 0x2000000
|
|
||||||
#define SZ_64M 0x4000000
|
|
||||||
#define SZ_128M 0x8000000
|
|
||||||
#define SZ_256M 0x10000000
|
|
||||||
#define SZ_512M 0x20000000
|
|
||||||
#define SZ_1G 0x40000000
|
|
||||||
#define SZ_2G 0x80000000
|
|
||||||
#define SZ_PAGE SZ_4K
|
|
||||||
|
|
||||||
/* Macros */
|
|
||||||
#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
|
|
||||||
#define ALIGN_DOWN(x, a) ((x) & ~((a) - 1))
|
|
||||||
#define BIT(n) (1U << (n))
|
|
||||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
|
||||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
|
||||||
#define DIV_ROUND_UP(a, b) ((a + b - 1) / b)
|
|
||||||
|
|
||||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
|
|
||||||
#define LOG2(n) (32 - __builtin_clz(n) - 1)
|
|
||||||
|
|
||||||
#define OFFSET_OF(t, m) ((uptr)&((t *)NULL)->m)
|
|
||||||
#define CONTAINER_OF(mp, t, mn) ((t *)((uptr)mp - OFFSET_OF(t, mn)))
|
|
||||||
|
|
||||||
#define byte_swap_16(num) ((((num) >> 8) & 0xff) | (((num) << 8) & 0xff00))
|
|
||||||
#define byte_swap_32(num) ((((num) >> 24) & 0xff) | (((num) << 8) & 0xff0000) | \
|
|
||||||
(((num) >> 8 )& 0xff00) | (((num) << 24) & 0xff000000))
|
|
||||||
|
|
||||||
|
|
||||||
/* Bootloader/Nyx */
|
|
||||||
#define BOOT_CFG_AUTOBOOT_EN BIT(0)
|
#define BOOT_CFG_AUTOBOOT_EN BIT(0)
|
||||||
#define BOOT_CFG_FROM_LAUNCH BIT(1)
|
#define BOOT_CFG_FROM_LAUNCH BIT(1)
|
||||||
#define BOOT_CFG_FROM_ID BIT(2)
|
#define BOOT_CFG_FROM_ID BIT(2)
|
||||||
#define BOOT_CFG_TO_EMUMMC BIT(3)
|
#define BOOT_CFG_TO_EMUMMC BIT(3)
|
||||||
|
#define BOOT_CFG_SEPT_RUN BIT(7)
|
||||||
|
|
||||||
#define EXTRA_CFG_KEYS BIT(0)
|
#define EXTRA_CFG_DUMP_EMUMMC BIT(0)
|
||||||
#define EXTRA_CFG_PAYLOAD BIT(1)
|
|
||||||
#define EXTRA_CFG_MODULE BIT(2)
|
|
||||||
|
|
||||||
#define EXTRA_CFG_NYX_UMS BIT(5)
|
|
||||||
#define EXTRA_CFG_NYX_RELOAD BIT(6)
|
|
||||||
|
|
||||||
typedef enum _nyx_ums_type
|
|
||||||
{
|
|
||||||
NYX_UMS_SD_CARD = 0,
|
|
||||||
NYX_UMS_EMMC_BOOT0,
|
|
||||||
NYX_UMS_EMMC_BOOT1,
|
|
||||||
NYX_UMS_EMMC_GPP,
|
|
||||||
NYX_UMS_EMUMMC_BOOT0,
|
|
||||||
NYX_UMS_EMUMMC_BOOT1,
|
|
||||||
NYX_UMS_EMUMMC_GPP
|
|
||||||
} nyx_ums_type;
|
|
||||||
|
|
||||||
typedef struct __attribute__((__packed__)) _boot_cfg_t
|
typedef struct __attribute__((__packed__)) _boot_cfg_t
|
||||||
{
|
{
|
||||||
@@ -149,24 +95,14 @@ typedef struct __attribute__((__packed__)) _boot_cfg_t
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char id[8]; // 7 char ASCII null terminated.
|
char id[8]; // 7 char ASCII null teminated.
|
||||||
char emummc_path[0x78]; // emuMMC/XXX, ASCII null terminated.
|
char emummc_path[0x78]; // emuMMC/XXX, ASCII null teminated.
|
||||||
};
|
};
|
||||||
u8 ums; // nyx_ums_type.
|
u8 ums; // nyx_ums_type.
|
||||||
u8 xt_str[0x80];
|
u8 xt_str[0x80];
|
||||||
};
|
};
|
||||||
} boot_cfg_t;
|
} boot_cfg_t;
|
||||||
|
|
||||||
static_assert(sizeof(boot_cfg_t) == 0x84, "Boot cfg storage size is wrong!");
|
|
||||||
|
|
||||||
typedef struct __attribute__((__packed__)) _ipl_ver_meta_t
|
|
||||||
{
|
|
||||||
u32 magic;
|
|
||||||
u32 version;
|
|
||||||
u16 rsvd0;
|
|
||||||
u16 rsvd1;
|
|
||||||
} ipl_ver_meta_t;
|
|
||||||
|
|
||||||
typedef struct __attribute__((__packed__)) _reloc_meta_t
|
typedef struct __attribute__((__packed__)) _reloc_meta_t
|
||||||
{
|
{
|
||||||
u32 start;
|
u32 start;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user