From 4e0103b0f57cb796630a260491fb7f2ee214e926 Mon Sep 17 00:00:00 2001 From: eggman Date: Wed, 22 Jun 2016 23:08:09 +0900 Subject: [PATCH] setup gcc minimum build env --- Makefile | 90 + build/.gitkeep | 0 makebin/makebin.sh | 98 + makebin/prepend_header.sh | 88 + sdk/lib/lib_platform.a | Bin 0 -> 849380 bytes sdk/lib/startup.o | Bin 0 -> 19484 bytes sdk/scripts/export-rom.txt | 735 ++++++++ sdk/scripts/rlx8195a.ld | 227 +++ sdk/src/sw/os/basic_types.h | 431 +++++ sdk/src/sw/os/platform_options.h | 105 ++ sdk/src/sw/os/section_config.h | 212 +++ sdk/src/targets/cmsis/core_cm3.h | 1661 +++++++++++++++++ sdk/src/targets/cmsis/core_cmFunc.h | 636 +++++++ sdk/src/targets/cmsis/core_cmInstr.h | 688 +++++++ .../cmsis/target_rtk/target_8195a/app_start.c | 48 + .../cmsis/target_rtk/target_8195a/diag.h | 806 ++++++++ .../hal/target_rtk/target_8195a/hal_adc.h | 300 +++ .../hal/target_rtk/target_8195a/hal_api.h | 64 + .../hal/target_rtk/target_8195a/hal_dac.h | 284 +++ .../hal/target_rtk/target_8195a/hal_diag.h | 107 ++ .../hal/target_rtk/target_8195a/hal_efuse.h | 28 + .../hal/target_rtk/target_8195a/hal_gdma.h | 95 + .../hal/target_rtk/target_8195a/hal_gpio.h | 277 +++ .../hal/target_rtk/target_8195a/hal_i2c.h | 555 ++++++ .../hal/target_rtk/target_8195a/hal_i2s.h | 392 ++++ .../hal/target_rtk/target_8195a/hal_irqn.h | 122 ++ .../hal/target_rtk/target_8195a/hal_misc.h | 28 + .../hal/target_rtk/target_8195a/hal_peri_on.h | 449 +++++ .../hal/target_rtk/target_8195a/hal_pinmux.h | 75 + .../target_rtk/target_8195a/hal_platform.h | 92 + .../hal/target_rtk/target_8195a/hal_pwm.h | 57 + .../target_rtk/target_8195a/hal_spi_flash.h | 210 +++ .../hal/target_rtk/target_8195a/hal_ssi.h | 256 +++ .../hal/target_rtk/target_8195a/hal_timer.h | 50 + .../hal/target_rtk/target_8195a/hal_uart.h | 119 ++ .../hal/target_rtk/target_8195a/hal_util.h | 252 +++ .../target_8195a/hal_vector_table.h | 53 + .../target_8195a/rtl8195a/rtl8195a.h | 111 ++ .../target_8195a/rtl8195a/rtl8195a_adc.h | 350 ++++ .../target_8195a/rtl8195a/rtl8195a_dac.h | 294 +++ .../target_8195a/rtl8195a/rtl8195a_gdma.h | 462 +++++ .../target_8195a/rtl8195a/rtl8195a_gpio.h | 143 ++ .../target_8195a/rtl8195a/rtl8195a_i2c.h | 839 +++++++++ .../target_8195a/rtl8195a/rtl8195a_i2s.h | 497 +++++ .../target_8195a/rtl8195a/rtl8195a_peri_on.h | 1252 +++++++++++++ .../target_8195a/rtl8195a/rtl8195a_pwm.h | 37 + .../rtl8195a/rtl8195a_spi_flash.h | 1005 ++++++++++ .../target_8195a/rtl8195a/rtl8195a_ssi.h | 474 +++++ .../target_8195a/rtl8195a/rtl8195a_sys_on.h | 1093 +++++++++++ .../target_8195a/rtl8195a/rtl8195a_timer.h | 75 + .../target_8195a/rtl8195a/rtl8195a_uart.h | 380 ++++ src/main.c | 12 + 52 files changed, 16714 insertions(+) create mode 100644 Makefile create mode 100644 build/.gitkeep create mode 100644 makebin/makebin.sh create mode 100755 makebin/prepend_header.sh create mode 100644 sdk/lib/lib_platform.a create mode 100644 sdk/lib/startup.o create mode 100644 sdk/scripts/export-rom.txt create mode 100644 sdk/scripts/rlx8195a.ld create mode 100644 sdk/src/sw/os/basic_types.h create mode 100644 sdk/src/sw/os/platform_options.h create mode 100644 sdk/src/sw/os/section_config.h create mode 100644 sdk/src/targets/cmsis/core_cm3.h create mode 100644 sdk/src/targets/cmsis/core_cmFunc.h create mode 100644 sdk/src/targets/cmsis/core_cmInstr.h create mode 100644 sdk/src/targets/cmsis/target_rtk/target_8195a/app_start.c create mode 100644 sdk/src/targets/cmsis/target_rtk/target_8195a/diag.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_adc.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_api.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_dac.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_diag.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_efuse.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_gdma.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_gpio.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_i2c.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_i2s.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_irqn.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_misc.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_peri_on.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_pinmux.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_platform.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_pwm.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_spi_flash.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_ssi.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_timer.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_uart.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_util.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/hal_vector_table.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_adc.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_dac.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gdma.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gpio.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2c.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2s.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_peri_on.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_pwm.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_spi_flash.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_ssi.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_sys_on.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_timer.h create mode 100644 sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_uart.h create mode 100644 src/main.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7c76c48 --- /dev/null +++ b/Makefile @@ -0,0 +1,90 @@ +.SUFFIXES: .o .a .c .s + +DEV_NUL=/dev/null + +CHIP=ameba + +RM=rm -f + +CROSS_COMPILE = arm-none-eabi- +AR = $(CROSS_COMPILE)ar +CC = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +NM = $(CROSS_COMPILE)nm +SIZE = $(CROSS_COMPILE)size + +SDK_SRC_BASE_PATH = sdk/src + +vpath %.c ./src +vpath %.c $(SDK_SRC_BASE_PATH)/targets/cmsis/target_rtk/target_8195a + + +INCLUDES += -I$(SDK_SRC_BASE_PATH)/targets/cmsis +INCLUDES += -I$(SDK_SRC_BASE_PATH)/targets/cmsis/target_rtk/target_8195a +INCLUDES += -I$(SDK_SRC_BASE_PATH)/targets/hal/target_rtk/target_8195a +INCLUDES += -I$(SDK_SRC_BASE_PATH)/targets/hal/target_rtk/target_8195a/rtl8195a +INCLUDES += -I$(SDK_SRC_BASE_PATH)/sw/os + +OUTPUT_PATH=build + +CFLAGS = -g -mcpu=cortex-m3 +CFLAGS += -mthumb +CFLAGS += -c -nostartfiles -fno-short-enums +CFLAGS += -Wall -Wpointer-arith -Wstrict-prototypes -Wundef +CFLAGS += -Wno-write-strings +CFLAGS += --save-temps +CFLAGS += -MMD -MP +CFLAGS += -fno-common -fmessage-length=0 -fno-exceptions +CFLAGS += -ffunction-sections -fdata-sections +CFLAGS += -fomit-frame-pointer +CFLAGS += -std=gnu99 +CFLAGS += -O2 $(INCLUDES) -D$(CHIP) + +ASFLAGS = -mcpu=cortex-m3 -mthumb -Wall -a -g $(INCLUDES) + + + +C_SRC+=$(wildcard $(SDK_SRC_BASE_PATH)/targets/cmsis/target_rtk/target_8195a/app_start.c) +C_SRC+=$(wildcard src/*.c) + +C_OBJ_TEMP=$(patsubst %.c, %.o, $(notdir $(C_SRC))) + +# during development, remove some files +C_OBJ_FILTER= + +C_OBJ=$(filter-out $(C_OBJ_FILTER), $(C_OBJ_TEMP)) + + +ELF_FLAGS= -O2 -Wl,--gc-sections -mcpu=cortex-m3 -mthumb --specs=nano.specs +ELF_FLAGS+= -Lsdk/lib -Lsdk/scripts -T./sdk/scripts/rlx8195a.ld -Wl,-Map=build/target.map +ELF_FLAGS+= -Wl,--cref -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common + +ELF_LDLIBS= sdk/lib/startup.o -l_platform -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys + +all: makebin/ram_all.bin + +makebin/ram_all.bin: $(OUTPUT_PATH)/target.axf + cd ./makebin && /bin/bash ./makebin.sh + +$(OUTPUT_PATH)/target.axf: $(addprefix $(OUTPUT_PATH)/,$(C_OBJ)) + echo build all objects + $(CC) $(ELF_FLAGS) -o $(OUTPUT_PATH)/target.axf -Wl,--start-group $^ -Wl,--end-group $(ELF_LDLIBS) + -@mv *.i $(OUTPUT_PATH)/ + -@mv *.s $(OUTPUT_PATH)/ + +$(addprefix $(OUTPUT_PATH)/,$(C_OBJ)): $(OUTPUT_PATH)/%.o: %.c + @echo "$(CC) -c $(CFLAGS) $< -o $@" + @"$(CC)" -c $(CFLAGS) $< -o $@ + + +clean: + @echo clean + -@$(RM) ./build/target.* 1>$(DEV_NUL) 2>&1 + -@$(RM) ./build/*.d 1>$(DEV_NUL) 2>&1 + -@$(RM) ./build/*.o 1>$(DEV_NUL) 2>&1 + -@$(RM) ./build/*.i 1>$(DEV_NUL) 2>&1 + -@$(RM) ./build/*.s 1>$(DEV_NUL) 2>&1 + -@$(RM) ./makebin/target* 1>$(DEV_NUL) 2>&1 + -@$(RM) ./makebin/*.bin 1>$(DEV_NUL) 2>&1 + + diff --git a/build/.gitkeep b/build/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/makebin/makebin.sh b/makebin/makebin.sh new file mode 100644 index 0000000..e36fe63 --- /dev/null +++ b/makebin/makebin.sh @@ -0,0 +1,98 @@ +###!/bin/bash + +TOOLCHAIN=arm-none-eabi + + +chr() { + [ ${1} -lt 256 ] || return 1 + printf \\$(printf '%03o' $1) +} + +# Another version doing the octal conversion with arithmetic +# faster as it avoids a subshell +chr () { + [ ${1} -lt 256 ] || return 1 + printf \\$(($1/64*100+$1%64/8*10+$1%8)) +} + +# Another version using a temporary variable to avoid subshell. +# This one requires bash 3.1. +chr() { + local tmp + [ ${1} -lt 256 ] || return 1 + printf -v tmp '%03o' "$1" + printf \\"$tmp" +} + + +ord() { + LC_CTYPE=C printf '%d' "'$1" +} + + +SOURCE="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +# if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located + +while [ -h "$SOURCE" ]; do + TARGET="$(readlink "$SOURCE")" + if [[ $SOURCE == /* ]]; then +# echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'" + SOURCE="$TARGET" + else + DIR="$( dirname "$SOURCE" )" +# echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')" + SOURCE="$DIR/$TARGET" + fi +done + +RDIR="$( dirname "$SOURCE" )" +DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +cd $DIR + +cp -f ../build/target.axf . + + + +cp ./target.axf ./target_pure.axf +${TOOLCHAIN}-strip ./target_pure.axf + +${TOOLCHAIN}-objcopy -j .ram.start.table -j .ram_image1.text \ +-Obinary ./target_pure.axf ./ram_1.bin + +${TOOLCHAIN}-objcopy -j .image2.start.table -j .ram_image2.text -j .ram.data \ +-Obinary ./target_pure.axf ./ram_2.bin + +${TOOLCHAIN}-nm target.axf | sort > target.map + +${TOOLCHAIN}-objdump -d target.axf > target.asm + +./prepend_header.sh ./ram_1.bin __ram_image1_text_start__ ./target.map 0 +./prepend_header.sh ./ram_2.bin __ram_image2_text_start__ ./target.map +cat ./ram_1_prepend.bin ./ram_2_prepend.bin > ./ram_all.bin + + +#mbed_disk=100 +#while [[ $mbed_disk -le 122 ]] +#do +# +# diskname=`chr $mbed_disk` +# filename="/cygdrive/$diskname/mbed.htm" +# if [ -f $filename ]; +# then +# break +# fi +# mbed_disk=$((mbed_disk+1)) +#done + + +#if [[ $mbed_disk -le 122 ]]; +#then +# echo cp ./ram_all.bin /cygdrive/$diskname/ +# cp ./ram_all.bin /cygdrive/$diskname/ +#else +# echo mbed usb disk not found +#fi + diff --git a/makebin/prepend_header.sh b/makebin/prepend_header.sh new file mode 100755 index 0000000..b27ae24 --- /dev/null +++ b/makebin/prepend_header.sh @@ -0,0 +1,88 @@ +##!/bin/bash + +################ +# Library +################ +Usage() { + echo "Usage: $0 [Image Name] [Start Symbol Name] [Symbols List File]" +} + +# Parameter: +# value, width, dest +function MakeFixedWidthHeaderString() { + local __value=$1 + local __width=$2 + local __dest=$3 + local __header_raw + local __header_raw_reorder + local __header_array + + if [[ "$__dest" ]]; then + + __header_raw=$(printf "%0""$__width""x" $__value) + # echo $__header_raw + + # 20000680 to 80060020 + for (( i=$__width; i > 0; i-=2 )) + do + __header_raw_reorder+=$(echo $__header_raw | cut -b $((i-1))) + __header_raw_reorder+=$(echo $__header_raw | cut -b $i) + done + # echo $__header_raw_reorder + + __header_array=($(echo $__header_raw_reorder | sed 's/\(.\)/\1 /g')) + + for (( i=0; i < $__width; i+=2)) + do + eval $__dest+='\\x'"${__header_array[$i]}${__header_array[$i+1]}" + done + fi +} + +################ +# Main +################ +if [ "$#" -lt 3 ]; then + Usage + exit 1 +fi + +# Get Parameters +IMAGE_FILENAME=$1 +IMAGE_SECTION_START_NAME=$2 +SYMBOL_LIST=$3 +IMG2_OFFSET=$4 + +# Constant Variables +PATTERN_1=0x96969999 +PATTERN_2=0xFC66CC3F +PATTERN_3=0x03CC33C0 +PATTERN_4=0x6231DCE5 +RSVD=0xFFFFFFFFFFFFFFFF +IMAGE_LEN=$(du -b $IMAGE_FILENAME | cut -f 1) +IMAGE_ADDR="0x$(grep $IMAGE_SECTION_START_NAME $SYMBOL_LIST | awk '{print $1}')" +IMAGE_FILENAME_PREPEND="${IMAGE_FILENAME%.*}"'_prepend.'"${IMAGE_FILENAME##*.}" + +IMAGE_FILENAME_NEW=$(basename $IMAGE_FILENAME) + +HEADER_FINAL='' +if [ "$IMAGE_FILENAME_NEW" == "ram_1.bin" ]; then + MakeFixedWidthHeaderString $PATTERN_1 8 HEADER_FINAL + MakeFixedWidthHeaderString $PATTERN_2 8 HEADER_FINAL + MakeFixedWidthHeaderString $PATTERN_3 8 HEADER_FINAL + MakeFixedWidthHeaderString $PATTERN_4 8 HEADER_FINAL +fi + +MakeFixedWidthHeaderString $IMAGE_LEN 8 HEADER_FINAL +MakeFixedWidthHeaderString $IMAGE_ADDR 8 HEADER_FINAL +if [ "$IMAGE_FILENAME_NEW" == "ram_1.bin" ]; then + MakeFixedWidthHeaderString $IMG2_OFFSET 4 HEADER_FINAL + MakeFixedWidthHeaderString $RSVD 12 HEADER_FINAL +else + MakeFixedWidthHeaderString $RSVD 16 HEADER_FINAL +fi + +# echo $HEADER_FINAL + +echo -n -e $HEADER_FINAL | cat - $IMAGE_FILENAME > $IMAGE_FILENAME_PREPEND + diff --git a/sdk/lib/lib_platform.a b/sdk/lib/lib_platform.a new file mode 100644 index 0000000000000000000000000000000000000000..d843b94b342ccae2920b03e8fec59073c5e57ef8 GIT binary patch literal 849380 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

Gw2SGtL*$drya?|P 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

AoM~r>Jqo;;O z`VQh>vthV**hu?Vf)!(QMe-Lq-EMW~aPJy*V$N{%OuJrv!X5fJqfh&~t__`FK;2OL z^JxkUq`3UK2Ys|P*w;C-c3@~j`@rBx??Asu?CR}Y2meINS~D=z-M(f+38;Vw!s!`0 zEIN5qIrLR8+xCpZva@rtr(`P=bF$rwj_phfFPM^@m+zdm;@GL#In$=)WMiGWjhUr7 z{8#bfoQLEUIGN$8hdZY(nV#p24N%+1YpM#9e6Fn(dr^(A}6Tn_EVVIiBx>4`-9aObq} zOkT%1;|iRO1q{5gAln&JkiG6$9Kz=;T#_?2$7wvqx#z4UI@e8hROP$fPmQXb(DU8Gx=Q=k#Vds@I3yyPc zgypp}!@y&5vZu|@F3HQvJFcv0<+SXh3!NXFUBK|pUG@qm6n2IYdw6jNk}@sZ!cl`x zOM&yk*-Mo53VVgG*qa{#RXV3Gaf0d~!?Z9ZoPBBDsXn36L$6kuLQmayvatM6)ixf&B!U7wsi5* zdgoX6G1-fqPtQ1}_^^h}ka@1Zz=uVUkvj7?Xq6FGxq3<%S(VKylkN0}Q80z5W4T%L zrcceuK5klJ?$p9;U%(Uej-UA6#<<;|N~tOXPo9$i*4tFUlxQQ_RB z6o>ur@N+DGc>berDSwXU&s6^8@@LKr72~w*8CiwJKCF(6B=+Sb8|7V`i}NJ&V(RJ@ z$?%A+z7N8Q)m7E_)53+QOS#!OQ?rpr&R{rOwTYbUsnc?4&CXHc^vXjVfz+^Ri&}q( zb%^Rfo{FB<&LIoGn}!Fi8gwBQJ;j3a1xo}M2p%rDP!KzPsvQ@3fR~)<)NWM{kF*V) z(AzcAqmJ2WuV|}pZ)<5kp{}y6);j2@Dz2nNaO{@JbJTd+8IRnlYi-fzxT)jMS}I$r zYTDaYHdk3#Y}q<8Y_)Xv4Rm(34y}Ryl}H7Gm2K+k9l$Yc4BlSXSfTl4-DTI7ik?#} zZ&t`YoRKrcdT}6@_Gk21AgT{uYlP-1V#J^h_-gCkFbKxJ6F1;+x`8zobTFxHYpbrn zL40ik__5ksu>mOpwKp`@w87Hc)=u7V_e+tiKD}TUzB%>lAf{*C7rs($O{zLc7>Qko37(6+KW5 zS~s7-gZOB}Hl9NbtvFUqYl!Sd6p2wzsWl zZ>cJ)T5J%J*2Mzn^4;p8?rv1q+Ws!9X;8_Gl(ISps-nEz z!bxm(ZSAegDk`d4Ta~P`zP^ecaj!0`t6$bq^%>_ia#3;D8dibc&c5ot&UI4H(W01R zRa?3&RYA~vt%l*=)4QvB*Y%88k;CJ>$A1p8jhAm)>p6L^Sv8G{+IF1z*j|McN6J(c zN^AE>Z~r<~G!;z^&F!rXI2;nETeaapQ58K-e(T@V7dcg{rFD5F^f3ovTB^2JmbI0& zS2b4Fl{L1TlH(z&RgKsb_>}IU{_ehZYTiC#sg^XzJ!mV+Rc0fJx)Cro$gS(zV%(dW zt@8S&ilyzXbthJ}*VnbSS>ic@F@}{PGXH)9&KK9P|f3j)WqJv2St$D$Gx;ikY?+q#EG z>PFBP$DBW_vqV*<`l{t<|GGCTvZ{O64peOz#6fnddz-JJM8g6Nhih19ogjz6Ne0X9 z2C_`8WKoGyxFaqb>_W#HbF{E-jMX*h0BgL5V73fz?piQ1aD?SOz4Z$|uM7{ZDeRF) zfHen~3HCV9`s2Q>qvx$T(&4ttUA>6ykA-RO0ji~{0MTrVR@a99btC8_^$pW>rgBeY z9VtI;q#Ji^)q|pUmYWz$oOgg0a|h7J@fI&c&)_}cPmLx}pP;*H#Gd0g+4q|!5K~P& zZInG(Sqo}a74E;PVj4l7lR$NaQvF3`_Zk(AIzf}}=#Wv@22ri5`ntW$V`6`O3aLrqZ;dHw2^V z-=%q#SvBVH*ZRIeM4`tImEC=vr!5;6riQW=)}Zdl(ZAOB>U)MdTU8BUbla`5Dh_eb zpgDsvCKnHNmg5q+QR}0$+Z&fPs5=0AS>6?yU${^8^LS8euw?~1ulANUblW%#z4`WGKnzk>va`j$Isyxd-Uc$bm>$o?qunx$hc#!J;!a=_3M(9y4+T&j-jmY z?$^Cn69x-9!j|qe-MyRj5w*JJ#JD33?RbiAN2k^`fWAZzZ4sRHT2%}Sj9v0lEv*$H5|D=(Y55u(9V&BkwA7J*XXS9_X{wZLf_vro$tn)vZ$9 z&2+Atu_NL~NL3M-Shh3oO}V_TCR*PjV^ckh^)$0cmBif@hu+pL*BKpie-tGudMf(5 zJNwHvjSR4Ys|aOiRn@3QRw}i0$8DS`Lj{iuF^Zijo8ogRQa0@Kvlo?>MGpGF`klf9-h4T za^`qlIq{UI`g^>Q(f32ct=;jM!K4{SQ_D=3g`0zJRjT8((9YKI9RwdU)rhoRJ(bqr zeF2V7*H5JtEi0SbnpDYAvb<4XYc`!6?_EtTb!{u#DG>J;HlWBmE0n)!_qvN$gSzO= z87i4G-ka;p6N-M=G$SpQJ^F5~dil-`cpJkGYq)n^e|J|{l|5RWzK`qoC6S7Osv12t z+oWJwqck5houMwzq3^mkjkaFb+*xP&9x3qHsPA67KFC?w%Ds2|)_GCCI!5?ThBE#-MafPncWP4dZbeffkj_ zpZ_JRY(75Sbar>H#sV9D_)Mr67{Za!^BPJlHz~0p=u7jb+ZpymC)1u}PxejqadD;k z)bBmVo8R({;U~|sF)7=e^L-bP*XviR{8G>J)Av%_3WGL=pOnkTgwG3XOFZAbAmKv) zcIP7U@N=#)yJ0CGlYd^)w&3}J3lcAMwJ<${wmnZ#$=x7Zc8}de}Qu$^Lj@yhEkS%g4{=>P+$Tp?JaYX&Xj5R|7|eH1-%94*|D$wzc>4YxM*s&jQgC zvr!$R!?OZ)dN`ceJ$RgXVzu(pwH$AvBK?flJ*ESSM&TK&#XHIfFW%XV%s#`NW7W_0 z@;;Nrb4A~w#p|u#7+79sZ(~*mg~vQcsMlZSIB;{cH?q6{*@woibX>i5c&KwjK^NP; zVKp6c!4V}zMXHb(!uw9`;J6@9J+r9fba8lr7yWAotO9Mv4!&sUI!m-mAHF|$m^;xM zti!7okJG^}eZ6?_6^TfXRj_7Y!v^epX%(P%DZrbHq2AS-_`=2`Wi67|%^Lj0%oMP( zkKptangtpnzv{yHadkv9Mb zFJBnMZo>pLe5b(fjkgx@4#JJ`(%r;+A?#jxdqEf(@QT>K9mmIMI%evRmv0vcZ@l+< z;!S~{iT6I(z43Oyqm&L}j1KpJ_R7oOp!1pO;EXUMZx8HVdAl&jfqk|yM&8qK@XG6f zJeDWrv0RM2w_*3n`xNrF!Oa*W@3(O9${U0{-v1~s4VRJUK$utFRuukT_#0#7{Syve zdD}hm(&1<1@l0^9ybjFSpuaIj-gGc|plIi!jD&8B?!{S82xxQ2>DIFK|b$z#PHoI ze5Suy1wPhKV+@~K1OP`PuLpdTZ;Y|?OcCni<;ycnKqGHd;x%5B=jS|EF-G1;uz1Vu zR+L*$hR&yK@KPS*^CJN!3`O)!$2n9+3DCxGLL6VhEbP0$HOFEMUmEzl@ur@KGC{*& z`7k{u-sy4jUPEWPRb&y2yzDr6d#{Z4L+opfJnZis3B&MTIuffSjS!DKp6%wUY{UqM)7jA)|A*(zOQSslnf>R5@3@=z^QoL+gmdXaygfJPozV~p4R zf8wm~M%kL`w1rdHvMS&a7{*L7jDE>&{#q>nv561Ba75|+P z`QDNuKlXZz_|XzeIp~>UT~d_1{761~doIcw6URSB@pGAtHoS924L4+sm7l8kn8RmZ;<5Z`ia*+Kr$w1z!sNq@Vu{oG!v0c%yPmX;uq&|nm@q0Ra@bfJ5Sb0;Sfi}zs zTP+S12LR7DpCu%VlxLa8hUYq#sBx@toPRj#2^-Hc_Zr8_^^)+Tajp?&Al zQw;e_;^?E}=p}Jh3SS$K3jSk+Be4;45ITR)5;YZw?X(%vJMAL!a_{q+v@q= zn%3_vye|6F_Cdk)he|J_OzewrLZ#@N77($oUJicY;+bIxUDUT;JvUIZ#=L{^ym^WL zSk=Cvd&3$`SoFAahEU`5eQ@h%8aq zEx2CrRKc?a&lkK>aHrsng0~CaC-|t~F9d%r_@?07f-dt3`f&3YA`fRF^8P_A6g*sz z_YJz23378=(hY*Gf-41iC3^2sd4d-SUM6_8;5P-Y7raIAHbL$x zMtS!MJ|y^<;8TLn3ce`#n&58))!Chp^MTNR7W|u_&H4%dM8S~Yc)>}6>P&I)@%fhg zs@(ufgg#2JOt4n4Ns!Np498=5h^qYnPZ4@ZkeeXWf2-hj!7Byt7JNwXDZv*7enL9DE?zK<-P7>@CRA-LEeS^>= zf?EYI5xi3H>w>CkU<+JXP>Q z!LJG4BKRZ0p9;Px__iR=m7tzB-uDp`1w(@41=Shj@DB?;S8$PFrC_t*D#0GXO@bE) zULmN?6o=fqgnm%)Nx@eI-xmBxkPmp&H$^a0Fi#MtQY!yr1i4o!`P&3L1p5TH2yPSH zA$YCet%5%id|dDa!QTpgD99HwjBlLaVS=*+4;L&GeFjvDi?_3kZ%8Oc$Iim@PO@ z@JPWb!Q%zLB-kssN$|^pmk54c@Fu~#1RoT9QjkZfFuiXIz9;yxU;+kE^iLB!Ot3)k zD8XvM7QvGR*9&eIJWudaL2isj`QH=#k>I0(F9^OV_@3a$f(aoVew^T8g0ln<7c3KO z5Ij-v6v0yk&l9{%@LIv!1n(1kOz>I3*96}Y{Ij4vM(Y<6oFq71aK7MT!A8Lo1=kAl zC==$>*@Bk|@`Mk%-y(Ro;6s8>3BD-!8^I3*|0amtF_oP0g3|=&3LYU?E4Wf{t>CGG z=Lzl*0eo%pT~+g;qxwf__ct_XR%@bn#Mx;dw3@ahhO}U>Onjuy&!>643{4 z5_&7~Xv;cZ=p8~|E%Yv-ZxZ@Wq3;oTx6qFX&2J!-_kz%Sh5nt;`-T3q&^8`Cs1MJ3 zq5kPaw5?pB3y6?cBJ{CBR|wrGbgR%O3%y3@exZkjK3nMXguYbhD}}yZ@D9QI#s49p zeJn4<$gX1+$B|{HLFro8>o+tDop%)8XD|Cap@J9}DfD zsQH6L=#wt=B%$+!{{Pr}6Y#34tABW(d+xotNiMko62=g2CJ2~00m5iz5;Bqm2!dvY z8_8sHnVg7-isOq#D^(Qg&{_vXt1Z@AsalKH0sCretyXQV*w_IOHFc=p@3+so$qm}) z-~apnzVG>-=kq@IoZnt+uf6u#!`WxrXRlNu(qs}*U-`l>5xQFFvxty8NBG^s?-%+) zp|2o9?rP!RBK-YA|3K(NM94iQ_*>z>A@pB_J}LN_AXoBXJ&X|?M}(eu!7RZ7L9Q>v z_;$gqM5Mo1=&ObPme98gK0rjh{e*~zJI@OJ3X$y~^t(d;Md(vP|5Io?(o#N@$aWBV zve1b_&k{OE==nky30)@iDk8QGf)@zxBtrjgA|7_#F7*9Gz$lu3&*+mEc*#6g+1Vx|f)P>mZ>A1g{p{D|k1t9oJ_< zKT2#<>SsbfM{HH7yijmJaHrrkg1ZH865JQ}7+Z_XYnd z_@Uq@g8ve<@%f_*$Dg2nZVQ@zvB;;}AtK-R5$6dm5iAhY&ubCCTxk8A7Idr7bW63Ti*%NYD9B)bj^HzV9PFD0ouvV?n`H2M4! z{18EUA|o9uI74u@;C#Wwg2jSmg7ikl^lJs%1v>=$1UCuNTN&lA6a2Q|&4T*5FXHbK znr_H=9sa1Ge(nqUX`$(sjPb7v(mg!s_XPhYctUVU@N+@BF{8XkkdCcM)4eM(UT}tB znqZdTLcucy=_ZW#3H5?&1RDkEe~Z_R8wD>E91y%h@M=N*{221z7Wyv19|#^4q^mpX zeN6BP!Dj@Y6QqAH%DpN0XTiS+o)r98kp90YPsh8&ae@;BrwPUhCJUwrW(&>}r2jDL zDHp60TqSspV2fafpnhJBbQ^`t%`2P~zBS`n3=WE1xKr>N!QF!Ni_CQNRYtr= zkj}|SKQ8#R;1NN(D`Wg01dj=RAV@!3j5ql_9vCJVA?OuM6igM&6r>k3rYjR%F1SLF z&dnI_6YLfA3)1HqFTve{bcM$F?+G3dd`R$7LHgdN+zWy)3(}bx`Nst5lZ^Lg z`uzjY;B$MRL(nZq?@Q!Q6r3s;FE~SxKFuh%NU%_lUcJfJ?=gV2La!D)Td+;gCrF=Y zOn0&16@pg_-XOR~@VkQa)y;GV1oit3(9a0{oS=TM0sgB((_=T&y(37UYotFC{6f&c zH30ea!A8{YGk`Hddj;u}jq&t9MqDU(rr=V+a>12?X9?1W8`GU9xK;2X!OH}%6ud!j zk04#M@&5Gz!5<0!MDXW=zYwJBHp>5A@Q;G;3F`MFh(95;$@dVTLj)rP_4^X=Ckw6L zn}DY4H_B%VE)vWWEEB90q-!|Jw+nU((la~x1A;pQuMylOc!%Kk1s@Qk*KekOM({bo zUkm<5ke<9Kr{B8(KN4EMe*sOGalGGl3yv3@C>SdkFG!bil+P7hCRio7LXci}Dc2-O zf8C@v3T_n~5Zob17j=}oN$@to+Xa6hsNd&6jxOvd|CHeKf=2~^C#c`=K#nf%D6ik| z06!O+6I;or%R6F}V2q$wkS_2TKTq&X!9qd0#ACdE{{w6hTE7PZO&58Lr&BiKWr9}< z(q$g`dj;wKj?Xb35d4wgPXy@>kMTzZUlV*oknZsquiqB|KM`8LHv(Fl$AbEP)l0-NpG-s@WDs#5kxRt&N*)pCl~N+c zs~RGXj|L*zqlt)m@)1$KULx}2kLm4#IQ?oGhnYrg2jcPAUDIAcsL-^w2k|LFYr8<> z(T|SLBf_pCL2V!C3Zb=~pzDR!_JUq3bdzA4ptc|JokHt!fc6VLAh<(tr{Fb$y993# z+#|SG@NU8T1P=;6EOUkrQo{XOhlZ3hke{y~IYdj1jY(f4D>{|(;vAm5LO z$j^li&VCog^5jeZMqGx_IYi`JA#@E9`S%L#C&CWhZb-kEH0-%s;&r>huA@S~LWF&~ z9wD#m5q9c&0j=u=_U0Op1HFg{yBmaFON9NsLi>p*$AHlK`4-BPo;}|i{L9SA&dko4 zn~^im>&?&+);=>MWA5C!UT@ai?A%<#)@N892&ED3q;O^Bt@kjsVj! zJJswk;&0CTx$jb+@tN&J>R*m~-srg1=kz`N*@;t+e0K7q-wdgP$6|~*4-_OnkzR87 z!N*S6JocOHCos?H_}v4KoiIJ>`0GH7o5xcx!8GC*~!nB4LZZh1|5^D2iJp6d#XlH!_L`l{cd)w&T`w8#;dU*@=%?I%BRS z@#awEK*?b794!@jer4WZsW-XlwR5MPd+@W9pX}*??8nBuH+`T^K4DJUV9urXrGq6U zMpjlKbeu5eIQA3_UY2BJ77rR@H!RB^RP|9!XP?_qdTx1_QGDFys6O>}n-RC7$=)=j zWOCDZ-|s^{f3>B&`qbf;DNW9UkH3H1)4Q~(vdDMWXCc?z<*Odt>waa(KJW_4>i(d@ zT|MZS($?|)4=O?)J)u0y29Jb=ocMCy-6i{rmJKeQ8TEvjXiHo=Xb&-NwB1yFTsfki z$eXEVx=wtVt8R*V!kK7K{9TE8qjBrqCrsB}C+zN=V@HSVhu;`dHE#^L22?8KlT?zr zG3p6S6-~0;_{LCFP4!?y*relzE9!}`6YkKk6ZTLe^@X9Rfr_Ix$Rih54`N*(ggOk! zPpXMbcbsrI?k-}udhizx^Ts7dL(_9#GZ(G5Ic|Le`Q4|A2E(Fkw-yaP?+!iTv{wu| z+($mJ14Bao9AdjE`Bfvw>Mh1zT6!letv+sszWrX2Z>F!^r_!UI$WDw;EP{5cgf>`Q zef-Nsu*9uydg?udb00Zo%USQ*W_$XWn)&20rr&-nu~y~TYgC>KTOu|uwn%JI*d}3f zW5dZV@7{avxyLA<)YQ9FJ;9@7eCb<5O^0z@7&hP7D%RK73YGBgXO4u(vK(Jzb>YeR zj*!pnt6m;b12H8#2TOBz4mK1%KIziI!twT|c}?$6dVWZG!<*2)MnEU^-ha;bW)WZD zgLM3QA5lr$4;Gw^++=&(nDa=%_@iHb@~AG?t>+b<<*0s@soYeJ~Xy)a?|gJRAebG7{4>X z7GGLoB--CrY2_~)IT0y~kG_u5wa3Pv+GZ;lbQC-X3i96NYU3-k+(`b*%ZJckLtiGh zR-N~X{RhSem)i=4TzieVeX(y1XUA-5;je|BFhU>2=yT`G%In}!^k023w%IAayY+py zy1C$*Cse!WLgUeidhU}46$&3QSJEh6ePg^fHls6w`m{5{G6zTryG1Nlj?2_^2(WQHq zZahFP!@H zk9~BDgq5lCcnLO-57Q&?_lNyalHQS_%;&Rd7n_uo2Iea+i-Oo#HDvo`+sRnw!d)^n~G! zd_1Jw1uLIF#(eFtr^cr8@_>;*d!%K}5x^r0$4!6w3WplQ#b~`rZ410rJ>ITnf2+^i z+}76T&DfH(#k+Wkg>j2D;x=53DXT85U7*Q@-c@}a{&tJdaYYrY|4oz{lho$rs=D5q z=Kg*Nk6DSeiPmk^B=f0ltLf-%Uy#(c&|BZ!TiESi0HY{Z?`!v#baZ3k>3|F(AY{qV zOlGadU@0^&z9#bb^>lW&_j&or6eAw|m0v}_um(@ozWIGq1K-rZH#P804SZ7r-_*c2 zHSkRhd{YD8)WA12@J$VTQv=`B!2h3Wz*}XNwrLR0XtFme8^}GF6wEF1PCV-eoyV69 z_%X~MpZrli@WU&Sul!u6aia0g!g@|*H%c()!`Ow#5V6oWDM-*}4;cVyGo1fIdUG1* z0LAE;$%ac$^szZE<@*y`NF-F4->2-nbGWxVzJmx;&jQQU?@H_;`crI|<62~EbA`MF ztL=6NSMxTL!7^uOBcb^!@-Xx380>?DS57JdA+G%hyIdJCAk=j?!eOqD zQGMYm^m624cSMv^>D!1fTzaai>tlpX_*$g87oozXOq$?`V)mh%$ahTm4pV)?`gL&v zlHp3=v>F#Dx0tR}uo@D6Hu(LbjpQ1K?$gfu(v7m@2D%sj5{frt@BO(8zmPaFXdt%FG>l|%Uu(C$c^$jsIv ztX#{G)^K$r2%Rr8_pBjG{sOt!9XSgr$>ju;>qnGSCg)Z;=EZ{_`Wr1XznwDIqBfN4 z1nSLj-HtG{;UgsFSj@Eq!#F`M(sAbf2#5cindGr*Rd_vHGoKY^59g#;M}aPG_#4pR zC}e@$%FJd-i`c4RoKPL(D47h=@Cy)jEM-wt`0Y$vN@MNe--A_-Ww+Cu@a;6VoMCr3 zE5=d5aAf#ormbX{Q*{uoVtA4=*D>SjLpJ2K7J70V%eiJl_=l9KrHl$c7wzb%W7r=4 zJKA5*uq%8A&0N8-JDknpSjli?I45U1RxunEel__G3{MK@WHQHUhGW9NMVYf0_J;4J z%vy#M!{1`L&Sp3{oRf|n=P;ZSel7NnMusz#`78_Bl!)lCcIb(6w8p`7H#~_cM;n7G zoC|(9+Giqc4=-mC*QFxt3g^UT$9n2Q|o#B;Y1H7wmOwTBH8m-5{4#H zJe+Flv}q#4a{`5OnwrS*9HmKiP2_sM%NU0y7J2#^G*RSNiNletl4$oZl z0p}!5?DTL}uXC~{uJPPVbEarwm*;9$$W%?-;MvK1Vl=VGb0ynmnkM#oo6&;K3P5CN;{C{$tspWr@z==Zeg7>aCXzn`Ot&&R&W>dn=JGRCeWHD6P9W9)vm!vamYjIq;Lq=lMt8)Lb= zigS^sB8{=3Ot;v$5Y-lCjJ1=>({YKmvG=h4^EH)h8+!p;us~BOwz2=9&O%LP*v2N4 zD$-PrZEOz4CTFpxa&2Qnm|uye7TLyf5fbN8<9g(mXB&GysZt%c$2N953tpzFy*4#2 z2}O5sN8|L#x=@YdA|IMb4VoFP#$AH&_h2He}frOi6D*52E+VCpAAcm z^NrgPP9c4WsV>lT8|g+^Yh0-5-;yqeg+ecbXf!9Q2)&1NA+x$j%k%USU5G@+#hP}Z zBSdeZK8xn}Fwq|7zfH$yA!#%x-3xsVX-;MpnpYFiA5(rn%b!96M2`hiXs&+~y$3}% zF46Jtl3vIBw;Mb`+K@Dw=R)IBgD1naq@axJypA--ZR0X4J?IH#)OWe@A?vF~ z|AlP5zqxX0*$zs=zwfUcmnj@6ZenM zq|3mY!3DQM+~lblU!d_rA{aJidxiOPhLc&-~Mi#HUguxp&qlkyH#c)vb@1fDU37XCO zkS`52>u)f}=z1Cvk}!$=u{R0P7UPV^ka_shYrsgM4r_NmLXaD4Bt?u5HzTG-te7~~ zh@6PJN>t(DOTfa_-vnhwEC^p1UN#=rcEU$?4#OxLZ-D2FQ)S~h$vwnwgojg-TvsxZ z#lWCYyJ1F*@WaNBBE!cFYtMxW%%L`2R%Rr}cwh$ejnJta0p%V^79&}EDY?hL3GLpNkvny#Cdb9!PPoq5JV&FE`ZdutH8ERx}M?Kk*uj;dbqJ- zA`SMAXhN5^662_|0u)HFf|I$mIYOQ}c@btOCJO_`TZ~!3 z5;SMFZg*7h8N+oDK67%}c&5g;b*yv!dy-vD)ex>jue7TVjhcN7>C-*VRzbf8gl#HA zN9*rr5&jgSlWZ2B_v<{|C=--SpFU1c$MmPL8LELmHKy8PYJGZbPv{`th7B?Vs@F0M z{019!5-n3{-SF@0Ol6kL$EL2YAeM>>Vg)ustsqc4MTmjY97Xu_94RxL9|CRI0;T-B z&c>>p*;-%5KH~SV8EQ3EQzgZT?^*2sM4MNV5vj&dXPvIis*bY)+E{Gb<50bJXF^l~ z60u@YsR0RMzBGm|5yggu2lp!IAmjB*LkDtdPv)~iogc{ ziVW>)(|N8Utixt1|3&*4@M*qod47nf;Y0J#1}IYp!K$?m}EK5R(#b^R4=R-e@`F`z;lZ)CtGd>b2#-nNf{+pxLRR<%XNBslkx z;vf>>nEPmn)nhaEjr7>zBMR3DsuWonYI&fOA_%7b1v-FD9q3o66cp zq^)2RtP051*|O=Fl4w;%_HaFSLeqY&Z3W>;Y#4y>NWsk@GjQ@$0~)0M@qy|@}3Y@s?0#w}wXN&OI2ts-#ZJ?e`fZCDZ1hQlK>&Z#O(i`Ei2O+Qp+BIkriXW~AR zv?WZPM{6{XG)rTsTBOxK-UHpBhpLQyMBbj@kPSqW#YcfKXFuQ$9jqbz%;G)?c*P15 zUe&?6uO_eMP14=iSZw!~nC3fWA4yA1E!9|Qhb^NeQFg1V5_vg}mI|m2j!r@JToENM zz=lGU0Dfu(e+_ue3T8nMKcx>UWw5T1^fkQe=+%j8M$*?X{Q{l7h7Xj_vV#AKS$SI5 zDw<^(u*!$TR=I}9VcrP^7uzymC4mbfm}--;kAYXP8EPfLDp)NIm8OssX~m zx}O&vL|THYI07#2U|hyNBGrIRUr|7qqFe;=Dzl|emZzvyS}wGwYje=wY#UgJ(Ye~Q?*yuRC;wiFB6J_qSnG4 zcjv~o_O)Hjtv-5Z{C_b|g{tV^oZbU>kN;7f{D)%ceg00%8%B`Y)~^1J{y+_%UfIEl zwIDhTynXby^)-V?e?JL6Q3@y$59j(KW=mlS+ z$cLj;1&m}aNQ%DG+u7`gZ{DuPo?buv=~6k;x54iPLU@GH+SAwG*xHp13J(gXcYSY1 z4=89O)!WhCwQ-9@V<6Cng*jw1%(2GeglT4XnmHkDx*6^@H+fUd@HBICTCBNYndt>% zkr|d|PE0fBEi-T0w$7Zr$o#!pcV=AN40EeDBikIa&g@T{lVkQTn>oYm_s+?gV|Id` z6Bjo0mv_2!ZWvvN_^ zp4!Ze#g!|Q)-0Hw9eYOh48}SAPBVJD`N+03^SlQ0I>T$`Es8T^(|qwM6|osx5@Ql$ zs!Y!=)@-!bELc>&Q0KdHk%kDrhQf2S=kjWZ_I{jxTp1NC-&B-BvxGg>Y8HJ*4f#L z%tzanU10HZR9#!&$TuX~TY7!pI%Xr@)+^z6y|1&b4-RJZ_bP=w8@u79#;T9}&d!Qv zzk+Mqw#F?A@35M?GAzhcg+98#twmH_dwbhy`R5dVo{L z^2WNdvx*y4XHWNfuilNSSWAx0(^y-)6yCy1svC6);gshz%jXoRik==g0BURBqKX!* zUAt=doU|6Md0U!O+qX1#^>((eUEA5wqIZpfv23k%x@yEJ>2x+jQ=NZaD=M1%%+ty;x4>fP?m7~b&O&bX2sZ~R z@RG8yufET}xnB8up%lAJ?y{tFX#YJ{WujlMDl4ilZB+SfZR{k0-d<9%dbAm<>Psy~ zX?{gXW6^SU=TW^C0*$H-mkB&h=-|Dl4eedu+N!$)x`{q^TF-0Tgno(K`czp}eQ|9? zasJ9;g~+n|oHk>&}H&8APRN7m*8&zj z$AY;Q%(EaDUB8p9w94<}VOrZJ6;V{YvaGOJ4n9_TC9-PO=2-o~vb}z@zmHAU)8@w; z_<#+qog1v`8FgIy+q-%ie4eWsscP}zm*r2+$^mnSF^Hz1Vp%J8yb6O9I!Gp*;$k{8Z(6(J2 z{jI96y}!M0Q+peRYzbvbQFOQ0nyqnjI2ceY1=np|A7Ju)%F(r>XQUM~8~ad|>vi{1 zoAtoY^BhilJmAsO;lBMpx;Ezh0`DijdeI6cSqjyr&y~`7GE`-I7e5LOI#PMMP#i^1 zKj8cNJ7EU*IBj8%(-!tPZFTo|tnY4b^S0vtLm!)&dY`5D+3ZWLXo|*+M)o5f)Hph@ z$H9U9JXN>4uD%#o4;AH>6@l^7I=0ba`4y=iUm3vJuB+J^3eiga8$11KWMI>$eccLy zYmxaf&Fr%D?QL!CZK*kpxv4m2 zy766Z9|rG!96Lyqo1K+)wl{TMZ(n(MQskj$eyuN$m{P{@O-IJ<~Pi@C|)o(Fcd%7^hBHRUixK>N;Z0}z0_btw_ zqT9E$wp(`}px15eZsl>D+TX5`D%zU;&B1g}SBF1!9fq#<)ZQM{&2TM@3~l;414g1p62LEajx{5^gBv;J?WQfq zlqEL&q@y6hwF5D5{MWy=%ir7r^!Hil3xry5n5ChQrePpS>u>98O+zp9t28!x+WBeo zax$}p*h(S`!aX_;3Nq7jB(9ZlAOeceIkX0g)7IXyaXqfxar2O7g_|)g3X_W zt-)k74vqEgVwxrKRZb@#UWi7XiqhEA+i?m>Lr+R;_WS!fS~mJeYtj8y>ghj$R0y$+ z0uOp}PD^AxiNac9B8Mi{ztiQYgFh_E&0BdsH_*R-C&xBFJ>TG`O?XV8e_re{k!AQ7 zRgHHlptwdhWwP zy&A+Y$+;`~qn@KnIui6v~T3M3)!yX@<+Y4PoXV_`Qqy2=tc|_yyuF z03%o*)*w+wz+nCH*k!(~zpJqY(jch5NW%JJfyNJtyEQ0GxrSuCvB0!|z%QWVJ75Io z`wHFzc#$FV#WG^U`QC?cAPs`51r1rsfcye+cY_YrcdFf5PmKDoq|&gyClC&#K~UWT zeJJwqFA(<_IKlc-)+sdr9`%jK7O0n(5e}q5P<;x0T$ecT3&gzuMzFs7ppW%ReVpkY z(Dx?7Op}3)zeg~h_OW5*$2e~93kKw77GhmTks$=+P9TiF*Bgl1138#D{G%Ly4g>;W z($7Qg2m|s96p7DtgUj(S%FzTFmSYOGKsi|F$ana6LlNfB1Z5Bi5`(&t8d#>(ek6OJii^Rq}gZ1%Smk+@U`~vy{bO3|-c6H**0H0`%DlzF`OGpRjNZPJ_%Z})_q2GP2ZQ6^2%?#u=fU9kop>4=pc&66^8p%DXjBTu zrT`rX5lxKhj34X-qw01?vwQ@N_&!mXV*SM}}aUNA}3i)JJA8JyGY+{%HN! z<41m`J_3Sij?5!J6R9&nvQM&)(C7LBgrgDWSWCJL7zf%XbRCeh<=cd&?}osScAOg^ zfTVdI{u|`^#)tZLoECo#=*Q7Nb^#fG+iCF+3eEZ-i~2qUWSGiHbNu8?NM37^{uOW% zXr9MO{|;CIn%8usIZpXNh8T(XY9i#$^{Dds=tuf%{thAQ;JMoZR>d6}aOSlDFH6$G;5& zB#(3Yj`0h9ArXWB4&pfLy?j`THU1IbCO-`mREg+H?-SGUh8hhLh6}T6(2mrr*MCRH z+Cv(0dx?;{Q|P+|?-M*I_%IRr4-uiqj&ULkCx<8^247Br4a=~`56b0%rd$yb`b&w( zkNtt`e7cCa=*z@;)-|KeYxQkg65AhqAkTM19{aWg^mk$+W(o=)s&zd36y@>-O9iV1 z>jj$y*9rCuo-cTb;I)E#1n&?$Ajoq*^LtJ34}$Ls4hkL@{8;dFL7QQvcL_!a>h&w3 zcZ$$)f~kVqPYL4Z3w@?wv0#PZDnad^1o9n1_Xutj^$1TPZ2Qt(E>?+S9d8RZ`p{Dt7lf^Q1`Merj*ez3`OV+5xNCJAN=YQG_n z)9Z->R|vmZuuE{O;AMi>3*IXD1HnfGe=hi<;O_)a2!0_LigAHU44Sv1oe0Z zzV^cm{GRZCD0o=#1;N(^wSS5v%+VEE`=tOK!SM+=RgfPkk)9)1AXqK9RQjeXHO-fM<|rjei?vw2(A4ogMLEj7X*JV zsQoP<{u7}cE=$jN!8pNmL4FL#e98q^3*IDn8_|LFA%#9fj1xZyNT>ZDfPO*ZUz7MZ zg??Y?zX?4g^cOY{0JUFbp!TDT^RV>&p&NugTWFuqT|!?dc(vfSCH@wnzbCZzD*$`6 zKLOXM^^nm2koZ$Ve<`%~8^ChmqMFwyiA2zgiMW0#6uLrC`vZX7 z2B9w|g4TWjknSd-Z1g{k2cdbmvr38pvj(~W#;6cHM1%E1dSn!vEzY_d!!QTqre21B=k=NpA>vX@I}F23%)M+2f;rJ>g!bK zJ0Y~bUIqQR(0CxC?QjXY1;-0c6r3)YAjt2MY5!coC4vQlT=awSRf6XTwg`3z>g!#| zZ5R4-!D|KebuZ$-Cp14dr``tz_4P04=Y-bRzo1_gT3-i)=KNr$`&7`dTeL%PieRi@ zlHe@CC4vQlWrCH0D+PJq&3u{#+XXuXIp3P`mkC}exJ&Q`!F_^v2p$l8NbpfXeLW6+ zoDxpGoUu!MOHf~zgFYoRXD>6Jvm=RiLAPL};3UBqL4DnhaI(-`B!}s<1s4i(6$!4C!bojmPy3hMg?(Bp)jEXZXPD3>HSOE5z)M{tp#eqI83{hS2I z_g74>?=yf+La!IxAgJ#<5P!bV*9m@0@D{;+f(Ha25`0wfaY21w0)0n>J}UT%;JbqF z3;sj!LqQwwE0EqPI6-iVAV02We5&9a!TEyx*q-qff^~wc1kVv{5$q7u_eDtO7kZ1J zzE1+5>x)qDw*Q;j3-Y^v%4G>I5L_ZyEXbu8C|4t>{oR3HBXpzSI>B=VxsCwS zT_kv!;FW@0IfL;x3hou$FZg}Idj+`;0p))t_>AClf-eicD)S@UT~IRsvwsep?t1jo?ww+xnQ**S4N z!-S%rnMk?boh0ZLOcp%-egJHpA5L2u(JeIMc1dGEPmIuB!9>A;-qY_laO@yGo0~RWB0X<2HMY_StarvRlf>`tpxs z83K5)uq0C6-VGhNdODGJ$qnUGeDS9SvZgd0I$^+H&)WmE(LDOfG2-CMS8Clh=#CuL z?G@dZF597XV|^p7+YX6j?VV(y55AjDynBi3qk##|j|Mj33Ok{{=|f-P@d5M0riD81 zqnFI`Z7PQ^k0E>YcMBqpVm*@Np_kW}_f^1u1?pvJprxa?v>i3$@T#{vE4r7xHT3*D zwL{*+on;Gr^+Vo_bB4V8mk)XKYV2ceKlOIJd(bq;7bZYsVR@jQ(Ddj%9Zg9`~Br&EG#}+56jL6Uru(hEyF~%F=B6=&=L& zCGjQWOAju6D~68!|Oiwp)bG09lx$(ed+$CyM$_~Xb07JEWf0wycNZK;Dg71{gI^! zI2N{jRPaE4$)N9?(j!Y39kcB|8*vQ}zP8kMOT2HguN3h!5x=^W9JHKwsxH-Z@K%5~ z1u0$_av!ckDz8rUCa5XCai<2V&ph?^flObeP8rO7^}u<)vafKTJ5a27>~E8OCp*SM z15=%O>hOX2rTHbypS^IZFYDa#!*P!s$kuU`Jn-HN@L@H%q_!lXgf?ZtrfYT`SxTQb ze|m@(v42}SuQ@Ootzz3f8>MEv?H0ycaTgy*`WkLO$};6^`0G)cXz-cVc1z=X&hm+< z<(K|^!e`fBUS_|SUt(zQH4}9EbA08y&%@Ymz?O(M_5m}naqb20YX^YI*mzHW5Zeuq zIf88n+w(|2gpHoX-Wq!PFt&r(_G8+q0!0KSPJefPlOp~%Bao8KDRe|Tc`<;}lno>(=p(%zEaGO=P}+4h#FTG;0g z4`o0{4$|f#?V^FDZI`$GqRrlZcqs31e*56-tKK;$DkAKdl+B-Q_5 z=Yvyy;SYLC;JN73ghCbXE!i=Y?#&y@S!iI)i+tR&W$2N-AMSd;N$v0@{V?{2Q9s<^ z%YLxQM^8K(d>JKiNPP#q`q<+y9cqcZbg0>ze=;({8#ig@U}r|jQ$wz|?I$7~?=-J( z-nG;$Plj}Ii4EF^9uE|5=#gB}KkbJTe(3(;y~FzN75#sLe#fwWZ(PAiZ^Yzb{q2+9 zX<6U$744jspnrwF$VcqH*L+jf>exBIm`5A#*O%$9F%tf6lp zysN```!Vz*;+qn#ML!}Pzc^`8>FcS2aK+2Pc z%P2k9jfh9BI?QLQZfwEGFkTO6UI3Yf{NT8No(S-%FQA9~K%5^BYo{ZBZu4+#Jc2kr z_w2)V4mLbS)>}GoJT^Y##pR|hC(8=+^@b|Y^FmMse9WYv?rS$>p~kFPkzZTyE$-_( zd+M6(IbC1Z4h!Jf2p@5Dw0X6x{-h;r>Y9wMk@T2!aduMw;>AmJSuCC8eZ4v>KB?_& zFTRhcYwujF-7W=eS=HBV*;3Te-`vvK?p;=&ztkI;{q1er*zWcBc=3^p7hl7!>+ERt zi!o9brVk`7F0QGqu4FcP7Pq!P<1`yl?zvs~^eIrf4*#%ymSWM%@~o*n+gnR5jTL28 z#f^pa75aO%>XMS=j4c_3v%HJFmUF0}dJR-wLG#8oeo~m6)HW-{Thi0l+V1V}dz<^c z@)0j1PP2_^;Cm{?TfM2jPX~%RHVrfK+s>s|tOg_svJum1S~ue3T};o%=aMPdbe&n$xFQ}Oc_v}2ZgySKmH@5eVX-WKMI&t}@aj2*4t>m8|uqKb+}DSXCo;e%`$ zEn69o&G|Z6ZAbn(%-R3!6tz44MVZMMa&5VO%?UA?*yYeqXIvrY zBR^R~97~ngAgS4d0nVJA0%?=47|prG4Avl-nZJs`Js9cCf({1rnS2@V_#Aep{Wrjn zcd&E4h@A>eLV@f%4O$)MwEqndp27ri*qOCMTIV7N4SupQ9@5&Ix;=+|6g-k#?KA0UYICjhZvum8@9zTQJ3R-wr)?H=lnx+#e(Cbmt&8#C;5U zT<#liG6{80f^lK)4KO;~y$*WZ?&l#n#(gcq5$@ZN*5m#zQbpnh26MgKAK?r)&bu+J28uV)y$7~Ua;HGUWcN03rnq_SHr351h%xT9Xpd=b&SZ>r z_d)Y?cNR`bhq1OFGXA-8$HDd|l{*G)bws(ZM^4Ww_d2LQs@%6g+sn#*7vMGJz6?41 zPPwlbsi5vdkWlVjP;iOOy$7(}?%ogB z;c_oQ%+5%631FAkT?N>GSh-gM4-Xh_p5Oy~E%i}5(aAzq zXd*Id8L|mksf~<^dY&<>G%+dq02Qn@*hYpC5)=Jx+HjW8&Y0+HDZEB#M@;lQ*6CWI z?J?1Ibk>lwg*IcN?`1unBeX3h`WE!fkVcEPshFs>w4}+n9r?wo(D$jm#VAIJ$DKfo zJ!HMH5hZr>C4_R%)3q}fVVip~_NKdtRp{2Mw7Y8&cDjFweTWKuop$sZ^N@JlcnXE| z8GN(i=4%7xUXEzPeLEOvlkd}pO$J}kjDG>`7ZtMA_zT3M?g0^UzP3O`J;>U;Kr69F z-OiW`HQ|a%MgIt~7DaYP&0z&ztP2^G~tP!gp5N5bWv@FCo-B7)kCbcjBQ3l zWb|%kuwCNEL`L7t%D7Z$cVu)gmF*BZJTm%5($-qWHX|%D`f?Wea)}R(jOK&RkSm0C zMMh6&Q|=TxBr^Iu^udrTg?2_pH?tU53GIlCzJm5$Ewnu{+C}@W5!#H5{($*iYtbey z_d~g|ZOC;7Fa9H{5uW7oEJGPQC(*TC`XE=H+hMe8EDw0Q=OI+0YaGKak9O%Wo?*8q z0?qG=VmQ(h%5XHpQOZ0Bi(L~|K&R9G5v+^&F}1l82AB(Xu0&?2Jh@DjM2;Pz^cxxx zLzXM~UW7gDbgo%csyu}#g=;q16uq3HJ>dIX8GOL+;T?!8(-NJ93Up;LZ1?eT;x3Vm6s{6Y+EuG(1=B7i*{00- zEKlj%u*PZUjJ+}Be?;S6L;%e95T0oFL{`9fcOI-zZoWY>-1>d0`z+XKx_#i=-M!d5 z+*`1By7|^8#Jv+?mwPk9p>8g+ALfolI9!e41;rXxhvY)-5i6lLGV~(8knpTSMxht8 zew3#Ld4z6b*ggpt`6_gPVVCE1j6tE7FpM+PJaod)?afFVz8T%Z9(pw=yt)4hwsMCc zXt>`(-Zm9Ji;6;T<$DS@Cx0vVAZoHn+{a(4t(5jK{k5HXnw-;R~ z&iyCk8SkEe-jU#rMmWR$FswU_O4x~Hp)XJ?x&7;Tb&A<3{#j z(-`(D^ACs)i#>pRop!!IiLj#>{xC1+is>p1i?gcqPpJQ}cwMEQP!udI!K%`!Fh49& zSE=XwsFkoJh9f+nR_zBF`o6PtguYvRLC3@Nz zK7-*T&yy^53d1uz>Ex#}Jkv9g;WUPmJ+oP3=?u^E&|5%Q2E(&Gd|?!p$?zGTzcZZ0 zaEj+06fP{A;Z#o&>OL%o;WW?dtkpRTr+YY=E^O{o2xoYltkrp}u^i8rv?rGhRpcpQ zx#k~*OsVH7+OvS+3J)g+hAm{c#*@l2;(Y@T=kG#8*kXnoJRxkgC2XCwo@mzRnG831 z23eLohTA+h(dK-HeV&`yf(3s^xYKhrbrv$*t4zMF4lC+~xlTLZU`1>PzbUMQv*J8| zqa{m!h@kRt`d(P+vk2QgKW6S_47)sss9+h7Ew_iym%_>!j`YlD%U00ZD9>72Uil}; zPxA0;C#)(Yf-OiFNnzD9u=jd6{VS}7;Y81w=;&d~sVCVpm-*J_fuG`emiE*!ZH8wh zOIJ_%91o}Hg{@#X*YgtdUCFeIJY0u3Y!yeBJkNh&Pzr0HJw={ohF6~j`BG0Q<YYkI-2@m$S(*OFiFd7Cn4Gu+^zC!w%&7+$MFST%Y`ak1G^g{-y^T`@0$4vaRB zf~$uhR>3Iwml(rt&O%u+?A$K0^bR`z5=hMgo+g9nG2m+DtfP@=#H28WnpjdRh7@8- zzzAVEE$%xOw+RgMH>~5vOAvJ0H=zz9I1kPp*1^kZ&wXs{b2lNVJmoMeYy*#UyT`}w z)yZxR_e!ftbUmdtT!H=MRp^w)9OHhZGA5#Fr@RU^#$1EOOnCtk#yle$rJl;qd5wjd zKlPSKgcs>VQ+dud7HhtW;rv}=slgGQKTgvz_Esa$X}pUtN{tt-2o?Jfn$4)t$(Df^ z%Yo9U)bwpgJsr|ut+}3!DA@)Q(97M z@chBaYOx#uj5;m93#P=fhKv;ktB4Ogz5hVMbuiR{NQ~{z!kif7gH+1cZzKcb-vck< zb?o@{L1G{_=_EK@IWXy82yjAEQW)xS9Ey&CZ3cD=k$9$o_4mn9$roaG6`mi|X?CrV zi8v!eCBG*84Z-{@m3$KXA3%Par3O9*)Qmis_N{>01`v2}icB)SX)Q6h2+%i|&od^AD)^kV#M+MQS_?d8Z;KzQsrO{#P zcT+RsQNm;$jly1|6Xk*h(K0KMu_!1F--oDKyz_^^xnCo2m;y6uu)kEt4(G-OP;q{z_Rt1RxZ(JA;=M$Nj-iZd~a2U*Uy zHEPxYD{iumLxBf$il;4ZdVtF}I%?MI7PmOS+cqKO@PZrQM1C(g<$1o%^fbY zWzP&NZujUo%N{-VZ>xGl$JOcfskNQY7I&C@m!xL3F!fgTvX-z~5OI9Rgu1cfj_EjX z`PNCz()0edsxJaut2B38vg2{MXzjW*Gkyf_i~#F-q*gNygEc?E((N<*Ik1ANa)@#& zvJpbu^uvNFd`@-&hMO}ua-?j+(PT`b7#|@Sdv5_VRSzfn%E+imkaO5*;R7wL! zmO{#BX!(#Rob)+?%P8VFxe^CvI*(aHUleZ!X(=ex3hFZS$WX?CfwT8!Ahr4wS@Ov7 zj9du#|71^5+qk(Ly`6a%|>PtPBpc z#`(NQISDcoA5y4eI7ny2Bd`OiS#dn>YH%E?85}on&|HhI0ez>?7$jz|1Wj3lRmum* z(zpj9v2;yzpjPgsr4EeZRy7<5w)6p7Isq$kCRjLG@@$OOfpo z&9yA80$nBaMp#-8I$&wm^B|13vD4oo8+-4Epw)iw(9%ZamyW4A%J}1p*bk7LfCI<) z6Upy_v?}>Mn*I_OOcm%^n&LvP49%b<} zFeHRew)o@GAmLMVcn-e~bL;!pIZ06Mo^S|S<~&O7Lr(&u5&ipZXVA_`aXF9 zs9ZJY9NKz39mM=j_SEslDuk`k_6&}o^S7Y48L>w9Y3!r0*qCKpHk!R)E%J)ccW^vO zj9i?!o#^SS<02v-WCfprPofAf~ z7-3Ef_VY3c5c{x}fn6MK3D}1nNo*hqIM&I7*UogfnBr zb;`^j|0~JCZd7Jj1e~<6E@xX5#%s%+O3H9i-~(k;K~kk4XeC;Q#fNkS35iMD!z4`0 z2#N)niCn}-Ox9O3__pP~CVM1J3<{MKM4|=fjF6Tem$||icI-0G@{f}nheKz6a3sxL z5S%T2yRh&JhnZ+Mi?wK&h4Rw_jQ(*9$LipOG#y+)$g#MDL=OIH1!0B`))4e1^vL4( z9P{}M9IL2@;n?JNIEJbtOu}Zvi<4`B`n`;*Bm4v#R$r$t)u*i>;W-_wBm5ehP5ISp zz&~1S!uy)N$;~fZc&i2-VHmkM(mJtBOX$C*?BmM-UJxLPz;9My3!zj8mlJqx00BaS z4%QLYVxzIQ1MjieDJbkbY-E=LtFa+rEntnXyMdc^*sr+q0H4%BgxB-@@EE}%0G}=* z7zN;G5(pjy9MZv+geR~u7gVGEor~i2>LS+j8mdN1@|2{1ox`zprHJ9fHk2|D%XB-e zwEL0wDQ!kQRWMVyCRw zRvTv!tv=Hb=rc^oPLqty1`(pwff}Gg|9B=S!e&!*_LTrzwDC2RWDAfT5aoTvT5Jvl zpLM(43^rkNkvt0=7b#YcTR8Q*?Q3`20~Hpow3x+YJ?+94Vlj8SNbp846pZs7`>2i; z$ajpxG9>0=8?B!lzPog*KpG>RD22Es)L@ z=*5QiBwV0_%fAKC7b~is@LP-9jb^zR8)OOmk{>QWf*LM;q~Yp=8ZJGk;nLZ8tRDN7 z4)lLMhD<@VbAbk!#h$=kfMB2p1oNX?86g6D%GJaXLvLChMe>Mqm*(6f;PRO>3DAE#L=q5OHHd79j(hN(oKaMk{5SmDqy(Sm0_(Si`NA2v(Vv8XhV@{jW7s z!D*T;)+o(Ozp9yL!Da$)8%Emjfsu-!K%^F^B~Zvz{cr0)K)QCg+RzO| z-EiTGz#^MD2YwuR_&a5Ru73ubgbpAx2>$&~(rrUtHh5#k{u|c~|IS?mSEc>`vg-!@ zg~9*aVMB9oN7}Gog^s@Sx-DwhXT$oou4b@sUC7TFghIa=7SQ<*3kU^)z`E%FxsL}- zyBqfEpfelx`GC`@K2FSM;p1UU8r>&Edd=Q6Gs2q@r)=;bpcnslE;fH|c+Dp-UUb$R z%}sMIPETLGJU%u)c5&SF#p!X=%gfCT-qohtau#sjb~ABNa4Z}#EUw%fmmXJT?%S3Y zS7yG8uR^GQo!*xf#%83NpiDdL*z~xHxVXx~CFO~kXH>*xo{^C~yAuEOinue+jE_w)-@15I=H=!`${Uw%dbK|V z^OqMdW2WWY*)pTet;@`3aMc6KJSljt<@&&{p`KBzb^OL%gtNG_yi+iw-7sj99wZF2 zaXVonclUF5fV=(NjR=jT{?@;XFk61YC^O7VKMrkn1xbok1!a3e4ryp3>X5svMvh{PF482#*?b z&xlQoTWoU$$=_#uoqW#JOf5f6%ZCQZziYrPMe_7%3F%W4<7`-m&}h^XK8q^z;aZ}q zq-<#;Tr1RJjcM#R_V=pZ!sgD-mgZKhT5nAaEvcwpMbY}&>WW6S6bEOaFIzB2aE>6B zX4diZRA73jYQ$XB#-+?IzbL;3>*!;-c(N?z)isT(2rKUQSxbj&IZi{ZueFx@R~0pl z#SQhvRdr?6RgGn}%ef5s@YL#IqIL_W@s{@VY*00)l@5!Fm#nBNgmaCmM)+Xhg7U>3 z>wW&=q(xoLb?x14s?OijTL5l&~hpAa5dD|mlSeExgP8kGF;m1_qF#G zchfXhV>P@&z#vvu!HT-o!A?20)E5mm6AjC3EG*5hsw%F?(K(fL_H35*=1>Ytqpq~2 z?f$aL+TpU7b^B#%vFfeCLcpp9&Jg-K{96^BUKHn7sroI2JzXPR0&Cn?ZtUzRz#76E zv|+lo>+19C>FFZBXtgTHUxB5l>#^85YNFk$HQk`~jU`fdBc4Etw{-XmkzYq^bEg)~ z7+sDc_*l~X;qqnb^3|Zh>Q*w?tqT2}TPk`sTOH5e`M-x8@@w;T z&x322{}Z1m`77$H_2^Yxm0y60W5rUX9)GObU?;@@Xbpto<)kdD(6R@I1doN&R(lM% zR$-M^my7d;LRHey-B#SG`-1+YKq9{CVg=PiCkhf@W{pWDJsSglAj(xWmb>R+*NL$S zjwZVMEr$<5cC2dd>sIXkjoK4Q{T4_Tce4{HcGX&|Z^^;iq7UstAAK*-EkPOFSXg3N zjq`NHTjR5C`-0I z_4$OgTCkPtl1r0lUm2Nm;aH`H%~z{CfegsQ#}ynPwEJtfuM3r>e(V zf>d!>(%Dq^ew}$dYv@y&lAZ^z4(zhJQw*O=;etplt^B{(dl&dBinD)w_nebWLJ|lh zN`N5egaF|dk`V3}b3IAO)g&M)ZEggT7)VHh2BaDV6&01LRjSsaSnFN9)S}fI6UO4uX7iO4a!;W-rLYc!h(lSUKH@Ag|J%sRi90%wpxKU+wCM9rk5w8tgc{ zMb%>HR10NZ9+<_c@^*}8l7%BTJNH z`d{NXt;kA&*&^+ngpMZ|8SHzZ6-26;y;hBO9O$Y!hc;Uq;`Xn_{nUBdQJ|((-Qq|q zv#mPE_rUOM-31UKHs`UOOEbhg#+v2xcpbI}J9XBa6JtBtU5&payQ)wPnOr^OHsR2@ zCUukJ(2M>n!;P7jknEdfTw^mK64fgD4|2I0zQ%3tY{PL z1UZlQL`(s&&9S;1rw!S~kyE1X3%oIEbTlVEI1H|%qYjf3ELR)V>3$sPvEI|F)^%26 zd{e9%lT)<3J8+tqY6L-Z(2)7DJ>Pc@jAqKMdf<4giVBTMo&F@9R+g!1>1Q25=9m=8 zqAoknyd4*1RHfHc1UsOK4x? zY`>;*X~>yU_Ut&Xs7g(b9Vdwe-4J9l%%x$vR<(q~nHhf`8i_gmppE0BJ!Me0GBZ)~l0ni5V_QVEcTDMJKWRZ)3mQT1sx>`@qQF`2ON(Th69(x|K&5cP#xs zdEtF8xBLx!mKR?c4S1$j?%>&8$GauIipuGK=9d=l;Nfe+?7`-_TZs<$TIHUw(XdYb zxx`g=In5&eA~^YZ?l zj`@x{WXw)c;5n&vxR~?tXzHwt=`(OPn0f42$hs=X*<8|CPJxzfxmZV*@su+2OtI#F z%QMMFp)KGgH{V4mlPPF{`6^Y@d~hHiUVJMP%11w%3Ap&`_uKf`wnO8!Ubn)_etA0u zc6^)|FsI{l6a*Xx7rx--#rPKEa>^?~KRg0A%UCaiPl1C|-t03ptru>T$1w`R|hw_M)ye+Uh<+VdzE!-?)$=eJEr#v2dmH;=(W$obnPJ@;HuJ@}7d-DK8CQYdXgqOWr==v)V<;H}J9SDbM0-0$&$s z%UJTFz~tn6^Beg1X@--J-xmxdFHQI|B%$yBc-g9H|nV!`N;BU#R3*mE5z{hTEcw#I*ZdG%}o6?GH z5-1zS%a0v#E*_FW63)& zL|z&yqZUk*$1%l{_k$35jgYr73=Co{dEXC_w-xf(-zX1i-)(s}i#)3@elQ(h7RHG% z0Oj$zJB06+0_b84u-SY+10SlX-SUb<;X$NrD2wJfk!MmUWAMFb5kTgb<{9ug%emK4 zE=lmW$^{>EGhW-o7irpSR%CFstVF91k=cU*j5}J#!_JSyC@&Tl<8;dF!k0l?91fN| zumu^XI~3jh)9HzKsZJ8|ohe~_jtIcXGu=3*1dK=NJbKX%X8I@E!NlJxJi8Q42|QCR zSe~KeU1LY!=s0lW8EL`%5sH6`&Ci}1Fgyb-n17Jsw?9!-Bd(J_I)pzugg;oC8(YbO zT?Pk)!RAJ23?&XTM14j^2lKuh?8|NN!7i-%fZ-Wz!TxMz0po`BV1ItC7BFsTsS5UY zbS$vBgJ!3s9RsHF=g1T=JfqEN+$vWA7q{x!PI`=rKaeZ-n1FGsPbHnSH$cGV#w;Zn z$X3g_1kYqU*}*}%l_B)%5c;AJ`lb+?n_)|Lp(HPbNk=O*FDu#VmqtG)uKFq0mpogd_n{?}wFthG+&>%SiP7pp0F zg+6YzxCeTPXZc}4?p&JL4?jcKuk?z~}k>9L;yJ{hWhd==Sq9 zAL93OMoP`sPy_kM*C+kFf?rqk^A36i(9bvM33-2Cyd&%9h(z*vc|Ug)=Ya0k%eH<2 zP(=8^rk}HOEx!a$C)+yk+!F;r!fEbjnX%}Jap#R-OEFd^GuZZBs4M}t1M(!bw!9D?E0>&94{Nn`^h?wNQhl{UQ$FVyj3-7g zPH==ERXNdroS-^e6EvT@(4E^Mh>HX(1l8F|aOeIU`g2DQu}M&!odmi|XwFUO-y?XD z;1>WI=d6@KN9+O!Dj{4xCVbUo&i4+cQu}Y=9XZ}JxOr7V3wd?uvD;GQ0z5FA%&^@CSl72;L%iui!5PpB3CI z_>SOT1-}xE#DL25j1ZhC$bI~DFA}6qP14PR>jW zcW}5VU!A!Fdc4pXf(r$U1(yl(879-E&d>p>vvYt~i~ElS9}xVd;PZm7392)35Kf(i z15{_=0I33s@`njhD;eoYf-?nk1j__Z7hECOA$YFf<$~&L8pu;;(E!z1G{EP?|208R zq#5rZ!B|0ch79-{u{!H*m!QTkJA^5)FCxZVFjKmIdhCe~jCpcAbj$ppv zDT3;3QG{z2dadC3f|m>aQ1B;$_X|EQNCjJrf3M)%f>Z=X_rD8cwcdSXr5)q%$I1Nk^dZPHxB>J#BS7_=%rJPp59>L3r;JaFAYGNhd zlY)B%-zOqH9}~fUMBHOB;U`VKiVQba=!rt-3B5?@MxoCX`dpzm34M*w*9*N<=!b>= zmC)1$&G_CC`U9cA7TSZyw)BrDB7Gx;o+Nad&{;zJgp)G9|+wi^w&ZU#^YnAFP@0>`h=b!bf(aAg{IyW^4Am5o?8Vwh#33M7y1gp z8wGD6qL1A#^e>3xu)Y-fd7*zR^qYcz688^@2!B*CA|5p2A527B7%lV!BIHgHdX8YO zxEBgtDfFpA*9pCX2zhOS7YhDB@F#)~5E1__BGUA0p3oaufTs;ww_}2)14iR#CguYbhD~0}{&^HNvyU_Ov{gmKK zg8KyjB>1V|*Md;UqtX#CI7V=upkJ_xxCHZDp<9THF;5fvd}1~3!$RLF_=Mogf*%NC zxvbhNrr!#2J5z{ZN+H-3@|mz|*McY-MNbh-6U3t-<&H-t3Kt2M2_mV={WQT^!R3Oj zg6)Fp`9PSd{ekgcAnq3lUM~23LG`= zd|&V*!NY=I2p$!5>1KWnLG>I0=^HAvdJX}4w9v_d)X2d6@*O`hQ*fRj-__H-K(JV_ zO7K*{?+U8t6X0(adX=DhJ^}Y`q4}{E_k=#LxQ^mdj)q3z96WcYe3#>LMz>kpx+kyeZh|e4-0-FsGfI# z-^J$$KtoVH?*KhaXdVGT|Iva}Rz!NDV7lN8L8>XGKeZ4M%LUc*5YVR!{awLE!DhjB z!7jmb1kV$^LhvfV9}50R@K!;k{Som|=PA?i3&E!ae=Yc1!QTl|H7fZJ3aaPjpw;to z;6KD&hn;-Xph`SZP(6o%JxOTlW~cu&!I^?{1#<-p1eXvo-#A^cPOwpsnjq3`bRp#GeS>Ex1!qJ^z8fI-?m# zU5n)ZoghGSjm7*&?mw97tNEmth;mLL!ZVGCbk8OtJPqp=%|Rg^kEn21HY!x|5FXPl zB}d7HVuf+`-!Rr3SjJu+@>WqZT?mI~jQ9`zmu;pekH5WbZNeihGT^Ls$1 zYd+fTwiY6|a=r}`g z4>J@}5Ox3U}oHtDO^$6gaRRVsTt&IY%83#~a-u;QSmKOlt1lkqaB@KLa9;Z&Wk zhnK_Z3QvOF9nL$bC%g^+Vd3lG{xJ?=Iso)6_#yryJn!H?atr=G!8PbQ{4q(l0iyUp zV0+jDoO?v`#Z%aWoNj2*Kc)R4+C9;nkcIt>_K0Y{Gzoi{_UPyuy8oQ^*yu|TC~Oz) z@zJx;X~G_%GPHzfz7z?2bQ}H?qi56p3-WlQpJUj^$deq+iE-HDbWe%qARhKh+NVTw zVj1?t&tXrCK7%~HbkB_b2Q&I4?X#mt(f$;9=12dX{7+M6R`f6NAGZ5VgvyIvLHjeb z7vii4*ndTPNi=W3VZWxmLY-+9_AKqy(GOA1bF?pw=HxK!dD@pn-^#Er&|VwOm&;)< z(!M&q+FP|qRvMFO7I}n+rK}v8M&&q&wSpRIv3yukrjM$o2+tt2>{G`7PfwMR@ukFXngn(=jxmbdi4j#;@Tu_$qMe>WB}$V#q^q(T6aoMo0+XR9b|IXQ0Z|DHy`X4s;*Q%un5dGa zik>K2^=r7L9X7&JF&i0B6FbOMG8<*9dsS*!qXVj3so6EgsjxFhVJY4L*(ymBpjSVj zKvaEE5Fn{-bf~HRbeO{x!sDE3M5zrl-qbN_-mh2~GSbk->Twz;Js%a|QkpxDt2oR2 zS1QiB>N-|7c6Cm}jdhx7uj%MI)3VM^pEILwKuu^3t2&#})UEsRF)1P=v#ECs-M|Xj z#2OtyX&A<`1{@z*)39o~sfP?r8kLF$AET#3*VD9VK4sj{$>olMb||GG%EEuGDJqEn ztW?NJhCE1s?x=D2TtwFg-1|9q*)k|1ItGlyX&AM1Y~P-z51)M z^0I7M{o3Z%|h}oz3{V%hYaB-PF;D?T4+)OB&B=#7=$L&2MQ4 zu(_)mTFRQ*{$d8sF6CY5SniE9jfVF8duM#Ih3Xk;-9HOZ*)g+l= z@y%3KYu#Cm@|l=?6*bVlOQsMiSFD68JuxJdIvZ1%xd&8IVLDYd)-AWwCuu<$s9d$R znmS&Bm0+0REY(O#T})L~Q4N(<+55*$o}h@3k!qzjM9R}D?Yzdbnj0D`+gclg6zZ4~ zn0sewFl7UjhP_)^=@1!62Zt$+pYB<8LB&9J{b29Ab33ZZ&7x6SV*>fNBWlLRY%1?i zo10B`?m9;VN_9dIANM+<6_{E|V1asub<$XZ_)Iorxw7tTJDHOG;HXZ89+O6uv_MKF zFUrdfEsm7wD0`(2!K^d8xlmidz&pQ1hefag0HrHNWnO)~haK}ZHNj~_oOUuK6AsM{ zP~vzDBiyvkjs}i^YH6YN;hR0wY)BzJG@v=lE=W58sIunVsdy?3JbjO@zNX^l`tvwV5u@~N3Mv!~WWy--7ww*xJ-v$<_G0?nSDk?|ex z)D`U=jqM$64UL_hIC*#Ks)qKp3os~R>*CZ^(?NGNL8Xm%>Pqj_@(l0P&aUMPR<2$< zXAT0cZkww1G*4|@y>?Zn>Cn)&Y89kUU9k%CuxWj2YvbybT}=zpOz+0-hQ{_T#7}nX zXymD#_)t>ZmP0|7lWtqp+%x4~{j*-jM1%8; zoB{U5YN?&;R&~|Y1G_p*Y_e?sa-XW|v`V{++C_RSdo`gaZuLs2RB{C9@6y@~bvCl~ z6A95$*#e*@O-n@+OohUuj^_HcRLta%qUzI;*>ACqfdaHctYcK&i^o{P=?PjBE?R44-?Y^K)k+DGfDC>z5-lU8er9y zf~d6;;qc3a-6?N3=BR1NB;~OTEO}LqFt959)E-9!mbEd2?=eh!ybK`5;;RGgjQ0o% z9*;{@ymYtX?S|b71FQBXwI429j%JhWQKdjW2ivEm{+ic8xKA&23B zM_FoRNO`Ou#_5#z5DG5M;b6%FTaauZILXAlWvmyL3C9BNtvZPwV#qzmB7mez zL+IKN`gp`~`l%55Pa$-aqs=pZdzol$O)_T~)+)xD z+}n#I=cW(bR@F=-#EsMK5U1dIYkyD2f}+2tIqB^0ZchpaWUwavA>lY@4{@^P$kME< z)m)XEC1Lvxu!{!;5VY(H5sXE|Kugg6TmwymL%5tPz7VeglRa>1LpOw(vvB7cF+{dw zEfnGtx&#aHcCH#YX%F#6=)ih0#Lr$74diZDM~Ej|SijX)f1Uvrogqv}*}r0X2wjHn zV|EeaWgiRfCB39^)7eeL1H@;Em3c-% z6Z(MYm3=He*~gM(?iuBKtUmfDW8V^S9R4uQxW?oDNyH?N4?npdC7L)9V=-|Op7#+a z0QnnS$5~q}+1^ z)f)kXuNJyaut~5@koN<|bAjOHg1j%#{Wih71$lpV`?@fRc#eIfgwqU8?X@ZS{YXrY1c!}T-1aB5p--AH@BSJqT__841s4zWz zv`^$-TcVC}oERg>`v~cAg6V<_1l9K&@aL-r^8HqDFA?*>_k>p8OTho1LaXm2K##$F zg5f3$s_!E}=L%ge$QcS$x2td!B0te1 z$DUd9A2`u@sdkN=rI z&-Q2fBDUUD|5o4Y_cs*d|9o6e;(EKTysoUisD4pH;ahz#BE*Z|f2L2{`AlDQ&oh0o zz0dT;AGojX?R~A(kM>J&}=}C*I9nmzxn|;`$kEpHd{^u88|Fg8XbkT^W?89ET5MzOHO}U4) z&NxUI+oFvh**>-e?1wt zLy>Ad$(f^u?%YR4qZE>k^kj^z1s>L2BWvS|<5WIfl26^t=aHW2%;%*CHGVetFHIMg zd3fcRg?(dLc%_<^fNNPuh+epbIQ1jh9x{t&l(<{M{F&u5%4QVKTr{C}MeX+5w`LglmzId=-M!&&3NSS*CA! zusI_A5=}q+m5$o?N8GP_+aG_h$=gzgw5IsmA2;jF;?D+ubU*&jz<+ZPf6D!yVm&4L zi3C4;r>hXX^ocFF?=QoJF-O-N>1UVnZ4zWSOqf9Od(|E3PTJ)x!i@Q{d{_7N?y{!8)yJgz}&Mz)-a>w>;XwWC`0 z_QYTKbYE=G(|rj&7$Nlb0)3);4{gX5Qjt*q9NOSxNW%xX+8+up3NMQ&jVOs+6j^N4 z=GShjeX`b7ms{8V7}NVr<%jeSd8=;&+RX-hHL(F-No?qeFF&E|gwhjB-sJ)!8t zMJGDG&1eEAznh2v=W={I5#3WzcTwFlbsl_Ek%n(7GT}EH?y?|>cnKUYf#W4`yabMy z!0{3|UINEU;CKoAZ!LjS@nM%oCC;P!@r{Naj+gL1#tZxHjud0R=u7yH!`+ULJzR;i z;DfEBdj|nrVN@RHo`bjcuJIN0aD~51*0p?>KdYWDp0F#(!w(K!v+*vITQ-&IwTQ3} z@ks!7k*-F3fnB8Y5!BrZANQmw;8tHUx@YFont?do*{9O_XMBX<&S|E#g25MUg*EIN z1oL>R_)5^Y6damy2mZN>lpaf7f=jq3!t*6ClAm)7`V=-TY!R3|VJC9)qVWqPw!;{L zvgkCpRk6!x2-mc=Mla$%%QzXiILEjb_6-L0Vw`I6;!;SAlPK5Ce;)*oJ;D3-&1UXU0GK7sbhCx`2(FOZpV-La( zF{tA%);JM49cn}%FT;#9xWpM1NL#$|8>Hj}V+v%RX#57g!;SYLEy4I2JR=Mbct#q- z!86LJMye8x)4(&@pq`SGjE&$KV^Bv~uV(xatWRnNHAg(9883i(Rx>UH^_*rM-x13JY_~-4w^0_AEQC6iy8CJH zg|+q|MG>Bh@E^4cA-KcVtdD5!;ExSk{R&)Su0!dBwXKC!i&=pjhPAVrJTW~;ao8FL zjEJG;*RT%Su`l*11P<$@vefqs*KvM^Kd$Yria` zh^E@dDMs}f;Es6#2{INl1zODCkSSvc?Rv~z@H9?Usg8+9#*L-4yJO}ftZ_Q+o|t^v z&!9alW*5UQy9IV5<_6lo`v>MbW+>&?(jFbNpEB#2``DN{Y=RB6$Hy$D{6^XnVyH6I zSV4PYOd-QIQKmO$C^BU<)1DNQO#7L%C&%=mz>QYg$Hx>i-Zt7(Vt&QA+L^XV7!?@7 zniiHLRYe$U*1#8Agy9gz?ZF=7EUGdvu0@3Cu3*u%Xey_kZ)~DY(ik^5jSFjG)nYy; z=S8%8VxA}e#p_{@i1~`KZ>Bvuh9629myjnmW(`Z}QrhEVent1oSStxJpVEB`-4kQ} zMmd+$?u}W4=44z!dveTD+OMQNC1w@nZ>4=o%w%ThD%#UxHnKFXrad!8<>DIJXKPUh zA(U3LDMxsi6XnP>nyrHMf`V892RD`A7&lRZ`$9&0)3tDo@X#SF8x9`hR_aYPhN7cs zMk4-oV*>tNP_wJb@cvin{d4?j#t!`JTG(Nv(_`!!%_MGsT{Gt4PdBE(+hs%{M{Z*c z>>h(Ej>3$4$O2|I?0WD=7%#&&QVV+*5qXT?&!?bdRZFKMux{+bKN9en^8Vu)^uCwj zjfF^(ZY;+?yw6eTd%uU?ucFvB;|Hh$-Pq00#wBoZYhkBAtjG8Zb#)krm;}S8n3Pgc z<17|~7JU+$ZKCnHfgmyENSg6Cew(MoJjPI8(C&$$)?lNL_K29Z_&5Gedvr`QOZ7|I zV`Dx=ij1SQ$H(+g&R4W2Xzo!Y{xKBtBRovXFzOIZFe3F%IK{Eu8iRD!sup(zBGvZWNJxLJ}ajLJ5QEY?a)L`RPL{!{`jK`;l=(x*BjMdfn5m!YbSrPGZlUSPb z6p;`|Wj)4xMI^=@pwB{m1>C%G_n|0_lXW)w8RO$zj5BIO&e4-jct5hPj;Vp31wP2*NccW^zHg?VgPwksDj99~W0dw2Q(C<(?KX$B+a1#Ga7eq; zl*VCGzsr<1Vli^5r?~XZwxo$Jl`ihz(WkhW7H#AO$i1Ego7RgjSvP#N%%qQsC83(et!1+_{k{WQjJW31prkD_m#c``&G!y}Gh%Nz@jk?^1;a zXEnLhZ`=Uxu_`x@s8akhy^<2qn)Kcf)}Pv}Pb$_y=mA>t)0DcFwXZ)7hHR$UI>VoR)9&|bs!r^Jt!L@e2=BohB;)h*JW$CPjRF%NF`n2DH zUI~UNbV&Ons0%@*-vo;KQ3oOa2&)%q8SQYVlUJ|Q)9F?S9xa*LpYBZ@??v5VUa>H3Xz=yGOp*Q(;CihZ-V8&q*qmA+Zr%bmq- z7crBhH|lR7vY;ZSdq@$pW}D#5OK;PMA?C^HaMKr$xf4!dpjpISFQNgz3I~>87fNsv zbJ+oh%?#L~p9;olR5d&Z4JQ2pII@rmRPahYO$v`q%q%=rZqpfSA^5aR4pua2xbz!e zp|sz_DFxEf-i4(amZ^V*MViZuqp+uiqq+3JXC}MeFkC9oHBOfq3_XJ(Rgf7B0+Y${ zkH(BJcQC?^gVWC#VLB{tGr|S1SP>S%p0*f&)Oiw!kb!tFwq0g0^bCfa!5}jj1SZLg zKmA!%f20#h-nbg^j^!AwKc~j%97xiVZVQLQTXv(^tXS_Ls~Q~MQjKB*Sj|T9wi5a( zgUM3N}iOr+UT2a*n&BUA$>S8_XPbOqyG9L3a%JRin`>R8s-R z+=Ji@kBY&^=F}H6?-DT1p9dk~(R9=1UyuG0KA3iW{(iL0@Oaams;FngFY?5q1HMFk%*JI*1`As3vWi;`V5{#Y08Lw4c3L_be%OA?bPXd z23_YT2V4(9NY-zWhsXlnF4(RIvB8^vPs65VZz27CRkP;I_dlyDCs;?0Vd=;TH&y5a ztIE-_yT($K6HuKK9jr4aCRk_AU|lbYW56Lkttf69Dl*p8YctfN2Xylcvt@*l7plIM zI-RhhIO^SjhFOcm)Fc&Jedb2Z3!5;aD9)?Y^qeT#cfgLtxUHne!I2P9u7f4Ilf#rS z(sqiPFv8UAb8XHDCIwSfTeHt_^tOP~9_}R??I3Y;ISFJ0(guY@^c{1_1v)esQH=M} z3v}!{`hE_$e5Nz{ryZ+GYLG^uv4K2MRI=n6$+L1jE|4}qFlAjb|L|IYp zLF)#|nHVgy9EN4!F$_J-wSZ#vIn-dUqomp{n10_PG zOY=;nOY79&8GofK6E^HuA}wjEUsQi3wPh3HxZ zLCtQpC4^pF9_=%|f-^v6(8<;9=0C#g*4n)WC8MA;S786Qnx&etovMW6ZwfBc>Gb|i zr&&&!u;k%#X=y(u-iS-rstFI{a%)}Z{g{?rraS&^gQ1EUC13;%$sM`Am0>oRAc3If zh-x1iL#l%LX5ZE1;MlEIR{}!9VxFw6$E9nPgo|*wv`&Rrz>Y<3m!@SgpgI-_Uc_2l z;sqw#IBL@i4qY8*t$Z<0an@gmZwGvD!G!>K170+(__qxjCVZ)h6HjnxttN0P5!_B# zw#Uj#KD8$h?F3e3IIa1Y5s>RxBlu4yCP}3Pf5(&sl3|6_;72w6S?W2%%e9s|aR;sUU1NUGc9>NI(5=lgqTQhcIoH=@pCRVj){N zjTcRjhOLCgLY4*%lTO2~LvyPM>YuV$axA0e%EkPn-Re;66qcdeW4NpyX1P-i%Y@al z5LXtiT3nWCg2ih6cfVJ=N+$kUGwj?r`& zM8Qsd?CO%V<#U&vZ7V~o>sSsgRc)rmvt?&DuU_7EcBk@R)&#$^>pB{jb+xs%b}oZ9 zw5fF+tER4QTirMnx}}<@Dn&_CsVM22^wcd|RoBo&T{i!NaSo{T4!c4v&3FST$+I*~ znY!_gu`D~R{rpPR0r#99lP%Am0ebaoku)8Bu-D_7YJiWMh+L-C1Pj;_gl$liQ?(n(?dlyU_ljd$qh0WcOiuDMZ zpa^`#t;f4u4u>a09e(Q4-50r1ebZ*T4}Z_=zS!l3?JO^}`XO#pG2mF=G{~i%K%dW- z8ZX2pvELESUADG&g&bW zIXc~!mF|Av-1%dYe6y4A=X0-F8nC~}(8-AlC~n$mC6tI`Cj*&z8%h1Go;uq7=(%1N z$cwrc=}APQ#!pN4xzA>Df!$vB!(jNG?lp73bSJs*KG*AW?>cwB`)zG0p0}QMn)?H7 zQBJ!1)^k(cuW3s&i%)akaNbgEn-9cyxm))pPuMoOdn-g4`iNb~q~_mKHWurF~Oa?ip<2w2?FNZlX=Or_P`<@F)eN$I1Y zOEKNOc)ojbs{6aC?j)~!sTVu214+EWqmLg=Iio1l=fk$^fajearQ9(M?uk&w=uqzH zjz(Kbr3Z91B2xG!yOI#JD5I*Ts=BJCx^ihvWqx+vX&PM8YASL|(`t$;Pthv7&V&OL zFjUpG7Oq}S-@Ll6>c&;=w5p&*WkuCR*(F7%=jSOmNUF##$fv!uv#T;Mch&M-sLe7Z z@n~PIa%paEj#g4plfSe&zpSdLyiCPaSl5a$AsR0jOLah^iV-msl@*9YoNn9Le3sJU z2;S;$#*3qAiAEN-C9||VZ*fUJN;kWDaaD~9VW%ryr3>drS5sSN1!}NriJ1|mCbzJrvT8{l z#2{-mWT{~lq@xZB>sBv^#z^5REiWrqnhZ&oSD5j#rPP!yF0Ikf7>cTEsut(w=2uk( zCn~?h^7dyJl`O8z*Gd~#wRNm3ty>LEd{oM2CMPJLW~$qz_yT$$p(zoK&ukj$Y|>_9 zP#WaQ{JAQxxs|6?RF^9&6N_e(K9lVRYE7!TI<@x2osAt3Vm4{BxbxI`*ji3`d5K7r zc8A8EqZPH~c6GFxx*Pi|aIC5*%21Js5XPCI`cU3~UTbPmMy@HerlP#Ex+YsQF-I_0 z5EZBV^9B8a1%icwMOsDM*~m4sVTLHSS{T*6LPaVHr)=#i&29!-g`>f0)y=CK%hz^k zs+^@zGgW6aOHs0JRtDOuiilcYD>G_lSv3J=GgOp_tW8%=r{)z{Ue%S|*$rLVsUv+m7uhg za?SLaHC>uYrP%~f`DMA;B_*cx^qQ)CtM#PY{hlH6 z%d&G2DXd6eCrhBJCaAS){dBF3nlH zLV62IJiE1(Wv|sR5^E%4qM*LE3}vpy6^=Jm)%lhA%g(i9tjSb;UMcH!R!)snBlR`qHLjp6O$r*f0?oPsViYkOA;YH2EjZV7 zawv5*6M%bPWnEXJ8WvR}HY+Yo?(x=radA~nO?kDMT{9r+NmUY+7CRGZH8p92W;bHb zBa=15V2f9pRlTeN%V%+!Od$fQiBb0cwX3xtb+&dpmyTQ3wwlVPs9_f=Vmn#QwuIrB zB`cbrvNaS-jlU$js!%m=m1a{rmEFWtIx1^2GC9P9sO(nvTiDR(rL&cnm7IpVxmJ;1 zSyWM&U&-8KdQ?z>yFM)@vvoJE$}X)yd#%i_Mx&K&`@(qrLc2w2WJ`(yR{Zo zRmxOB4W(v>7*L6LWBuBdrEO?qZ5sef0_JzCnR1P4HPskFJJxV; zu)7{diz=ue*En-ZQ~&AeKSSdPV~+^cW=phGkyjMu)|eADR){Tx37@X|yHhLg{3OKcCy>3{KfNXj9~c5f_DDY-|p@#B-_pG8g1H z`S^VBoA?qO^7ypMl~G}U6KqWJ}e&s60kHym@x;dBbj z;FZp5Co^x`p^kE&4RuySY^b9(2?=!%JUIyUan5D}e%Aa^-JSx@X0MSIRcif;PAE=K zUCvc;DvE=J;C$4e!X1ku@Yc2lr~2-HH@)DK&|KKA+|sD{7S3ttN8`iAXYJp{XTIMt zU*j+w<@M4chW(UgJTCcCL(xs&HRVqRMIK&^k9s1R2EG=eIfBcQLE5rc!0zPhbND&= zT0;1~0&P9hck-;+$e7l zE=%6Eush{Vfd|JL%UJTRf`e0DFXS;@l*jSLl6M#EPI>&uav*s>1)o#ivkrOYt1naj z(;@PQQyd^VXU#^(gN| zT$a4CBG2ka(a3nb^}=5G0P6f&)~Chi9b=Xo{b;Os`CTB>XBqOH!2%Xz`Q^dlOy9Oz z4F{Q-`5g&fD}B`=^3Iv2X_r`u0G}mqMF^i~I^OeJiE{AOhs3+9RnvOF$8s6%h?jeZ zEZK0@(q?Inj|u{Q)T8Rm$LuxcJ3q=p*6n=oM(UKe9rBzGmfxljdD|dwE8Hm0=a6?j z-0-u_b~GxU8EP5J?^;-#=}YM}zsse(vAC>qzD?w@&C#@Bpt}j*30j8oc-SfXHw8D555x16OLAvo`;(=A3ey&PWUq)DZajwOIl&(aDVwH<s$slFSg`iXs?rj0XkfpCp70q!_Yqcpe@66oMsU~()^afGNiXy1d#MCA@r^g`sEP% zgAn@b5SseQEkpTJLg?%e+W9>R`5Qz0&kCWrjIxYMe+d1H5SseA>Ey-VF!WEJ({34t z|5E(ZU>}D5$an2zG3mh?&t)ggxzsR}*jS-AD|(nVLulM~;2*E$2z{%fPtBR{`7r=D7-kMxg0&v)?O1Dg6{ zE&j(rQ>U%P&+|NK7>42P41>NI9jm)T9Jt60ajFdE33(lEN>b0=0uQ2H>wMEAu(~&C=bAofC2uA>@Fw25T1Q3mJ-NKF2zuM^c!_LENN16$XJ)2& z^#T_H94~83#=vWH$BPXs6@1nA7}~ZgS<|iu4#NDh6&;w!`!?P0CeFq@hd2jwE#h2! z!Aisc`xp@&q?d^K-)D{Lcj|)BBL%>kNwUZxR_l5pv%nB0i4EjPD~N!XG9= z?hzv7_7RcKuZYNphv`{__=(70G!f;&H5JnpPegfeEN6Kn5>Xx;Qy9O6yt|W55bP1$ zB?<7N;=Q{mXPJLjWqIqBN64Zorv-=h!fQitnn-j&Yg+sJ6Yfe(#W)r zI92iicUTo4lBy6@I}E_1YZ~AT!8$l9|I2w zt@<(OzX`4SFKB#xr}$OB1wBM)b#OcA(LyH+P8Q4%oFkYeSRhy?xL9zRV1wY9f}9&L zz1IrfB6zRhqk_K@{GH&R1S8yLcq)OQoOr>Jf?mP#f>Q)D1ZN8_6wDJ`BzUIa*@7Dd zuN1sN@TY zf|~>{75u*7j|A@!r2Y_we^T%_f^P`EFZhYzKLjJg%y1_N`UIy6Dvd3Wn=kbFf?EWC zBzTA5eS$v|k1;a2PQeKoGcTkfaE_jmQB*8Sn znSu)hiv+n7kl_~#E)#4LTrEfq9^_juc)sA}f>#UvQ1Hisw+TKV_)Ed(1z!_xIySk1g|8b4c;X5?Zio%c8}0M7y2=wpCz7-XJGs3H>*rj|v@z$1#*YOmH|6@sAgrA($^%NkqE8Lqu6n-wx@siIX(#dqQs};<`@g zTZoe|{}g(c;BLWJ1>X|gQM9AMH^p!$iBlOKgb^~6zlZy@wF;{QXT zZx#AZq3`IvfwPiT)}d|TESN0X?Sif^!JEMP<}#R zK}7zq7W&6TOr~!YdMEKz?4}p`N#bHn`<2kI5Ua6168Z=clk%^H9uy0@67wJ;((fgn zg1vA;7YSk-t;Pl1&K06rD})$@d}_&YW27LOjH1&7v6NFZmNE)+1pR_)eSq-Ggl-gU z7F;LzJ;5!4TLphCxI^#(!G{HZDfpD&bArDSd`)nl;Gc;Y-~J+aM6geA5a-2%u=P&x z1i=x4)Z4-SK21=qBS6m;ntD9wug>HHs`UeKskl=`2K~tgY!7l`l3Q~0iXjZgJ4`?<10h`3VRj^&KOR!sT zgWzVtErMGGuMyl%M7iB6csnt|++RxENgCz&kl-#N(*KxXFA?e5E%+=E<@=)G9wN&5 zRl(PZ3G%!Scz`s@{XM}Ch$#P$1P>EY4@U&m8K6k-_3Teb-(5tc?=d3MMRjIOk6I@q z9e*K>_*J_?d}BSJ5#M?u;<=6p`SFyWChZ6EXA7on<^)6=JC z&P>akF`PBJ6l*LP`>fGeEk@&g&7+(>`YS-44`$~m z2P8;0)Htk1{D#SMh4m>2F9DBx9scxLd0=&U!uUAJjp>A@&&FhiDlaz^B2eOl@aq8q z4Xc<#Y3{A8*=$DT=1Y24PBB?M;T*xk{z7?CKYdeBGe1AO&vZn{$2 z5B>`~;|AKe)PJ)?AZ5X+s#uJ-Wc76oXRgJ52kd;yEh*2%b|vglT#{X~IA8le{4Km) zP-@==w|l9ova8pz3n{P*NU9mzRR4pUa6{Tt!$2DyoEsvn_GIo>tf{e*7qrR9a~8e++Fhv{HqHFn3~;UTQdQ|r3AI-2X(b~ScdL+-I4Z$21I)VnqEXY$WsFt{kg!Jd2=R+I_lqaV!#T)4%2 zD<7s4N*+KN%HulKGM04;9Pk*>Hajujc^wpQ$D9N3Vtkw%Sz%z+_zvt!TEtj>WuPrP zz4+Y;raZQ>{1(B*8SiG^65+;pIVG{;{SNF_7+BT0^4B{YENipyG2b+N=W?@ExS+|$ zixUQ-#YY9wYd~AZ;^Q+0h-kOme*nJe76Bw54d0Pkbw>JG@Lf)e7>keSNRGy5w7qb{ z^pT&usQktPStd?-+fW~Tu3{NWo<&>ebpP-8zR;3O9nOhf!+w zgJ|S8+* zwSwyfFBH5=@H)Y}1b;60wBTUBAF8|x1L%k#4-Oh=<- zU&OzD1@fYEPRs`%PJ=bUQ*goo3~#_0Yl2Hixx#M)z;%Kbh5WoLuU%@@7y96Y(y-1G3~S;X23^B7mdJuxhaYW%|=f<0{P zNLaP-MtUdn@tY@nAKl00!5$Gl5C37~7vn!V{3W_ipglHx0(xFp3hnXXiy3wz?Fm}M z77$#WMeK2<*=)#q2{yG&;{7B&-(r+ zHCX+xS*zhz@J;GyoD*hqNvCcc<_OxryKujyo6E6uLw_Dn50)AJm~~&Fn?fpjY^*+k zs+p2}P=ySPSrF0S9=3&lD5_h&Ry5lr8Sk^P+GA9T1bLdJL;oE$NKcxoAor_?X60) zg*poh-=5~SHr91GR9FP@QL%@VYKTsje#@Ev!>iN4l2d8euo^>6KsAuPP(^v-(^gfa zMa!X4Vdd(^SlCOcwm? z{nZy^9Qu#0Pu0$3t3<3_za5ROvi>~Ag=-){N8Rd`SeiQa1t0Tr))8g}HXU=;bj;@e z_4=0cY8tL@vuF`x&RNZGY%%?|O%oPbvq5n^K^|UQcNXD7E!u|bM03zLoh-k6kWP8q zA&=jIQXbP{$>a3V3InUgC*z;fBF6IL`opr*Yc+0JURuOhehr|V@qU1XC)bONm+n@) zoDo}LVAZaGJn~t_@;eI-PI-L}d6*U1@;HID!cfLdkjMAEma(jx;oy`PG0ZGirVpQQ z*z&f)&M;}XXnu$_5x=Xn4E=cR5VZJSKqalQn8c5KcjH3vcFSu%5;5H(faIa+#bwz^ z^V_Q_w1{E((ePcDGas?Y2g{H7fYr_iiYsWHej@_$I|9pCaS_$rK|DN|*Kda-*YuV= z%4eL8Vo=|9JSAZWmOO`(vO3-WJJ$WItAO#SyeHcZRw`rHtj%RS3b z-klZ!RHs(vzQ;@>jfTsymTK`ij&hx)-kajV497n{>xd?z zA+e7T*>{Lw(OhT(J|dWue7H{&f7T8876|4DmJ3!3vX02tB-kd%XLfYIK=5)wjyZJy ziQxT$j|)C0xL5FP!M_OpU2vIh%Hdj>^11}q6ETjd?{MI*Uc~`#75`m=y9M_MzA5;D z;1NMpj_68kPn1hTWbY%sMLr;^M!kPV6)2ibuQ{VZo-75PEzQ6aB=aGX`ER`^o;73o z9K0@usU37)eu>{y^9*4yI%)^e*k%tO7T}i1x@XNT(B^9GKU+|`plEWF$Nxt|uT6M$ zUU6>iyy6|W-o-VxZeDQ%t{u4E#Wl7bG_D=E-o-Vxq5biBh4adG7EErMTJ*Y6S9@UZ zoI+BQiuM^d*Y4jtQ&A~J`;E72U)!6hsBz%*)xEqoT~TAfSy%Vs-f4>Rg7fCOU+u2gzG{_*h>WWuBPMNr z!aXzjbMC#bl+Ns|zF+QCUhbNyqBCl+oi7;!MgpA1#k+X^Q7-TvgHxB9wz zlM4?NTyrqnKNhW}X}f;)o&x=bQB7|^-Z}Rb`NyEmoP|({zM&E-5uvhrM$mo~dW`EPoO4ZI)Yi!BehS~@ou2Cs0>^Dn@#|OrrZ1wm)u$z$T^4rTPUP|rpm%+u z4XNLwPd;PMW1qN(EZu`oj}GhM>vi_7!oyj*8<>44A};!{J39AJNpy3$<|{ema^`IW)v)VR{PW=kpX+BUJl($qSm{skZw1b4DlOY*WWTD7^ZH9r&f_oh`p0c7 zhAqWEeq$8-+?C#>+Ygo>(dwQ)h_t%*Ye=c<tX$8LWfxG(P= z4fpkEe<}VE;Lkz3oQQZzdK2Kj1N;%bIFS0R$Zp7}*_Af(UzVYTg1$24C2;bXfrNr;@FF}u9YRiZn`&s+?=KGuDnz9ea>i5@~ zDYqo&7|S5JP)XizEZkdIn2oy063MuO?!BwI$EWg$dh1EbhHNv=l)ayHpDYya!+RfW znO`_!v+29v7_qmrWsXh1ZVZK-OeIJ6XWBB1z3q~2-Jb^6YDcQC?Q?Grq&z~e`SQ{) zt<-lm?+epDxxdHCMUUa$JAEA#N*sRAc6(a6>2OUh)vtDQArezqCc?YQ>f;^a617x#!2;;O|((=BMlniZai)ajESY#Fs# zJ3RJ$rt?6LfqHqg$!baDZAVLqJ)AHk>+rSbD_-!uXy>OVeE8l=koGr__RUE9W~9Av zz_h#i)$&sayI%60?O$KG4q@|>?rQP+>o+1!M+?#IuwiQKxwg-<^B14!L(V%=bl;ty zgt_&}S)cAa|ISa`gC2$J$$wjT-(Ahss$M%=JV~Fn?`s;dS)Z$?kLcM~Yt`-f;pcrm z={{}jroJINcXW2NywcRr)!9;CH)=C$=i&3uL^`$=bhfCl8Ty=kwIh0l9_&PEje5|7 zw9U0kDIoF0z1mnkX-DTf{p5`rP+o;yQk1JrKJUnf_gXCyGn#ge25Hh3y@x;0yc^F{ zJ^MqIHWy0>sn8~$eB`(Hvgg0>C)QXRY7Bgb!@`jOn1A-bdBF zIX>KMiLmAc?W&G9v?Tqit1#-dD>-hz`)c)2YZ?}6QWW{W=eIUvh?^`DqduOBJhx~o7qO#mdtV3 zY>g)$x%ZyG{;8w+6qN$wpw*{Xb5=Xqh<0-EJyscAaL=Z`!8_TbP)cLjqpUI-wkNcN z&V1j>TdkeTJj7O^VmpXC^Wfsam^!Lhv(9I^dHtEbQ4fBB62cwU_!xH>a}4bX|Lb0T?7N+vEiEnk(J~t9wiY=1zt=xv z^S&m1&WIj8V_)s4&6z%J^8S}yNe^~^+U}ZMy+<3H;15@$Uj^n@W?ld4<)KM8lz!Si zsVUiaf8EQ5+dpsbHni_;CHmFd3nn$aVoXQtexUgWn2+l>{PAFCbKDWFyK0Z*Xu5lP z)~74aFF&kB6rjJE>D*{!ee#DMZCcjht9qEPPtl7mDE+K`a?`k^H_(Fy?cInNdP@F3 z>fQxDs_NPwKWEP5F^5b@hNzJQm`nmjNhS{>A|{ZK2MKwN$piwTAtZqWLK5?UfK>2V zMB59ky`rUJ?ekjeqqf%C*4oOowNknK`#$fA<2SKIMN1@;#1z(GdK@isG?(EY{Z8NzeA&4&R)Y_1yi( zQxEJvKC^fXcHVzH{lMs!A0E#ro`tyH{KVERkrSf2nztLI_ZSn?VG*zX7IYfPA@^lT zPe1+cH?)G^!V;BYiCnS7RnJt_?|iMY?p$Z&U3h1D=p5+}qi%lA6Nz_s@A=c%o#)n{ z?c(}A`Ydem#WYsLoO+Xan3JD!~8jt+ABgW zO`b%yJ%3tuXHI>|Ywo^%Q|4*T;FU?*TbJ)0{sw#W9ke6W>d_a`qkI08b7w|iavZ)6_%iUX;^t+0vG(SD zdv(lmH{QWMx1&+zoApjKdf|9kv2p0o%F!*JL+SgT>aV)Wv!P`2hQ@0=Gir=Oo*OUk zZ`_bvcVMM)ljl%7MwmC`$$fjIXKdkCMlmgS@R)76Ya3y;St_Q&hQWEh11tB|T`M!B z7Zw@Y5`1UR$hv*OHw_K@C6A~2ckn^x9Cc*uI>Gw$eET5f=&@+s&*611sK_AW=##RZ zqph_!6Sc(rE1yu-{v)hCVD-~;V(l$=Y^uNTSj=x;fwjA>QT()J?an(cs-J!Ah2z2E zm2VeE?)u9g-{dIx(m({!<Q+IP|_y_NR-aR9#Ci`%|f2YYn|B--g}jHYY$ zYT>RYwW2-m^xv76n@-uqs4rMwcVS}-eDScQ?RTMDaot+1ZEbD82T7Y>jrISYcP_c} z8qBV$p1Pz9(3U1wTOO3w)kA_y<}?3h#fZeWtLqsfZgH(3l$W+z97%64ZP0@_`*Mwj zxiT6|jQJ8LdU@m8u~6D!YYmH{9X#c+DbVW~<5l!-P_0q^j6BDaL`Dj(auZMm@i||D*j$Pi$`N$NIr=W~~?CrJqa~e+FY(R-&GdEq$I|T7#YE z_}%vm>K^r z5_`UmKFhKC>>kv!#Hr^OQqOZ(>HYAvdj`BXH#xMDE1UQ@_eZpaaV}D)%iMYs`p2_y z!xOoU3*#)3UF`X|ejcMo2Dppxe5~^A(q3=iz|xTK)na?mOY(N7whZKqp!4r$~Ujy`%TQHqfcmszkRYpW`obv(b~qLtbGX~ zPtFzHj~&mr%X<)Y2d_X*_TFS!wN$?SB}PAAQ=M(ipCNKwd$*qZrLo_QQ37)H7y1Xr zN#7#-i{I=W6Q84xK9?}(Y2*aGH|k3p=l%#Ou328%%aSS%Kety8a<)i-Csw|BC;Txvu@qlY@=h;1M3os+{f8bGKMM z779IQ_1LYL%jne`5wCLP^!CO(Y|p;1aRW*pz)WZRD`TaS)agi4qhrsXK6Jz`bB%yURZ3hnKd#&7hyS43)D++oFuJR&|B5l` z8!h+tS2@E#&tiI$C-<|jCd%F@A@|6uhU|?Ja&LN7`_5sE0bc#q$KNS{95XM2&fg^A zxZ!V=9Kd}g?!w<3Z*3A^@zyO77~GIAaKnZ&fwyc(Q}phBg>O{w<&BCj*rW1qvEa)+ z1*&|vqHoyPDR|F-_EvI=_7;9o<*iIpdn@QWqhEU~KlzH+^|XgD;vPDla?3-<(++5F z6@v>pzEugXdS9gYq2n2QA3C1-;GvBV9nS_|5PW$DX0*&`PH9M4D( zvNMOOn>Sk3_K$hT2D`WSO)qvz-%@Ujw>@6$NqI~0{;}$=DtujcW%X1|ruq)$<5`hl zZ{K!kqe}6ulF^!`xE6e{a&0Fsw`O$cLewz7H`ve;ZR^78AiMZJNYidZTt424h!+sn z)JEO$?*tya6;4>JzKF}O!h6tGH$>Mub>PjeZXNJjyfv*Y{5>#R|3Gfpzrf31;hSRbe;{}9zrcIWzrefXU*J9WU*Ih%CUfi1;LhOK#K_3-s2x;; z+lG7lm{(jF?3oxH#kaBLYY4%LVDaSq$sn9@s2#7hR@4g8NU~g2ScT}Pj1&CATJTKg z8p^mfLt$ZIa7rwhnjJqf;4UTqoBG1#K5*OMa#QRqv7d1{x;9daM&erZzo|Ri`UC3@ zw=OFz4n{kJ481|sD|jBYuq4>8o_(~t(v??w(mcx9NMA#%qjj~xzR}U)Q6S$~qMo(H zU;S}B$Ej!GgR0NqK%<}5u`c|8&HZ>57T?)?U^alB7@mofj-Mmf$gag-d>PhE<_J1CRL2&;vxXGXW zoo9Ms#0NF=6R7yRni+vDzo(hUK>UGbo(7#B(ai5ag(tuQYdoo$NifrMn)yCBpV!Rw zu=US0b0>%|YUVFd+0QleeANE3X7-?Zbd>QJ44Blt6a|c5K=-6U{*Yaw_nY`T<36bV zLnKs3ryK)oTGCJwOy&PR$VtPu;jiZZ4SGFkgx%!z-;H)AUCe^X{u-#3G|F^}W?Y6Q zCXG>=!JooS8k*q3I08sI?C{11Rz(Cv2vKDZY{25>LR9EIoo z{qOjq!YDf1SEBQ$?`A#%2le_E>w8#5IXEa|Q{PJc>*TEl z$?I#-4b)}why673N06wSAE#Bcv?XvkU$g!z@TUI;e}cY<{wMGT{)~Lz`J%fP*udJ` zL^*HZ3L@=-BnJ}Fi@vCcPYHY%F5v4BBrPxtL&mpSl*|YmLdW~o2$DIA9p_uCvm10h zDSOs~Fu!k|g(qguIv>sVU0~q}*|R>!_N=#XZ}zMl^rY`X3pcW7&0$R!S-2;A)^luA zm%=?-cHk(>Z_sZ=eRH+6hhRP5Mtvq4IdeBm;q`6SmqT%L5!f_yDgNqa75;k6di*ua zR{ZsvtMNC%ybymA&0hRX($e-(j}cu*;hA?L#CUz9`c_KXiz+m8F50Y{d*NrW^Bwey z?Rq1!(_28w@a@#^K|2F{5Zt#*G|&S3A;ouz2=NAr*^J$SBnLi^e)N4v+K>|XFFMYp z(!kWf7?C}K%$&ua)bQ;UHjh3tZI%wd@Lgu%scEy4(O}=@7Vb}*b)2TY!opM1X8GaI zzAG(!M%t`CDs+{Fn`yJs5fgk@TevT6*4No}AGYx1v{`R6f1iaXrOn#Q{A(;cF>O{N zjlbW*6VhhA3?KJhYvJCsSsjRDzUwU9NSk#E;*{?r3g_2=(!S2V{;0kK?M&GYf6X*! zW}uD!C!wgBb|37n`LjVV)0y`AzX0o)0j87v*Fm^Bi|G{q5_FE4!E~Dca`KsL(u@=_dcj$+MJNNBkaimU$l4iuzxK zPns2MS*QPIbeg%0{OkQsp!Mc*4%H3*pRyU1On3WlX1a>$jTvG5HCHf=;oOrk$?B>V zn%I-^V|1ZeqtJw&j4iCRR-xXWj87A-6V$8q_@CnNSxK~4GhSsI>Mwyf;|dHPv;J#n zY@(Nhls_W~<(rL_P}@I;rfzxyg)~2ZO2lkdGtx#DYLU6ae>(-YGM(b*@9&!t@~8Rd zGkreO8U8zIn>MC1{pZsL?X3`>?Z1Qa@dyy2qyH>)vDv{ieg}|xlEt2ysEyG;%dGw; zR5gBtPBvF>1r@V42&Z_{(!K}G{3&drnZLka-FyvyJ?4MmuVKE6zh3k2_?uuRL4!nd zCjKUwr{Qn1IS+q*<{9{Fn*43~8QKi4;huD9K(NrLr+G26zXHG0%%3AeH;=(G9`i-?72e_Z1&rBz zPshiR<6oMIjMcP*=D!*Q&l>4Ue>Ys()5)~Q|1fJ<%e3LY0d;yVVA|_{gt_aPPVj$? zJQp&Z=%2;(MNB98k5bMCrjz}@gf%_gO#A$QWL+DXHvLQCqMjb6XZU}78q$4Cr})2# z26#3x?f3r|TIAWxbgKU*3>;5C(=+`c%HP6tn*R?ltY<6J>HalwTie*^vzSkN<+ z3)5xzx57Z45z;gLdtg(~#Z1rk?`PRDrnCKDq@EK@&-L$Sy*oIRf_{08$WF@7^Cv)> zXBX4+{a4|y=MwTS(2NKb+RY9yylms{|G?iwF9|7IQK-zbhd;yaUjyIv>}A(${@1D0 zWlVehT@-e?xP(89XyLhn4w~X`W%^3e)BHC=fafZvGyHXI+|`4iWcsh7oDW}%bhiH^ z^vZqY3HrB_eht%k{sz{&pXq#mKMi>;(*^zj{(7!sx>&8wC{o6S{BjPOK()nRSwSqv zUa*aVYMjf~e}unhZ~Tf1f8-0GCVENmT@JVNdT!tk=9mW&?RE1@bUt&NjG5PvPBz~` z`82b@1Fg-&u-1c``7pd-uWoV?xYuLei`cQ(YaS*@)_iy*0W!ZBq|7;J8Dfkqy6!m* zk}=i*yq<6OF#B0lshPh=JDGDgdoCA|;UOYkNwxdE>BT&L9w@i@az-82Sxz6~JqNRm7t}69CQb8X6rf-5#(>yEm2Ka7ZIb%w- zEatSpgLJbRLG-{rwx(7PPvFzg%u^?b5qOVEtrWx?kib9T(O0ANd z`+LO@f#Kc8jN3kQsqba6GmMk`lO<(pm-a2M!X6i0D);Z7VzBeElkD zlE$4E(wqSjy`-eqz}3q<7wNa4?SZ#xHMKa`0;?E7Hi$?)5MaS>K|Fzl7$u&K`n#YR z0hvvDCC3|(>7-APgn-N^n*>P=ND$sENK!x|?^aPTIS^($1|`P~1mNSI5kY1IBq)yw zk`j=pJT8b|S#m*yvoBjZp)3(v$|E7D@*a~mpR7QWVhcEa@4#?M^6Fg6VD<$A%PNIi> zn5LSPEzb*dp=yuca~o`%9|#gj z6{H}rhpNx?Y=F?>!21Z1o-`3q7Wghrmo6GC3G62l5TrbCJ2jXkY?XmwA{m0zsDXNl zhcT>POKV|Ioa*6eK$^VE=~T}dut%bolv7VKYRxiJ)K7``fLw7fYX&V5zEFD= z^--aouXv?UM6yR!_A7RwNulml)Z;ew7NLGrQB$F!Nce$J4=ZY(O?^kGw<+pUo60XQ zYgx1y6kjV;w=&$$YFQMB>|wjmh)`c3bwaz!rt-VbTGs1|`bnG0Z$oQy{;a5?-kYRo zb6@Aw`~}*d*9dO?@E*|SiIu-dBVUO-hR)Ca_YFa=0QEbF_7dfSQ@@kwO+Z7HNJLOyw%+F3u9eI_H*ZqQ$=1);E1{)l z98GBfhi8|zNtn=`ne>M_>l787V3Gzc5kJXYej4QO6^{ao_E}K%!)IV1DZjZ)XOo^l z)p^pSDteUdwj+}SfwM88IG z&X2Qab3wCT@G>~~>@UGn^aFzPU}3fo<552-IJeTX`3@reV}j4YgtA~YR9ps?l|P=r zkg;qDOu^sNfCr4Bi8N6SO*8=`(#bv}#J1CRXzv!hJ3obA5q@|6+~nZ9^XI=?uy{WC z>ur9z-+h)4o0xSkg^z2`D>-C7AHv17hiKZYqh#2w9ajv7c|dn7kwv>A`!sk4I@2(p zm25}+vnu;+mF-C`XW=GGqpX)yZq&}boV6zhZG{)Wz(-Zy>dEOFxG4K187CoEHs*!+ zZ2#Vc`MP%MEU7QguCE65RbX;KL%Me26`OOXwdvyQljog0M=C}yyDQGOD~_V#cBvT6 zx2ahhKtzsG^QtLl1)f->TT^lX%9W?2}}ige>}_Qn&t2 zM{!`y!U&(zeOWIm{m+(+HtAPKfBCL@h#TfLR`w2-c7m+d^SGGew|4C1@0 zE)t!p9t2$rRpKu{tU`t}F!NhLgb$J6u#b>kJM$dy@;>W#s4;_|c-@b2zL1e>ZWKdI zf6fld8&E($ynCJ^EuaosR3aiYyiJZSxSWV8i(ZBld6c!C$fJKV_ z`}-i}6pYcFi%_fn2WILQQqhw0 z=)D%P%pywkQa<;nWXaqUdJ(L@5xmVfSd%Ei5xA6`Un4Vdj?`-$tW=px?9AUIGo&&- zm(VFZzU%Bft^t-=dAn5J0XxqNGqgya(jXQ1MJ{{^@NvN{ca{l&zleK-l4zn65`FLI z`QDe9?#fYJ{m8_4nUeDJnll5V{u}2UWRPe{=0~rz%6DQ-r@$Uij>k1#=jqY4)d2L)Imp+cEx{ zi2sF)pWU)G*+Tpa9Ht-gWMS39w|&k&j+s}#RCX);CArz3qv$=d;4Z*8o&5<8*1fVb zX(Y~1N%hNQ1F(fS*GT&1g0I0ca&`_ES62vrH}OjBeDo^?e}ed8sIOlocr{q(e^eG@ zvcK^hjLLGTVF~P048FZVS_5OgfS!l-VyGU}1432!I^dr_fol}hdtF?+fIoTy7vsl^ zF0Pw^zkLGNS3vdTP!Cn({lGH?cj=Y&G`V(Z_ztWnY|TY{v_T6ol&rE#j9YTD7(=-7 zomyg_l=w69wo8VpGegHjXiKndk;Mf#Bz)1zuzUD~>-42e((4T(m46xS(80NX&p$x=Yc{(yrPx*F6aLV|r{%%R`1 zu2Z}%HgCP~ay!#&^N!eBN{HB{?Xr0{2ruKqenk>bcmen=c3Imdp*KLi_XH|Gwt4gf zDo5a}7S%GI{N_X`h>Sl;hB80L+>G3KSLEg+$EMoKhaLd+9GmK>^%STPi)vLRKP?dA z2Lu}=Lsj)Y@a-oQ=j*utZEA7;B7qjlM8*-xP{l6-{xyp+IcmEsA1L{eO?5QA8PuN% zRh9iA@V8FjdIMBFFXsM$aogi7R4xS{Wb85T=;C1 z-KKE8L<^Mzy+TlzkZ=pA!?5kmRt^^#5l-M*h_A=~s$IZo-(FCUDydTI)xe*2;e09f zZ|zc!)9@A9IP8{i7Hh$AQ1NT=tWsnJ;f7~gT$W?=cMP=9S;$y1HKSfK=(rb5&B$j) z{xW2^;t_iVCsuqzvi@DKyOux@#SFAtR}wy^zuxO zA7iVD?_n<|zGTcvYU2C8mkaD~5toVY2VS1keL5BRufVAP(909Gb8%EPdn*|AA9;C> zcAU6OgpYaegO-nBA*?3C#|3{GM*wQ#`?27Egbr%rdqQv>qGuOS-jjmQ$J&1OV>~x_ zO7PP$XV3l=C&r%$K1O^_Ch(^P{~_>_&q1hucS0%6#0Ss+?NTZildBbk(ThMR?Id+?ej0 zA{^B4dQcezZnbh8ON1}Ca=sOx6XM+R)D%hMkhA~+o|1ll0>8Wr^(?EqooI3^_ya;! z5#To9xe8Z7i1SF9O~5=KdJ2SEH{oRvI$R=BFx0mQe!gzIRcHZ-d*X?8AbwPpWPscR z^s|a57G=ZNgUS{?VC6WrIpaa(h^zhpiJ#jArAnImO;CRylb#J9{HsFIe^}=LPgy7) zAoyb7A;DeU9@+$Isf&w2y#53(*hRbO1nMBDLsnV(0^|9W7FTSnTng&-E-uFN+v2&x zJf@@-j#@d}ow33Q{IsilIq=`cmk;sa;C&ZY3-C0A8HR+IF8n}yfklnY&f}mi7OL`* zD}guJTr$JZ++P9p0>#A<^(;^|xHNv`r*Ri>i6!I`u_>tAf8#h3pA@6yx)~n4HjV;66+{cEI8?_jDJ20Qi|M zoIBxjT{suDt%Ac@oWXPls9iCxd_F*G*`T-sL0;dSWY2t@B=y7hBHXL9?*1e;?KMVk z+45~k;>^c~qSef|HHkAHj~ms@H<-kkFMl?0+45~m;>>p=ahdssk~s6dPh4iUk)-<| zKMyBXYG%7w@F$7OmTpw=-8er{GuxQp^*B$M&Bd5LF8D*lWu}`D{6pATtC?=Q;6>O0 ztC?8=56t_UxCb?-2o56h}ZtC@C1Wj=+{E)@F%5+EcQs}!F(^M*+NxEMq7X{ zR5*jvB+ylYw!_Wrg9GfTMp!jtXpm8nZPaA0ATaZnimkEno=WMuli;^R!Dhq&Lko}S^LxKqy%%i<2`i(l>lD1$&gC*h3v&{t zF|W0x%jaQqfbjRMoX<_k;S%c!FDnP zzrrpkF_WG2IH(_YalH=w^R^)VP=J>IHc0T61cSdBfaS?I0rVdvGXU~p#Mckw9a!4w za*Y0nJaAPOLgy zXm{H*RI$pU9gT@=vq(RUk=9wH-`OP#wD3lY_BV&^>@5~a+Sv)iCUR2R=CkLhQRM4~ zTh4}I#gIcjn*7IT=AvKBLe|AT8maV1m!=T*sb3NyflD}r1958piyuw)r%EUBGAJ9F8fj|nbyy{ z)kHc&(bss8K3&nDI|b?4k}hw9#(sGizWgpI>pzvoD8CgF{iiWmanq@Ih;~V0)j0rP zX5Lfyqo;Elv}`>`&}j$JDD?r=vL#^Fv-wn!MR<~gxxYvAEW%QHO^^>0TZB`Q)IVTvf_Q+kT9+>a&xO!=CDJQJ@6IG4zSty)zMd}`**`(PQ) zMCuvW75qfPlZ$5>)e1(aD$Bj7W2h~g5}O%U%Cu@%&?$o|>H7TCS$IEvR_g!3yBh6x zFDBXVUQAXmW%PM$BA=R44pBoE1lS7fps+50co zHBaWj6`6Rh$H~Fs!I6$PS2oO=B7dIi-IWj+wB+N}mz1C5LLoGygtD$&N2auCip;#2 zk~jm4As&cWK(t|2+37^ifIKZ-FM+&#B^nz$T~|GMRt{doSp@SgRBy~IK*?lwJyb*4 zLbn2{`hQ;`FX{{{Q6=IJMXCx|2nU?*BDNi@LM5hUXPhX^&^u0J8yCg+8)lV@>@tYa z&bBMSLcBxeiZQ(mX&vT)WQXWIq z%Rnn)wJ5?eHwUe;JghB0T^vQaxEx#2N=JK;l=f9_lHH^g4pDkiaaPBOLj+)-~om_CX-4G)b?^06^| zto3d|*1Osfia3hftKq@9BTRAG1MFG-2vg7EHnimOBTQtY0w9+kVPd}2)<#f@dkq9n z`#9SF@Cmph6wdEON39CRq?*_xgtq*6x>6^e8uxtN5lXJct!r%rG~)*C^*I<(3vZaDcNmLK~(p^EK40aWQz-IwyKv3CKY62<& z2cfHYDT-D~@iiPm91gm+h64EkJ(4W0%B%rVE)KhV+#ap?2w^2|cnZt6s3gIMa3^Rf z5sy|$aoyZCqrwA`J}){wB!|id6zSK#(gFe=BiA884wFz)PqEtVc>N&I6UW!D?2I`Q!xm<4d8vrQp$PJQT(hH%84>eXDVEjXPRww zdk`CI$E!40JwrO6jewtC)3Moue^X?Fxu}t3b__qnW13p9cK0}-n`*|aJx!8Bdx2`haZFjKTBK0<9WrMluHgj7Svvy}kUghiNs4+!2E9kqBWo%+SVmAF-QeXghaH->_A}W;aiA>;_7X-9*W;8#yKTu$k`Q zQzzD4N5DzegFpqd$r}{m9(N)6B5ouJ_yoR3I~XC{B~fb~0gu;6CVW(pe+|HA$xx8s zQrzVDHQ*|ECCCI%iK8Bj5Wb_xRQg`rIomg&9a32fd%r@i|}(mLMP-% zA>DR(sh2w7qWYYqXjZ~f+`86IV6_CVVR5&l*wvCIS4*0tMbHkVJpfjt@L7}7s3upV znp}-4b~UQW)u>`uqncceDt0xh$T)Y?(g{D0 zo0DMj>p4f5R%`G`OwHmWw&Sx1)ufLw%?}oD!Y#$?bB-{53vLWCYRzYI$VM0tKZ;}m z1aYTnW1j0h=HHFkTwaZ6IY&qh;hv>!&r8gW%e3PFrES0v;UgnV6LK~Z1v+z%Fg=PJ z3Wz=MhbCESnSoG+fVH-DFcZ)?DY!*dKpF~Uw*ejoNyP(MO{#bhwao(NSUiZ*Kn!c3 z(g-T5ttDu}jfld}Lph#U2Y`wPQM-wt{u$H*a9!*vQWNdDYt7?G{uVc=Zvrs9Bgw!{ ziy#>bBTLMqkk%OU432@>RYjq0k?O>a33whUWLTmgrAt@It4C1C0 z2@l}Ls@*mVk~GS8+;ATP+5l97)ymsG3UG@`(jcq>43HxiD+u9c1%$Wa#_(kYiqjd% zFSZ_*Ui|Vfs@%6|Za^s4PmTdZf+OBlT>SF4MKhy31kARi@D~KD_&LVMOCTOb5@%0CEQpzvNB31 z3t^>HcmV;&12_mirl*YZ_x>F!VU2RT;sz~ zkyijM2RNzbcUgv_1C)uj7;u0b>2UEj0JZm!la^7TcH}{)vv89EU`Uc3?C3jG(%k@> z(yg?0P&x|ocHEFbpw#cQRd&sz@!hQKTYRJxRV|h3rr7ahRZpUlt5toh>t>Z?eaBSt z_W*CIBy1s9eARAaxrapt%wjUYSZk$|>F|FdH$ehd%D*bow$i^twKt^KI&IH`ZKrcQ zklmHoeg|@V53=h(wp|U$lQrz~sF}`6$T|@)rms56s?#8s+=Q$X-0@YbY2u_I;KcgY zPG8?z)|X+`N5~-tS0qqXubsZ?wI^$88#1W;5a1|o2qV}b$@4k97>9%dL3LCDdW2wy zB+p+56I~=76(Q)7i|aO4K$waf%ml|I86{vjQ1REfwjjkq zgrCKYY=Wag9uvrthBls&Xp1nkk&HwTor?nn1qoE!ogN}fvdSeOhfN*$dI2AX~eJ;YyvmPF6@ciOsj8E?GZTTz{LLID!yEGona9hU11@}eu*b3U&ef@8= zCl!wDQAfu5Ux4VipaX6_94^9JO*Z$9j}_s~7FN1zbbPCwTvBrG+1*8BqdnROW7T?> zuHP{{x^--%yQgn`_h|3Lz|ipejS~Zdz3X=j4D}B07?b?<{m9$VJ=(W^e0X?pZ2jh* zp2F_YZG}U_Lw$vP-5UoA%fd^-iwaANOUf=Tfgo4b`hlUI!HM3!_1n68`Ui&k{x|ES z8OC-L4Uc_5dlZe14~h-l{5{*o2F7d)#~b?uMjZ00myU#c*k?A<&#}?f+qbEEVsN}` z9Irtd3-@EdYh&ZRc#Q|r@VAZKV*@=-Cj677yGI6)i_#)$^x~ly#uuNBD%4iIYjf|m zZjj))+0FI2pHlb zrEMD+V_8d=%_9TD3Pbb(4e{%fUOjJKPB!jPN$kS;p>AAQPSC_ZIs7xvN&SDFw$9OX z4pSliDdL|GqPV9V1K2jt7j=EHu`9SBYkqc7PH}GX*_2{z7t1szyBIGw^kq3kMq03B zPHyX*+=a%hpfMCIE;Q1E#xZS^ar2&46X#VFFD)**0P@NzE9Mm~r>w;CL?iF^feV_O zHa9eu%qht(EnPmRBB!XNQUT#vm1tDmu8Je8*_aG2wzyQb{58J4=XNHHSMd~E*`epmBOIlr=vmYf*@eC7f3j%3YX~TVm`QUywV%!inL; z9p5!}2D@4XD^FbayXD6G^5*8oX2Z8CdwFPHPU)OnW98)+LB>Uu{gne-mN!eSshtF0 zmh^Y_h*n0r0;YfmC2Pk0o-P~OVPMgj#virt@{)>T{O+J}io?@n^H|lcN^Ht0%*j=%6dUjD zF5hgN*4ZDKQ<5_;r!aSWPGP7hXKtu@SWXHTB6v&yAYYUnmHXhP~jf--Y8~5(H8ETd+%r(CL zp`h`7PdIf(Drx#Hnr=~>XhCSg4keseYzr3J@sdkJc z>KkKW!Xo4Eo>glL*Ul?4^2^<_Q1BDG!_w4?(4=5RT;{k4g^83)f&DW4zF?Jcou_%&^2Q1{A5=rRxuK#)8rJx=R&G3YN%%-%j#cxqH!p)e^K$ae zFJ4)g-&oYRsLb$%w>K77G?r907>mNyXP#G$0GBgAYyRAMMrLxLv9!@hEjMz*%h1S@ zMqzsjqw_)S@_tq5wms!agIBcjwHPHiFyVGEmkP7=;7`<$sW3jSmt$~jHV$4IY?Pt3 zSQRZ05k(%;<;}0B>c%NyV=E%$DZxr;g`dZuW;qqc%^plUA6nH^gvz>u%H;}`PwWhD zu0j*nBDkWjiqTl*r)sdnqp48E$BK;0Amg_mTJ>cHr*e3Pi#5?$9B#tsFDkyUrLn?z zP!AdhE?uRDt8WzrEbNy$X3!ss)j;OhAEP(K1c7o!^0QE~pwO5R%$Zj#uD-nSU`uu$ zT3=zzC^v@6jhszQ^X66L7{2o2j>7z=3PilZ9Q0M?a%0&l`fDkx{(&oM`-~hR!x#yOiM!4Sz=~rxU)al}{kr6&pXj zG{}r1<87^cdm}WgEQ?S9qqSVMUX7Lt;}NaAXc>Ca$SOA`!}JWJDO`ars+bax9!b~F zZggG7lUjKWMzS%30s1VYiaD^eic05z=nLoKGKPaig+>O#Sg?qAZmx%W4tvS+MnKQt zP^xf=jo{Qc#_^e1y4Pb|HKHT<{$*xR(m|vzOAD5=4mi>B+)xf4F^QFV318~+=^n3( zbajS~PFpl5C$tP&a$?yTY%1~?U|ES*(3W&n*H^W))HaoLHME_tt;8y~Ww^Ru8)=tU zX?KkEjaILy>K(z4&5X(Gr8V~}Ahj;O&@kH2T-(|am3JC;XY8HtTOxl;?77C5bd75@eH$k>HxJ_-yu+g`KBVD&lB#)lgQ`}8eU#Qv zEpI`lq-bZfi5wzysFxO~>g^q+?3KOU+p7Ed7GiBhYipCHTBB9>M@9#RM_E|uXR9Hc zU3S~ijxLtKt90wSG-_9}80y)~H51!L@TzT%FX6VD-d@wzRo&Ez*9*7THg&D8YU-$E zC2iEOeQsI21|{N*N;Vp2Q5Lx?%t=#J8Qbyn^xm>$1AI~5xiNLFBXP0 z$j3`STcbTg<89+RHN3&Ou3=?YdjzjWMx7l^wOZ5QK(U)mThr7 zbxjLQKe%pN_aGG0+Qzo`mW>ae!=g>YJ?PxNZ6oN}t$m|IeS=+N&>IG97`?b|Vn~BM z7nK4XX=4jfViBzdcOB{*r9ZV!jB9OugTvju?bye&))gJ?YsuI)30>MQZrZN3j_^gg z%B!ntV13%Gi#*c!X1usl$Zb(67fV2nn%eW?3jZmB0Mqa;@-DM!z<9Ib64qI zzQ9?D?h${qo8oFwmU|yJUsxs2oO?^XJ_3+T9fz2|2*L05#QPE=6tEJUw6JK{f z)l$(lt?2ve`X>0IHo|VDGgwtdo5XO+=I98%gSE>V>UE=iea%Cg$0gLM(cjQJS>3-C zKC{^#|MZo`>{kk%0lek&BoV6W*L z8;|rcRJ50LMXH;vsLTGThI-LxR~_Oh^wQ)#yDN5%_hImiOv<=bZf!?Cc?Yuu?5e>* zL~K;2A~8d8ZA(p4ZF{>GiTRy|?q=0?II3@{f#U5GVN zL16+6iEa)7P6za)h~`WrP^K%=*035QXLQW~EZ92KC!RtDovw*Zm27xJOGC7ws;OaJ zZH-nx*4{VBAXqoBX}EUV2x2yZ=8B0;G*ivCZsclk=tFDG1 zx{8#n&RP;ob;_EC_NoSERKq+SOdusYSYbw)Ty)N3GYj zi_Y){_=PhE)~}hm@X~6Qu3x{#IY?gLy{&I!cVXXT_qLJ2zV+(|2R6!|F8j!Fy*gv= z!a1^va-3LIn4@nv%P6anw6R)7RX0o6SH1>LiL93ES<8rSSZutlrg~d%HDasu4~2Jj zS!FE~)vZ)PR*5QZn`CcGROONqqT43bgx#aHZpY$s7)^oCMMt}b#=3c4>RNl*ONr)) zm<5HSPGL&3S335TA`98BmX78w8Dd%!f6EZ@x9ao*vz;Ivv4wywq`u4br}edErY#V{uE5=#uV+`tSnJ~75{u0klQ+}5k|B$RP2 z;!F?>5M4D@a9vmgt*-AL>K*KZ3YbRK8WNMCrCY~X_vSuV#Ae-=M6G?SW26`1Z=|Jf za$E)Lfn9bKlaW6n&LcsIkq`BOy?T6bvT1mSrUGyj%RKTn4E6R+YWC{QwHjy`+BB@z z4KT7AfLKj+N#L*UXCFgsi7XWutE?z1@d;~J(6~Zssw}^9qGYtKs-?XSi?8))ISX!#F!>J;+!cpV2u8ylSyRR|RYYb=OT(qui=?GQ_<@2H-KQAgS zEnO1KAMJz2V|`}^FQ{s3F6!I1v9GtcueY$QYf0fo47r~E;Ar3Wfia9b6k4*VwDiJY z;ii$%zLC-4p1!d$tO*LY^^8nZ;6sb?zRALEi-3>!Pi)&5EZiI{Y%L8I;)9lo%|jFC zo{NG*!-Zr0;4JJLn%Fj`2tC8wwn2K~rfrZ1zbPE-!#bnCBg0tqV@czR&dve~%j_B~#p_$!qxO`Fz*JSka3$`j zd~xa)%^J&HnzSP5tcy?$3>{k{S;5VTj0(4QZL+q8f2g%J#`M+|8dizJqdS|shhTth za1yFCq^(4t73G8pdlhTaYpZRKVk&YRTuD-`6nAZ^U5yQ4EDBgbrJa*Dg>Z0nv{-Y# z602gh@*k-O1Z?IQz+14R)2ISgk>ci?Hak){76)|F18yp_m9Awub5@V~#pu_dKtPr#sd<094vCqaX8$qMF zdkntDcFOpp4H0Q&7|RA!?I}rihf-CFf~=`|VuOn9 zIQQHoi=x9NXUiyY=I_{q=MH3ej0Ptk16U!6F{ca|E+16yVET6|7SERbxp*lSB@CP_4PDEQsBo ztih@+SYyFj3)We1r3LFP*kHj`7HpIj$l6xzA*S@5T0@}0%B6W$#+gEE!FG;TwHF8I z7UvAeI*pK-1ZOxsTV+AQO{<*I&{-pc@K$T4aAtZ;N!BUNXwS;-@qXEDOzCjTD&vFA zo3O3b4Q+1cbchDG7ju(pH4X!stHtKpW|~6n zPp585-1~K`a@7*Fy0y6(dmPs?6o+}-{GYh~+ax<<%-b}XEM`i(&Jm=cN48~CCS0z| z9hG@R62;(c7{`9x-ZPEZDaQ@vxDDD{VMErXGEdahu5PHVRecp{aE|e?!cyA@Y(}x; z$NqUhZTYQnt!&oNqBiYa*id7&(A9;YB12UjLQ2xvBip+-*CeFLI!ShW2v3t*`%dg- zdbU!VA;g`@s*R&qZn(XxcBpEomrIn9wwkuu^AYMKYSj*G?ngMY4&ZQpg*`D^TPh17 z+Xw9htGMd;pvH03)zrFD8s9QJgr;rf8AgLWO<60{=#F9TGO?mm@!xSs)F7vMa&Dnk zruH$3v-)AB*1>O=hQ*QUV;R_Ttk@BeQL1t0k6;#U?rNLFj+7qZoSoTmwMzw?6C;kL zn7u8iv6iAR938fAs2698>M<01_0>`%N2Q_%HU|SeeTYg`(T?`6Dc&jlBU=u#u1SV=Jjj!e`ME%Z|-p&jijx>}=_l34fGb;tmavRLi3 zv~sC4bzjS)HTHoMN+kN(qfMPtw2$=l4B-4(O?Sl#lqgWDz#;|86gXRf#R|wu1;c5y zxm^yL&>9RfSRK8l9A*vX&_1r8#A@o)oP)NDvl_Z)+C2#TL`4oB;L{`x?QLq?rq0(; z&N^SC|JPtZWtjD+3u|(tPWT7;9&H)@_povzm3)60u2H%8q#|POB-Rt+QcK zu}a#(#))edj{0zt6g#w}f5SF`7G_X#BtpUVYjOWoSu*BvN;^0vWeu|=Z!2eiRq_qi~YM#bA$Gw~ZR42)q zqdHqreTah`_OaEYVr*on1p(GIJg`(grao}vIfYAa`*@zw*mZQ*RJFQRMvy8STm5TT z_PMs;+REzcrNMk|0;7DCFo-A6g4pr}YppF`Frs#J!=qzo{$JQ7YE`9pFs+- zk_pvnhuFLbFJDh;_IU!{4E+@SG$T_#9WURV>*4o&_-HI&X|8LY-Ki;lc@`EVx%dod zRchLm-m8qOJs;JzphYL(bFM2=gI6YBm2`FDhZFXBuQB$MC(p(6Sv)E?4Np}nv~%-q z5Wc)CeOD!4o%G?veF@ii_Z!zjT6Jo~&ByPKuSlJSZ$&B|=!ji>26kG$>eNa%AD@k# zmT$#WK0c$nA~pXC^F$5hX9ew=`3&!h)Z{B^hYXtt7p!lAd%1NBZydu@pEy6Emkw zoblPQDKwUYF&PVSF>>s~T9;x|*CFxD?vu0lyeS_A#b=@*RvC;K@i{DJXNhT`fm)Do z=A_vyW4YI!LbjGIuDza{+u4Dk2Pnkih6=KD5gH6L-S*NYMtu?$9vx;UhV9Sj!{?MP zT7;G;Dtfylj9<}qscKEeP9=<%&cUEVon{X%d6ufy$*Nl}dsk)yH=nbhbQ4{lL5szE z`Ds2D*f{?St919qjX1+n{h=s>`0Uul+>L{-%~-d(NGDPT`3SWo5r)vhJh#G0jTS}} z4dX+d(SeNZMF$SIUPo<0b~n=bh9vh)1=l;`b1m#2LJb1XhQ$1GPoA7$`512@O@ zKjSL~Pkg=hGxx}HzFAO!G=AaPxqkg)JnIkaJltOEW_>GhyX74QVt*F_S&qDFq}}q4 zK7sEDfJS-z4gh6RUN3I9JbrzP@!Y=1$7=&_x4hp&-Xv(0M>)2w=Wwnr3KBt?DoC~f?MAD zXYhbLXq1PNl45-0DGZv0M>?X<|Z$3SCjH~z2z ze4Nwmi~8~6%kJI&aun@&5OlVK?q#3LRr&n!ICZIf{^+QU zvpl~`YU8Z$MW;SuvCDv`Osy|X>U+@XW|hxhnoyU@kF|%M7P}0rV5Z6oh`iSw7Orq& zmw^?^RQ`-uCQ=4g98>eT0*PG)X2PlYnXycy4E);k)O`NrOzbkWEYUAUaRm+#4g41H zREuHJhWsQ?j9|!2>c%+}#x6r~zG#$1J>4@H4evSUCMO9ly!&hbjE?G_KEhsq*u+EDPtzO-H;r)57}& zpQD{O1<%r&rD0h|Mk0 zdR8co)BXr7j;x*ti6h#dp2d-^Phd`@S`S{wW$@!rN3|M!KOYCGL*tv=AIU8$l@9`) z2gB|5clRP^%5gMuTzq*wsNh#^-U|o^|Tn%yR({1TxQh>>3C!#J-vk6I=>m z7h($G2Ap#dcH>-xaHI9RyFHo~B;Je9vIw!S&L`Z2y&K_X>=_A{VZBU<0K~b8c)0~D zEm&j0dJ8sLFk-=|1v@Rc-hvw}*lW|R_CaOMGoa3JSs!B`;UFOpt{KfO_?1<}Qre@R z5d4FLTd_GM1m8Fz%I&rwV?FVGgxFwSXW<7dc)bM=S@5t0Z?PcvL9C~M5cL)l!j5Hx zup9S1o(-@MA?mLrM13_DtS5wiO%^WtBR^{4ofcegL22hUOYV>*7r!?@tz5|YpmH}@ z@_PwKEc>DSAaUrOjs2L3g%S5@%>O+h^4}yx{yP@FDiM5`NV#8=c3QBB5c=|0a7pLS z;Idq&g|D~Z1`GCDu%8h1+3o%z`x)~23MF$K<)I((OD!0}+(n%GKbET}q#X!RU&O+r z7VNa(dJAr_V7~f;hVG!+Sy?KPFSKej;SU`M2(~1eV zqdXwXpNjSoa=*#^mkE)d!givcU$NSImepRKmyrL#|A)Qz4veb!+rH1)-E0=fLP+R! zLzj|5LXjTQ2qYvVp(&aUiKLN)rl2UGqSzZMDuTWD-ms#gKkU61u!Dd`vAowc=i1GJ z-p_si@jlOA_kqo4u9-PA->IkUoUfEH>a*JUKFgKo^bc1N z&(B~N$ZJ=!JBdW&$U^i#`SYrb;j9-DQ=Q>75lI@2Aj49T^}_f~B1|!Qy|_`_ByJP$ z5FZww71^Je-VdTVenETK-@vwFw8-yP=-*4^`VMMyTmloN$BS8Fu2?9}7mLM8ak0p2 zB&NGuTrI8@H;Ctnmxx!2*NQiaw~P0R4~zW0H|F!4__Fw#_>TCI_=Wh5_>*{0JS5sK zCtY4UF@3)nD|Q$AiUY-AVv;yUi8I6^u|%vDo5Ypk8gZj|xyaWQ(w^(Z+r)>&=fs!A*Ti?l zFU5W0ui~GgnXg%1&c9%9ai};(Oc!T~$BT=_72=uVCh;cmA#sQJuDD11MRa)`J35G+ z#hzlEI9MDZCW}XlQ^Xu`zE~_)iZ$X2alLq<$d@>>UTzZ~7M~a25Wf)ji*6p@v0tp% zUrZL$#6q!LY!cUs7m3?M{;C4geM;OZnx9vI|CiEx#Xm%!&)KiDI7l2RP7-H{$BEVA zD)CJ5VsVRjoA{9Uthh`3P~0OP5cy>c%M&Gb69?HOO zEi1>o|rudooqj*U4;R1#Iy|dU)Ob{oC)5SSr zmAF(qO*~KBEZ!_WAU-4R5`JYBp_; z()*=6@hQB#SKT zVG`#yJEUJHQ6KL}e z^knID>6s*MVic0Fdx6+2UMD^*zDc6|?@RwCcI)QsKU$nEJ||AX4Hc$eBsP#pXPNZ5 z;$LDX+z4X)L=y2vOJ|d?w?O{$F1?)NxvoiiS#~c z{**NBZ7=o`hl*pxOfjE?{j;UZ#Cj6tJV)FrJ}5p;Vw}Gs{jC_;+u5(bI9bdSi^Zkl zCh74cg!vX7HqK%79LU8YJOD=wG+YUvBbTjYP2^mF1z^8Z5mH!%i_A((zQ66GHu zX2^erbg8&Z{;NsU`#KWG$cv<}CQ-lJr0m$W&Pk`cm_VYQ zM@i2ROXa^vdbxOxxJ}_VOFt=oApg&#_euXM9of&x&rhN}y`}q0A1!9fKTo<+Tq^&Q zq|X+w6(1B|5kDnSzOSW!5u^G$`S%mYiZe*WpCw%?E*H;I`1#UX#0SKk;)mkTqHBPY zUyL|JoG2EGBppB zklrc%j`WApyQROE{#E)9>BzxOeo-Xs=_=hzda(3x=`qq1q_d=Rq~}U6kX|HRBfVUD zmGl|X8>KHM3oPp@={uz#l75Cn{p^r_L;79mFQoU7sMo*5PD32sTTB+y#Q9>ic#3$r zc>J_?GyUct~t}l#@>vak!WwrjzI|)1}MBCUJwfO?+H@L;OK>4|Vd16$gl;#7uFH zxL8~xo+n-}J}K@HKNf!w{}lbhoP7I>$zrxxEY^$b#Y@Cn#plGg#P7sIV#nc5K7++E zVy?JAtP)p=7m8cOd&HgMo8p%w+TmO2-^I2goP2wTL&b4ozE~pGkQg`1NgNwbm%e~R zKfP4?TIn04@0NZ*db{-V(yvLsE&ZAF*V6l>f04H1o&3Bc?CB`oMLJG;kaUvtXz5hx zOzBzDbEHe97fLUYUM792^y$(UNM9;_t@I7jcS}DYy+hnZq8`5#_mOC)U#0yCPIzx| zxR^mA-VEt^(#K0LmR=%#wzx&SUwl>kfJAzqN&hN(6P^6~k_aCtJz2~Xi^Y0zy?CW~ zi}(zQbY7JHMEpr~B{}(Z6XV5HaVClVi=-EbHS%wi-YDK6-mCD3rFV$$i2Fo-A3!0FNZZNI z{;?$XA1sa+^Tcv-nRu3XwRn&CocONzz4*5no#N!zlf*G*sPrfj_KuUzQFw{iB%Ur_ zF5WI~7vB=U5&saQM>+Wo5XXvnWD$PAlf*HiTDqBpJu9WxNpFz8f<*kQ$pZWsq{8o$ z{}UwAeUZf6{I2vDB+}g@y^h@ zq-&&?ORthXLwck1Wzw5T|!oWkD|zY_O}e~N9!ICggy1L81ow3sCph{u!X;%A+t z@!k>3bq?0ENv|O{TGo2$3&^u^ypY~Xo`rEDeJ{BIzhEx?EO{o{MfxrB4BRh~{+c}9 zvc8l4m0XW?KGMFi(Cg41B--UDaxGr>AU%#e&9Wv-PZy6B8^p84tHe7+3mfm>dBk>N z2eFHY+aM+$E}IN-nr(=~v0D~#aZG!ae-JaE)wg+MiE6f_uEi~hUbYFiC2l& ziZ_Y3iBE`6i!X|=i0_CWh@XpJi!I_GqFGPl)A~=agYDQAEA|xmtO4&6#)~7xapEK~ zL(CRuiL=EDu}W+Zo5hpFQ^YewK6}9Y`OE=%wRnSgi+H!lXAc)pT) zq(2e&iDuml!vB!AT+V)G-3%alILz&&n;>owx%Qv=T`X=A z{}S=5A11tw=oe2A>qN8e1nK-o`cu)YJAwZp>AyuU#y0b9E5?Zf#T0R@I9W^+r;9Vi z+2VY$M63{-#O312;%VXr@f`7D(X3yAoi|F~D&8wTC_W)RExsteBARtBNasW8FT~yA zPvU;@ckwT=jn}C!zt~$e>tK-XQPLwsKHtdt9V<>2)5HR@J)R{Jj}uG92C-Q@Njyb7 zS2XKmkj@p-SBp1@w}^L(_lu8-Pl+#xFN^PsAB$g$--dT zcS*k^ejt7>ek~ppe-mxYscioU(X0o8?k*iqcEoyC@n~_Pm?P$kbH!uD6T~`knRudj zws@X+nRunRRlGsGUA$W~>x*FDW702+{}JC2KM+3`zZQQG_lYgyAELXBQ~pS?y%-~Q z7ki7tMYB!`c8!%b>y@BqNau-W-4gtdl|DhN6PJl6il>WbiI<93h&PD0h!2X7icgEr zi?54siyw)fi9d+@M6(VG_WmL5YwOfclo%^^75j^W#bj}em?mb4bH!uDa&eJZCpL;^ zT@~y(S$e&=LA*e`M7&D8R=iuhUwmBLF76WF6h9O{759kWiwDFOkq=dK{CLDDF&2^kQkVJ_~xev{|PGy;k}x@m%pz@d|OP zc!T%=*$vM@h}*^I#GT?U@g4C4@pJKO@dt6A*dqQRn)P4EFEYx>x4jr6#)$*P;bNjV zMjS6r6*I+Lah5nwTp*hDW5|Dzbe-5Jt`t{`8^!a*P2y(pdhurQ9`OP3N%0wRr?^Xe zPy9&yTKrbrFa9d}{7${$^@yh3I*HxHzG8oIn3y1r7RQOHVuqM2&JyQ|3&aYsN~{-~ z#1qAn#nZ*J#0$hrM6*r~?QyO2P2z3hW1?9%hj=@r&AK`0H>BSY&AK`Ge=hxv_=9*r zY!Uw!-8g1)9JCe9dOGON(%r>?I6xdGCWxcOabl`y*4H7u9O-;AoQSs`$G2p7@dYrMO4@Ni^&6kk0SY ze~A&e@Tc8v#AvaT*i-B)4ibloM~f513^7}rCC(O0#0s%SY!Fw7t31V~A;x6%B@k8-TagW#{{vmpzo%-{M9mH6%r`T51gmd~vRLtXM8C z66?f9@l0`}c)e)WOR`?1?-w5zw~MccuZf?EUy9$0dquOZ66qe2cEvdL;uYJAF=BVI zw>VHdN=y_}#PQ-}F;ko_&Jt&f3&av}k+@iF6qkvs#Z$#I#f_p_*NO67CVjQIRlHd= z>pc(p~wvAx(?>@LQMW<4p= zA0eG2juj_}>EbjoPb?IV6^li){uJq+AiYFfDy|aEx>UqFQ+lI#k$9PSwYXKhMZ812 zUwl|J>sXQQbJ9D-UE({US>K9ypG$u&{wV$|+MS$wjS&4}N3ok|*1;mZ{?dcR1Tk40 zFPe3-h@UAvT`Umih{uVgVwG4UHj697Q^d96S>n0kCF14c7V$dqHt{a;LGe-X8PTl2 zh5fHezb?Kfn)SE{|4RBBaj$qlJS6@tdONEhi!ovs(X7`+x<^STiDvyS{3lAMirHeW zI9r@AmWUPNVzFLaCY~ssDy|ndisy@$iC2nS#T&%i#k<9a#K**E#23U@MYB#A<$F*1 zBk@adkNA_gU;JJCON_u5B<6fc>@M~e2Z~3DN#ZDRqL?aXi@9QvI8Q7V%f%*fxp<1W zRy6C6QO@(EFB7j6w~0534~UP5FNv>;Z;S7XpNn6MKZ-w#zl(o~5nWYZVn?yFI8Z!F zOcFk!66Ymut6t|0JojB~+DZNX4U;J47O8iFLCmt047TsJ& z&iWHOh~35B;s9}oI8q!fP83tcLUFEGES8HkqFLXL{8ve@5jTkEh?k33i8qM1h!2R5 zh|h~JiEoSVi(iZ1iu=W1MK{;C!>&j%S~TnJ;Xg!rxR@f26(@^n;tVlQoGTtHmWc~R zvrZrRG)k`&SBvY#4dUhERpRxcS2o~I6<5uP7`y)LUFEGD=rbu^8?8LT*BS82^(w~Xnh(Cx2#1_#!XMp`YT=x&Q6FZ1q#hzk+aj=*mCX3_5 zNuqf^0qIVco+X;+6ySfHbg5V+)`+XbH6q_-PCGY>7mJ(3E#h_Jt>T@cdF}!GKPvsS z_`GPIgFyIe((j5NieHL*#Gl0d;_u>LqLF?Zqx)53!#(NQ@UpisQsdVx~A1) zi}S@&u~MuRmxwFGRpMIl4DmeiBJm3GYVii~7V&QJe(`Z}ySPK#DSjY+BJLKy6Zeb1 zihqf&IQ2WRz1Uea&ljQ2_Q!^K2#tT;h5&mUpGJn6aOv0}Mso=ZZ!I_XC7MDb*C zy|_WVK)giUEN&5R6mJ#p6(1Cz7he)z7vB~?7C#ri5q}U5h%KVka`*iP&qb`g7s zapFKRg&ctI<;BTjnmAjWFP4htc`EEzBi$e_7tQlk2tP~uT=7!z3h`R;dhvGgZt)TE z3GqMVV0=#{zAt_({y-jOS^Gr(z5?|hqPM@J+ln2<&f;Kkn3yb%5i`kQIG+*Cb6(K1 zr5A~d#U{}_|Aly`OPlAwpf8fXOuUsGVOe*I=D9HFN2Ja3VbHsz-xEI)_lXC^KSdjD z!E}9Ml-O77FAftE#7W{*ak@BDJWebXtHc`7JcovSmrI{4o+e^>lI5CdS@;^ktV_k^ zpIO(4X~L}28bac`u0#^|)W?#DG=;?Yokk+9d=mX)9*OoYAyL0oB=YCR{X8O;vlxx9 zfelUm2*+(Wqv15fX`Ep|L{>%{dk`r_daO7>oFb-+#y;3pL=Dap7l_7AtZA#E1{+8i z*(|Og+u?dtTtlK>)`@45sGp7E`6TSSSlmRSzBY?nNEGHe@g@@Wcbj+@2|Mo-A0kno zkBLu_sMlx32VKyx`)xM}yZG(P#kLv4KSXx01;B z6B7CTOd_97%x8}C`!&obQ96Z0enryr$Y4Do{u*lJf1ScjIbp|6>0Ko3IUwCa!Y=ck zJ?tN_p#TT)7LQgX`Z z#8HWX0RCfh{w5_RjvhTa5J(=GoHEwIF$ScnTM6fRSro&(=}~VmhW-vNs}G^G~5@N9XZpN z>&s~~z0C}7Nk+-KlIBptL z%NCS9)6(fFUuMUW$M@{*(2$jqZ6EB>U>}TGZXevS%s$v>seN#4v%T*jmwoW!rtK|7 zOSZSnE8X5wGHZKFMe6pJ1@`uqDtz+ewzt$I*$2;WwhwN^K4)Uzbx32)Dtljx&)&DU zjlFMATYKN9?d*N;TK2)4mOQY#JMwxHc|D}OKE!@L00ebb`seN&LrSmcz5oQ5E$ zfVC;!*se4=XU^kp+XY3cU)(wt?}mSs1UKHp+}+FWv1$-a`2 zr9)R7sw@ggDxTX9lE0DT3&i409+iSZ&EnSC@buHrq>kx{c7VV$&bN=|ey|Ha` z_PWtVp7yCfM_cZ=XIpaaTGvvsWgYfk*HZfFmXdWXCDCQ2{Ytl%mY4M}`=Vr9#jq9D zu##Q&u*BE;^jp_bmbjzE6PP~T)qh8e71+@d1?_9dnlS~|IDaoj9BWwqYw0sGrgyJO zJ+LOJdkJZQu~lgYtisrm_gbt(+W%flH_>N!^o$-=Q}?bZ>ruj7CnDEwyOOJhpcfBY zu{zFu(CXhW`2$zd^vjXbvDVl(hgIACj%m2p#BlZhuE7dCzNh89q0@)X=vbAycg?Jh zB}^~i>QVB+?rtILui4#g+OctYyL-*(5m!IU={XYE9-REj!PDw`$!UD?hHZtn`MGuS#}g&BGqYSNEDn>i%2S2e9~s=lSF?aQU>`!ao_ZyBWxuV3^(7oCYOvm5I0cYZGbmmL= zo3o^Q^;!75giqVX?$y&9dsZLU;+b(w=@m$i^B{hRJ;0w64-^&^jvKfFM?kEXz&r38 z1GPvJeh5Pv)6Y8<~-Mal0P89hN2~Y5Xo6GjD$2tbLS=7~Q z47^>o&#d@yMO=)NLbrL#=Ae8AxFY##F!vp8;2u*(A5R2dmgjyGXN#_}&BiCvELZhK zn72gwBD*3#k0$~{7_lRH3h1uIsCEw>j@a(4e*77oLFZtk;ZB`PX9BEtPpzi&SnfXk zd^jWcdP|R|kcWBil{j^_y!Ya-ZMh?HF6)`|Dtsb6KF{x9n+W97_Gh>(_Y+9Wvxq6U z_cP)N42xJ64QE7`H8>^ra{XVU_XiZM$-5m%HhcM|$EDtDVbL;gXRMw%$;)@it@82> z@h5xl!@j3@6X0WcN8r5L_Ws3{a^5V|i`#oU((!noj6^2h3sCD`?^g(o^d1X4eBOMx z+jzOMw5|747}Czm)gn<|t^x6T3y@}eZyD0;;GKh9qP_QGua4dWNIAy426YkZy#-BcQN917(WjPo3$pnPb#XK+p|mGF-M1mnh?+}bqtCM$f7?BT zJ@^7=rC@{xvWmqJhoi@u$Gzh$Y<7=jXF;5sh?5S#B<@ zk7#0Q?y<-^qUkRTq)NdD_B_?zkORwZ9Bu9j->69`7LgGz55S z;ca;@MXIN|_+^-Nnuqs9taU!`FyPE+Z!&Oxz&jq;f=WySpIT#kXMk(4&&^2XZ(QC* zuSOc)B%4prb+`}B>hX@Y?||^~8Ai*SfGV}UgHSG)75z5M^^UX8W!yE!oQd}PjC%p9 z+VcKr;=YMQ5O*zoQtd|=_fHcy&Gw?`-U%iypMmisqtlZ<##_CGNl%Dtf$&>^hX#`!hPP<>gvL+gr<8_qN4fx3{Bd#%}l<;jLm) zUOrzGX+=-uU~jM!v2zDLV&(BR+E*~8O$bNJnv}jo%b@)p<&Mkj6A|2z%XvF_SK6N= zDCQ*A^NGd+D`p{U^CXjqC#H!ZtBml)a4EWXwJAeX4BrduJ=qkneauLve2NhrVquZx zU1OrT><-bfe1Z$p4vX%x+egQ8MXvWWX@7L=^{m>p(oxZ|E1B3j>2}evXHc(~ZW|qY z0V>RUx^$c9*l*FJyk|)JqGNwy{%1-@M#t`B(`=CTM#qk4)14(95gj`XHRU~9+7li7 zAj`Z_+8rHxI;;2`NAuSeqtltdx%LgLb3SJ1@t$w@U?G>FB)0cA^i7xdOw8sU?-=;_ zyl23IXe;UuR9Uyk4)uuYzaB$&v$l44y8Av-pZ(z@UMzY{2g`WNAa!5Bqu8GcSMe)+v9(L zyCrin^ZEI+B#|i`#Zmr0=s$`*ZMgqJG=Ai0#-HMkM-@emp*!6_oc?3!p60(Bb5i8d zbm#ahQD>3kXm!4SAm+8m@ieQ*zlHTTktLhw=PRTmCo%p4{{!%eoXlZe;=haTDRh_m z`M5@8D&1wB9)%^5Q#JI{V>9NZF zCve{^$_mRphGm}iHg<5ogFX{EEt;+Gp+{6A>R?FZj4R>e=c7T9IR~(lmYP z<3EjcFq3Yde;J!KkM1b{Le@t<<461X_(kL_x;y#5WZf6g-ObO(8Y2t&FkLVIElj_N z{sI4g*q>(8J-}*5I~gT-K%zD70Bdqi7dj`=m^pmn&gY>=XHQggZyrqea&e3i)SKxdA~yKA>cf;n#Y&RSCV`AJ3p`+P6V8fn)dh#-(mn? zNR7DFG01u zlTZxXYksJ}`zAcx-o>!lU$Rgmos0=;B?}jzLi%s48J0Kz7 zC3M^VTTwXQrF6UeFCl;5Wpum!d_u@~CEXrB-5lYs zg}-kL-9G<8Wazt=?l%5?7+AioTj6f&=c;hu4Ib0IA43)TZshQd_H$bD-9&dM|3`s=Sug&+} zMYqS_4`a)BH{Cw}t*9~IJscEK{;yau_tHPwzm|F2$F7Pwmd~{K?mro6y1R3)`@b<6 z(jzL3PTxa(Jk8H{P5T}`fcz|fCTrvoTI{jhHml^(pP0be%>2=z%+^DXD86`li0_H} znLryR@FX8?v;1+auBYhs_-#htPPfnh1uc7;?kNAubU#CPw0|V4;#s;o`Oo3L&(Yn@ z|1z8GdAfV~Phde_pgZ7yiKX2^_W;ZN9SwXj5yJf=4SexsIDH;^L_LOfj`Ho~&3bnQXSwIIN_O!u;q$!46dpxu_wv25i76any}ZdDVfnvh z1HDDJ?O%g*d~eh3^8bXtzIO(}$L;6MY~OpP9{oIy`aU$d_|sV2kLZr_x2Gka)FRtx ze;(8Sl*V@Qzd`@cc-_+tvoo#wJQe}&@yz%0JB)$!h~kf&1$jilWz|n0rPq25fwll0pE9Js9%2pyW01BUJOT4`1^jKWgh=Z zTKwb3G{euQx_m$FN48P^W|nGS1on#d^C>Ui&wK{Dlm9FF?`NEDPDu{3Bg$CcmV0z z%V?R^B^rP2Y8Ml*ZFI-3w=v!cu5C!Y=T;bF*SJ`=o*8IzyVg~Uw0hozda~OEblHq)^?n}4+Z8YyM|ynh%?~04OIHM>+hyFdpyoyBob%VMBj{bJOs~I{4`j%EbAQM_) z)h)40H-_9R;uYonJ506w=nr1)gr%@GEQM`O3Vf@(eVvQ_ zrRVds>v|V^OV4{)$QzXMAoiatoR0ctDCH|n3-+AJZhw`{3C2p`L(+D=n_Ze4?(d_d zw<8ay6EwJghVLElbvi+#o1I`Mwdn*+Zgv9Bb^%kD&2CnvJ=baSWo|Zk6xuD3Z3Z_6 zIfBo2SEJ}oqs>VQdONK*2QRu{O%FjtZuWWZ>lnE&{OsAu^cu=v3UDu7blEjz7Z#IItz}-rzg=&II;nmnBbgYMi_r6jtfa4=Nu7V>H ztv;#%dt~9hUnJ7ufLe*(xd49sj4p8bs@O*pgX8d91dUYG6^OMLdTN;FSG)z%%?KX= z%?8!}1BOG(jfB`I=rb0n*q6JnLd1Ap=_bLlWO}B&0F}qyX$|<)*)_tASlGH;iXeM{ zX;?cFXIoD99BA6lne7IfwsU5?A*S7Wn$9)U-P*Z^xm!EeaJQKSyKLfAyTj>Rd=|(_ z`Ngo#wbSWbql;jZ{ZXiMu{P|@?ykYk^|9$(m%@IhbA4)zaFpu&?IIWTF0n6YxA0OM};iEW5b%P&@O0SdwaNmO5 zkyZo#{Gzm$qhoP5CIq)N`bM^Bf+sj#jE0}R`HoPFCYo!V$B~fJq9Z+=Ec$L_}qGI_*eO0@^_UbH;;3mEng-f@u!a#w%yoR2p$nMiq%cDtLVk8? zn4x^5f}I|g>s!dg&I&U$zzJu1n4w40uH3L)-eI=+t%go|nH5&pYS`pwF@_@NJ9jE9 zyQ4j@eQY~-`=0G*ckO6Lqc>yiPrG)L;Dt$}i{)-VuHE={**FAxcgDcG-Kg79XUEbfD)z7>{Qgi*V{!J@ew2ydA(T%9 z_lcG{5lpLNC;<}|qXZDf1Y%odyLSF|QSIo7HVYP~)w8q5ZY@cdcvyvEMbONEDIC7> za=e&nw|IMUcPEX(-JS663O5DrkrK)Q^NNHqw^wM-u(W%Jdv>&Ayi>YeHq}&EpVnMm zXp_FJNl^yEB!)^HWp-=|I$ysHr`c#z)>i+sPO~jnw+p5s#sJ3~FB!INr~U`Up@#Wt zp}~VpRS$``lVT4u;iw2JDV7r!UP$XWhK0;+$ND)e_VCtfpoJr3A!>yZ2OT5fMmpWxm>@5@KwVQ9+G^rhm5`*zQk|725?5@F(1QC$;S<>c-YP~#KjfmU`rCWXgf{Y?(p zgKFb0X5#_Hws^jX+XOtv-*4w%L)SRl>_JQm1;Al8SZYo>T~^{X$kU{W z$V`xt=?#Q7%p**TU=%0!P$(P>aa#?m_$zoOikAka^g1jRX3CUFOczM8kig_@ML5yn z3T;Qmc3DlHV073LiU-HPMD?{sE%>jZ(pHz%(2Wck(Vx{}wxF4AWb6$lhxoy8LmakQ zGsHZ6oSLEQcqf2(HWWbDOHKg6OTB;AC7Y7fL^37YnniG5FDe<^HFR_5pr&VV3*Vi! z1nUSUfhsh-)VLF`A&*QJ@lEdJf0YG}jZBvCm=8N69HFfnT!=uJYcy+iFbD^J=W6Hw z7;3swaBsJTi>L7Yopwt!ea%UJPB54kY{T(k{gJcqK{vY?h2fX3aKgiEQ}LJHwl$j} zN0=E5HF*ca4>Kef!?xxI!{Joo=Ate*kVq$|qSly2|L2(VTVu`-k2w>9Wh0$5=e5RU z6Pt~fVO&>>vOVWy(C<8Ns5 z!9_zz26HaGh7P8ND#72-=7I}egvWf2oK+Zt`Ilb>nHc|a&|r|MtzevgI}XtpWJF9d z&O%~3K8H`nEZhGyZVloxPscLjFh^3l*ulAtbzr7dI$26?oO`&jGjU^!abq2E3&x{` z!EFc}Q}N*>z!@O8(JwgsgJB%Y!Hr>4@Zrek6v41p@d<7$FFPcAP7i!&dm=u;EjX^} zH!|o6F2iRlJ~!bLEC-xsnsE79Gnl7sjHR!SrwfFOeH%o($9Uq_2T-vy(vbiY% z4;RQ?+}ON0=p37L^r+H=rp9usV%&n|^^J?08cNG67nC+uEUm7qUr@HRx~5{m^6I*Z z`sGa~d_fh$mX|hGE@-Z=uW4GasJwhcX=Ck(y861x5tXH7)gw~k$Hpg*7@3%qvLp!! zg#|6Bt}CxuT2Z;6wzRyex~}s7Wu6wQqG@?TeG?u3gF5*iMoVaHt}%5O9>2V{sk$jx z!$(&3KO(k1_fgI^E3T+qSh}>Pxwv^{LuFHZ6^B$)a|PB9!i`g(veKsN@=zeg1)mzJ zZd_7_V046_J;jSEYD?jT0n7+eh!A|p#Kdl>DQ#X@-&k8*-_TrLU&ri_Vnuc7BDiqt zqP)Jbvbel9849DqB-Bt{55?KgihyaDYrb;X1L6j{0}Cf7xa+3RcQ2VfA8$TKA5{1Y zF54Xy813p1=6Ard2lbAN>lfEE&TNMTZnkZA$9VUWd41i{6WoK|PDn^dM66!!w(-6D zyNf6EAD)nyaMURGiSgj@Byd!sudjP~JR-QO0wy>y7@Fi>9tZ^oT<$O|`ZI>&| zYp>U4BFp04{($?hm4UdP39yoX;@r2n1MU+8gWR$6`c881v*Je#?wOo;jJrd8in}Sk ze^Q)#CH^M3o8$Xo=fuRsge3Pe!~X6?@o@ut#SI$BR6ES;lZZUx`oi>yQ)cw*Gh;@< zj2Z50S5Hq!>gWF1J#Vr*dZD`^;EoPVnm9ShecGxC{d?!SuW@m|H%^|=*Zry;&%NAt zubzhx%Y|$HKi%{2Yc;KP{&A%3Zez1bE?*h%-tUcfpSv=U6xTb>{gXG~UK(&;zB=GO zb=3sp^(PAUkR3?s%K|0zoslqclKV+JK4GH!wUZ{eqmfDf-jm&J=Al5BdIIkMoCJg5 zHTu`#|ELo_*uu2J~9cZ^~g6y$05`4J7qPN&^lHco+fg z4sVpN;MF1EUV^#{xK{?)82#ho`o{I^6X$Nn(!`;MBqR(x3jQt|MolZN!8-cHEDV9X z1}m+qu(XkXmo_z6^h>Ks5=V;3Vv0CQ94(Hq3Y{cpH&r&KO--$6Xts){rREf8rRSy= zr>3Xo7iAO_Tj@>BMU8W-E1Ih;6OdMvQ(RO~JU2VNXqp9!im|A_IHRB-ufWR5FV2`( zlrgg~J8x!jcEKzLXJeUvZs80%Ggees4afjal_I!%(Y)eO3pG za#>+>lT}bzQ(sz9h`BtiDjg*@26DITnb}3f>8VAeA;7-^+fX4h3WTls}3JCn|xnN@`H=NDN^>zb+; z)m2smxYD^WJv*;>T3%t1Ne(6jtEH$YGcC8Wwx}L|lw@IL9m<;BxMW&sT}4eLQl)to zEOpF0Ji}=-(~I*9vgZWD)2gzY8Z+ur>nhT#o2;od_2r9;FmamNo;p82wXm=_y$}_j zk)x7WGznERGd(AxSSDmPR#u{cr@@d=$&is%94uxq*J5T13yn>(5S5Lb^Bb${8>^dF znv7A`smLxpJ9TF9)a)$FR8_dA)!_6eq>CMwS-GVva+lUr8}pqMU~~G^EMs?ib|IS} ztVt}+!-LvHKuE^!4PQWHJCQYXlx9%MX(U) z_2`U+v(wTt3JcB7sWmleRhHwQnVOx0PG_Na)HkloEv+kER9RbD*L;`>&KNXZh8eQe zoUV`IcX;`oVl}X}(oy8xrs@+bGpZL=HLDpj>PpLMDlMGqG$)TNMz?P58dd}LD4n`= zp$d*%OiRs9EhusZNxn10rxoYqWEW?keM0@gG-F|9b9LRK*8ViRFry%Csxww*qWL)H zTYJ5gRxm%mD9`v77cZ`CtgEakrn#`HsIs=fYEY?}X{gzp_6>DeW>K6r)tXtKR#jTJ z$QcBjath{Q4#=`<>gyH-%%8&s>(rdQv>C;P*~erQ=VTWanf}MUIBjI7=DZWoPJT$rH<-<6q269VbzB8#77MMx3ShMt0F-^qOVrK6QF;mQ9QfbYN zHPYEmpUtda+88_n1v_HiG8~EOQR?*C(xS%Fx~5W|!SPryb7`%W&#}zv4bJ_cRz+WM zjvv9Inz^h2MxmyxvA+x`k!b}?`CC)f}264s&k1sglVyD!) zQkEkz%$=m!)|s<(Btf4_#PNzY7gaVjXE)=xP?VjUQ82Q2jMI5cg_ycJL)3S<`X8hC`YyF5LPjK@4N1H7~CT9OJ>Nw_% zAvC??fQ?)V=B1%&bOdErn7XpLvPoT)=L}AVDdsemG#V3z`g7R13T+A=&}B^Ui0-t8 zsR?uXf}RAcoIb#I&>ZR<9?cYZ*c9XpA=3eayQNo_o88NCsc1Ezfip127UJ5E=SPL* zrOl{XR%#O_5T30R7YFBGr%NVjzBcCouv|UGbZ3kxduwAm6glhj`ql@ zX+S>6fQ4@Du_H&J%Z7$UUcS}fOw*WSbEnH?Oa(+=S*|Eqn}H{fqZ1-iksru_OE%N)MUvCByX`L`aAoEpS{ zS65O$GZ7k`lSURj>};>~Fcfy&E^a-Vhaa4*sY{zO%_Tdh&*1FB(`0kv8#bW+dF+*$ zX;o%gNnP4p&k^xIyG6mE=bEz}EITvSEc2RC|!3vzC@OaXixoI<#cy?idb9IGt!@Atkro}w( zMYC`MtFuBEW#|Ca&PgdR$y6<94|JsB%$(H1X=cI;j&+RB;PGjym4gefw5l8&%FXf2 z;%rfzljpRdX(}DDWikr5B50~p$>@SQ+!i%wmYX?>`(cU-wNGe}m^1x+Tw`*=*O9Sk zdA)OBG^Y7L=4=#YadzhgYiMFVZ02_g6&&ATlUM7Y*JVPnh0bIy zdo)yaBSMp9#fr45#a3#%b5PA5S(sFupO)*)Cp^~~UF4kWBnHn8r{?4A7+3zd1Ucg1 znO<48bWv_SX2kkNr+l-UaA6lVXNImv%sGQO0vvG)rABn@)wwM@V0cM+?Q>XVIEO3K zA(O1aIccReHBSCGqvttQI?gzqvk1C4{e_>QIX4q{YRzF4I$PjmfFT$GUE zDBuX?39acM!4Vv6I*ex>g`8UeiJ^AHJsanMh;f4pGIO>YoNmI-r0azd%!e&AraP<%&=Ry2>oT@(z^0u%qqMWm7XytJ1xTu_+XC- z9s6)4SeVGp?aUd$`VCf?Q?T5;^x3#!6g+JUyEo_D3^Y?5Ep4p;j*_J0qWYv!oIst# z)9ULMRxdIG0(VD3SETvbxRqvdV3G6ZnlpO1XiMwd-P$m^<7j2goE=CDm~UJH{Kh45 z<{0L^CN zrR#{MN<$`5fs@g2U0++>JYr!ZF7`(>)T7g2Jemr}NH9~g=?uXOoM0Q_0^g~0M8%Ob z*zUo5dFHUkBc5|J(u@|wOfq#Ix*LhxM)1T)F0C>5VKiuUYVMqqB zVAly=yYh5t_DtPf37%%dDlC^xOB)v$!bUCPmumrhH4{J+1~SxyfqbWh>KmJm`v0NT ztyF$}S;}wiu)339=%hIyN9a}UhBj!M*qf!g>tLf z;|I~YK?gT}$(h)p6)#(;!Mv5_gOCd2r_L5Zuq(?^yM=B_(k&6_CwaTUDsy4@ASwsyk|yi z@SNp7oB0M9K^woIO+Pa2BW&ZB&}r?X*Ll{vPd~Ce{9-y-o+IrEere6D_=R<9d(S$S z&5CbYS=(G%1~xZ3tO~j?(3-9IvL<{#NoPDd-Qj~j9-}%G)H)}$dOLkF&)n^_TD?Q( z8==|WN#$QoB#zw4OzTH_>fm*xw>g79(zEp}=g2&D@)PbIet{d`SkEbd^^_E!f_hol zgux$AKc{FFJf*;WgN5~0yyGq{E5oc79$Hh6D=F5RB4FxUg!?98UjOu|;n&jI0hwFz zoXKzl+KR_GjK{5u#_F=Ay!#TCikX+#y#LdUZ`5Fa;Nl8yDGow^&DW|>QxJ*q%z`)Y z$atnt!9NZkd_DW$#v6n<+$TI=j@jVGvBWJEpYV9ApgDenTQJ^4cwj|#XuI!tKCXrb z74YE~#EeI~=HU~b-WF(%``{K#uLvID={<||xX6O(aUFdyy?VIA(|Z@1b473qrneX# z;prVfdbEe>(Lb2p8E}WE=R*So(?C$jecci9q7W~*a3wt67KreC|3JPg;KzJ9R|NBY z81C?VCma1mw+rs@^svJCU+Z}%;)SPoAJPlf3)?T4 z-d9JYSAq1x=eD4IpB<6jV`1rWp;IuuLr0{y0_g?QKv2jXgF=LtV-@1%FoL$=K0_5R zxCmzl;tdE!0vV6#9Ibf4ar8an4G9Xx1FY$aM>n@lsHE9k0i=y-apU8c;q~_{%G-c- z&}@%x_%L7A=bR(btL~3QLSgv^)2lin-X|ES*RjKE3&yK}BRt=fCJRscI{9)=3Fga3 zGK2dtiM8>tPiYasu%;u@D>})tN)XO+;FbEJ^v*gWz5Phf7fb~4f=(X5!|l5d>1}}@ z)9V|S-e&j(_kp){C;=|0uj8zl#LG zFn;bmBHptzENe+?v{1aq5D(21su16x(ho}zA@0L+r1s!t8{u29RvbS!jueN7N0>Q{tC*cF ztYg5#jU&O~@gq(AfMPpGijYA3Hb=y7W8!lWptFUy4AaM}L4rYshbuQ`@WXwgOnP62 z(u+E5Z#O~@kKf+Je>N10GkEL9xB46&pDo$Cxv_@y@Nmwst(zM&^x@&*Gd9cD`H1k& ztvkczwz?SmT0O%Ck_qp6L^vKM3ESL40!g`LMdV$eVP!Jo~?m@(*&97Dm4`HaJd;XG%FLI2AF zgB!z-2?~(zWtx4jqDYP3Q<-s1*bktvX)3&T|&AI@-C!3-@sr%KT$D=d0)Ni2A}W z6!V`~pZ{{*>3Er|O&Gu%c(S;-wz9SfU)s#UouT?h+*QSQiTJLzvQg=$wuWTXh5U}V z$L6H2%hpgzv+MqmmJ`uj$U4r}%U4H-EfaG*!Y^5!8$(H9H);>_VVnK)){;}-<~uEX z%@U@9-*6rNt&k#wZZ|21;CE4yp$mOSC;r1E`Ou_)es|^M5nMYNrh+CNzKl!}jxZ_l zaFbf^aXZnS^)=?z5?Hlr#(@ii0sk!*PP8}=yHcF-<-)n#aB568iR2jPI@mSVS>*5P zXIV4h-*$p!@fgf-&JPU#p2YrpN$h`sMEaaBTuAH>k{7WUZ!S#w9&!@q9&$3qA2|i~ zkOA03!rtK|>_d>r_gRqn?jVuxP7?X;B9Y&hB;xNOVbAyEROi}_b|X2f?a|J4xoe;ykfZJV9J8o-D2xFA_J2+r&FW zUcWLwQ-1J2(jSPQiKg5L_p-jhj$$v7b3gs##T0RzI7Q@j7vtrK1>!vMc#+phjCX>_ zxtDsGxJu-4ivDMcxcz4|9~z-QA1WcYh&PD0iT8+{`x);E@mcXDahLeE_@Vf@X!2YGJ$YUha$rI;@$B7l*;;Z7D;s@ex@qqZd$O|y$6Dh`u0dbHxTuc@xi#g(aaiQ2Gt`W}> zuMlq(9~55@-w}6B#|%mV|cnaUCbBfhzrCru}Z8LPZG}*&lN8g zuM}?-?-RF+uZnyv3GLY<9u!?($Da?rGrXTTQk*Ilh-G4jxK+GId|G^6i9LW#U!hb>dy(1LEW2i{gL8x5dxJJ>pN|A<@PS1lEI3>?HOO zk43(nnd$u^ zx^Sz8y1m##93+kuCyCR=Ibyk3C!QjnEnX&W6Ymrs6<-kF6wU8h!JfU+e~3Q3D28@+ z7Wsxp>LhWZm@Up0OT}7orMO!tynf`Y1b@5~ITk#i>FTP>?PGUeDE{+w` z#e9+P_u+n3VzanL+$dfyUMJo!ZWmt>-xv96U8ehsh=&V}=DQQ=-$NWEjua<})5SSr zxmYKjBJ#bvOz$f3X7N7pDe*P&Bk>#Ypyk7eIVA0(0Q@6r*tFrjWsB0gUmOWi|y zp!87bQPSh2Go+_W&z3$$x>EWC5_YT*6Kc7G%|NBYw#b>2oC1KAS(jQ5G zF8#gqFC@y;2DeZdzXOT%0^)FSte7s&63fIo@kH@-@j~%x@mBFMafkSp_$i6cPtw1W zuwz0C4gq=O4`$~@x$I3sI#J=;yIj`P{5<{(=YnAD92r(l1ND zDSjk=E&e1PAd#;RHw4N4VzQVf7K-KKQgJ1T{5O!W>s;x}q^~BC?u{h+!yP2*<4N&l zk#9by{}#OE#& z<$OkbOaAXke=q(;BHzd^4x>o;^$?T9EQRNb^Tjf85sCdy63-T|6mJ!u5}zeu-#g-` zB<$F&@LxqwSNNkIJCNOQ9V&ekiTLr-M@vtV&X%4jJzx5G>1ydZ>6OwalgQ^najSSI z2|FGk@wLN?(r=Qm<2~swrN5CrApIMO{oF{K>9i;DMO1I;AtcfnAw5=lqVzQBnbPyg zK9*G_-K6jp(rcwRNM9x1EZ#3}7he(I6TcJ>iZ*T#x#r_O0SWtK$ay$_mhMl^#eE}b zzW&TL2j7oNXOOe;J-GB7vIy7N(u>GKy#7*p1zBKOtED%PvoN1X-$LeF)}7Lil6jW( zl=Mz=CVpE-`Xe&evObsok<78I{nCGvGjN{{ZN&0Llhbkhk&Yv?@tvylNOBrp{wbYC zX5qU5Y22PN$3t8W8{)Lk5Qk+$WM|0l!g<^rAYw=uJyIMknp=s8mnw~_GVxI5hQ(sJ zc!F3bn)`1!-knAbZV=BAuMxM2w~2R&&x$+5UE-Ufxi5!wKau`f{6+jrbn(6u;V?x&`iclDJMZ_vhfhi5kcG z&EhtZ?>MFZ-QxY?W8zbyxgUpkuS&lqz9;gP(oE+k@mKMXi1!qjaC09H@%+^2&*nZH zbQgv5x12cc`0`Pv7cY($&3!odoBMEJhWvBIS>k-r+>b*%b3ZQ2va03J@1dCfQqkO( zgI+_8ad!?Gjqe-9O(MUKqCejf&Ex1j;=|(O;!e@rze7B(9bo(qM7~9u`bY6s@sP;( zNHaWI?K+}f7b)_N^1_-L!PwrZtUZ|fB;_NBI1`>?lKvD(&J+hP?&3g%o;@+erEg+6`xmpQIUqA8Gl4k#vegv;hD*B z8fqrOl&9b%#d5`y6=hr!eDjo+eWO92sr0#uG}BCZU5cDNw=2Ar&_XK^l(zK<__+5&(E8d|<+scgp zisIK4zoB?Q@%xG|648J9rQ&ZDf3HY8%Z!)tQedvqGF}Q=#z}!EYWP&e3Pl=QX8)>1 zQN~R{pRM$A#Z`(l#!UXp6t^i}qxeC^k0_#;wCyW;e7^rt)$)Fd6Eju+hUaZ5X*^FW zh`c|EXgBD3$n|LDRlG@Ym*O2n)Z^zB z?;)bD?^k?)h+q`L zA!4EK>kd3Z8rS7*Mb7Jx@e(4+`9&hiC+|g+Ybu}XD9>ztzV{1*M*drg$nPE^^7|GM z@}DI_egWlA(DsD-C{=nY5&1MIJ(r05Rw~^=M84N5eLWHR-=y>|BI;qE())=h&r3?n z`J-GO`!mQtOhowxD_uxLImanIfr#>UV2$yV@(X(IOJ8Ppq)*+KzO3}5=~Lr$$KRKJ zCh~_%>`Pw+1OJhxV9t-XR2}mDA9v+-8Foj8!!@de;=2<2RaXsf8Zoc= z5Ox4b&d3 z{ikC;>)L;$5PPGS9&B5F8+KJMD}8bKZOd;z;_cjiBxCE?bfr z-4A?AF|L?8)Dg=trMxL#(+0CB8^k_HyuNMC+M=RN??SXQG)K6w&*!+$M*IjGxa+Vt z?hBx?w>2Ba3?BU$ER%Z~8IcM=Xckgt*u8N%Wh-6L?4Bq_eJl=(ThHaa6eki z0!9}yujrpyRnf;09*H(0B#5#@7mc#p6N@g!u}}1T$jprX0-RaVZOAJ-x*Xwsqxq1Z z6MY%}e$jPEn;U%*A^oGDfD9GT8IQc_M#Uf?k8UKF`UD*UNjpl&v{X9rbM%I54A=zI?K%}!0UN5_vBD#2) z!r22^r)ERj>^G2aVnf?cFk&O61((4a4szKvqZ27PT7sOh>+y{!T9AJS!n63{5Dx|x z0kZGGX#|5=7%zJ#1q`7-oXyD_!BC2cW&apu2!=_~vX?-9Q22516lQaRKro#C;a;eS z2}bf+pLH>EEDVZ2K>3swjN;S*FFTX+OZd4E&i+2iAB=ti{#bSelaAr%L3Z{N^pB-K zH~Sg-$I)Mq&CYyq0{w$c-EmezCJ(4kW)cfCzdm1smpPbfjfFW`LF$@WWy*QR!VkgU zm$GcY_uvoR#w^Cmtcq|n8$?dHPi{Rh`Xmls^anWl(HvAjMszMtB@`XT%8ri0F%qQ~ zIEYTcF&gEYFBYwXzfW`?j+xO;2*6C~cAQbzZ~8JMW&a15{JFOx!plAdO#VF9WJbSp zz~j%SAKTl8`mLa+S;%lG)NeQ%n%`n#GeZ47OCbvk39ElyEaE~#dYD_zSE|2==a97u zSxog$|2?xlm8q7p6rNmM|4d%oa5go~{#k4n1xU@D&Upk(K_JCGkN0=<7I1pe*AeVT ze*spWngK=1hpkG4%0PLy~8|M{_(Xh9iF!nRZ*AF5sU$usf zN`?)@(4g=YELTruGIG!sgbnZ)M6&tjgA}ug2U_`f7MxY(u@3xQmm!fk+e^*adb!*f z&)-Rwt-`V&w5fxSICW5P79v-poc!)!IXB~}xC~+RZvqbHgc1J{_%y2_oWT;!dI|j8 zXk{n|(1tyOijHP8%p3Lr9HKe&`@>jU(E=0x8H7ZKnDEOfW2pEG2g4t$2+B~1;dg_7 z1V4TK%`f5E`D3usOqf**nDS5fUV}_K;mR zqIL_B)V)K@UKMyp%kCkG9X})qmh0NxJh-_>U%S^xj=P~pza&#~%a2@lLxz-HEc!dU zSfEDpl3O{j2b}MagU~|VO(zC8yKM|iZYD9v@ZjoB@{&7;B=W?|Fe#I}O$;@=aoDXx zuzf}$&aF_H5_?PxH~XWENG3LWPuP7zknXf0EOOjE)yDjpvbji+8z>u6pxZ55Q3aTP zkM7`Ze$Jswjb}_YyM+<4ty;ck+=LlMM#kwGLW#Ni@&St=JOaWiq`y~-k3SE8OhiYDIN zune-aM$6bZ{d+XP#&1odNpf@A3^Tj&Uk0m>W+a%!_khpXxy1hvN~Zdn$)^A8&{+mkKWCXJpZo z!YS@y>ab9snT4UOnPs63lZsCr3vKGxaUszYyx^T&STKIsO-MU3}FxyM-QS1^KYba-|Tn&pv zbJxJ~g<6oKso$FUi|gwf#NtfCx>9c@caCD}6XnLD1}S>uN^3}pG8@t?#JR>>5I-Z$ z@}04((Mr>ah@CqRriD{21j*@J!^lQ9ZN1of!%_~~a@vq;t|xio5+~xt3K@+_83Q|9 zvLIGmT+_5^7GM&FJ>@*bn3wptTI2M#wVT?PY;>&&*)q|Jul2)Rh+~j7VMmRNZW6{< zjin`L?2NyGl)TGadBU`5rnqtuHzpETRAXd<}SYJ99UrCGGTTRV3g zgIbYl!^>EBLJquoM!MWuIR7cUQ5>VzsaCF1%x#HLTVCA66*CvNZas!ioY50+wzWBi z)3QcF6Sle}&xVA_EHSfHTUXyWzmB#xX~b77$k-NByJ=k)Z6hMt3>G!j$XcpRB3!t| zomk;zYJS?T`rcP+3%`$qtQEA7{=1m)W2}8!FbyVq7rdpOEwXbcv7`KUI z=9FjGkTk=KyIE{;B}_Sqou?E-bdCi;BrfAQn)bpc0WKL$WF-tENm0!`j>69F=F?SM zO}gDReaNaA-;{gO7(`B(0>$Z~=H%Aw&F&qI-x+JS2@B9pTcu$(YbHG1UK#7t+FbTfxP-B$lg0p3t=K1?t$4qfH&v?T*BVbuNSV9IT8vE^ zb~fSiOs-omR!~jIoP>Q?^AKOjd&1np@;XUuE?|v@>s@VLGqpWT>m{3Q>dQ58Z^`Qu zx5aG9FV)y`Z>Dem8LU!a*azPgu3ak9*6~{gYK?^317CH{;O)VV$kpL%Lf6u^lgrO< zmpFdbZG{JRsJ6wnM|T8QN3IE98@jHyG{?8^WDFRIm8XO`r}W2N(uh)z*N-um#3x1K zm73&s9wLU%dHT_?)Fh;{@2qtDN=Yk8|BNP;hT-~PK#${l;yAwLI{Pik!5H$%5F0R^ zk8yNk@x!3earsKYlb)~rZbnq%YntN%eHftb_F^M{Bxrtd^T+(=;OENYhy5P>tRo*? zJ$|md&qH1%!YGe*VCA*J@5(!(aR6~v-WE_U-`k+K3WqsZzHX3izON$RIKr4O!)?CT z!SBku41|?|sD%G!_}zNm3O@Im*fe*kymBUnBi~@-l_U9>-$RNLhy&+~ZNgBTb>yLY z5I^@kvPWUq5*5eu$idH^$G70OY2fwxBGKbcfc0`-o%NIN8S04XQD@_R1lrBF@C47> zhcM=gspyG(UxDAIf!Dho16q~zsIzgu0PV_q7V_98DK8&Cdmev=-==}rdkON$XPu4v zBLZA`+2cL01!0s2HF82;KP0ee5DaAoR81N58E50N;Bn=h19{`XLU|YsOvs}>3Z}7T z`XMgDt85tR7{}k3G`>e6c^}_dxt!G|C`)pylS0S&31yX0dM5nsEm8g(=5D-Ur5q^}Hiy!lJNb>%(wPbRqmIckrae>@ZmnA~@gi5*)o&c%*&V>it(d_rEO^9%> z4Ec|5zlY^dIy7F#g}lB}-egeUq!&Kg^Kl*R^|&r1cXBc$BzK}q^G-^-klYC_Jw$Ry zN_BfK%s-tTnoJB|$QvdlU>hjGkM?cYrbzD*I!M{HkonBQ&pOf#_>rG&G!NIuj8l8w zR-yZN%YfFApSnQnNMC|qGJTe}LnHZY@6VoAhfXN5_Ds^dKs`D>=*qyhy?l~7)=g46 zLQeO`_T-axPo%4BENs{hLZ>&xw#<1m1;9+a3vinWmMWgA$gy|EpQm^eFawpmi-^S3 zmt~^!z_v+w-9$X_wh(a<*z&ohH(MO%+3wj^)yqJq21zA+qTIV574(M{RKt7C&{;8@hQdU6kk;QmE!Ld4=cWF7wBMJ2YJ8jf4J_(swHERixb_ zmV@tp;**L$R{Xi*Yl?qX>=QEl0~CuDCn}2l2gs{adV%7(ifa@%DPF1glHzNMe^CsF zO@5h*xrzf7IRS>{mwDH~aY|28oT_-TVx{72MVWt%bgfEXpm>Smb&5ABepc~66dzUm zj^ckS{z8#+6Ii~#D9Q{h(76#4K2Whxu~>1OqRgWP|5T-A9yRDnrRx>vDlSrNRcu$3 z`P4|afi!+sYWN2gZziH|bc@nr&jGLVFDt!|IN0+ZQ~J9~f1e0GvFiYQTWR*m8D63| zQL##K5fRT_nRAA6EhCN2L?;pS<%*n;#d(t-QTkIvl=F5Ce?ajujeneo7ugS$ens(3 zMb6Qre6jBU9IEsf#Tkm#it~xcZ;{d+ig-NA`Qfq(^4-bv<$H)2S1eKF`-tIF6)P2M z6`K^B70*;WS5e+eNZ+Njyq7>hLlKn!YOA11@c{+_(8wq`YF&(EIMcW&Rt zoH;p7`!F+f-;wav*=<)Zdu-YEwtYu(_dU{LOz1jfubgU4`$vzjpblO@6IPaFZ! zk0FcX>`yN83emEX&i;Iq-m1A^4Nb=(Jcqr?NH_@J1&p!@#%{&I>+^9O_9w_7EUhyf zs6(b8lywtosoVna5P&tS{minJ*HuRx!Mp{_LzX>2D!_ZWb+3 zMHbLskaY$57t%jCixW5_i#Q3cFzY*%znJ0itVZ%Ip})lIb0vT*ro2Izr3qb%L*(?$ zI0j+XSN175`0{PhLEkP`MPII%^ZW5U{g#|oLf!=oYVrDUkyVhzE(WJMTJK@4K^uSfXbI9Z8vmN*3|Y9|@t zvXkyZS|=%`&Q8ioPCVl5q-=M}O=9|w4-tJ+ryS)Zr}XgU(l1GJdQh&J9@O6ng>XAf zDKR}L-%JlOj~br6-U#&ZdbrM|-$t!vh#}yA?Y(}~{oemhQ(5GZ``+iWNb+OsdY(FY z1$QUz1l*{({uFFCUL-DbQQYiAJ_V#qJ4w#7NNV=D(Nu4Wl%#4;^v(E6bxd6<CQm-Ni6*(!31Gi;@y-)pa5|v276&h$1_o#{XZe z7)?}qVxu+gMwnFEYkae8^6RMgrNUYB?zEwVu*9aR+K{kI_1`f4C&raQD3#M$)4Y<6;NHC|iKjZb=p{NuMm!4Q{>6Y@KP&h&YWpGSEB z1B>uO4Pk84xO6_o(T&9~hTrk{O2NZ4ZockIJ&ZUyc46Jo<&OSFA2I;pU-&en4BF)-jI1TNN!|6@*`CnKX`kpTiHyyKK~b;G1Fz zAbIHc*<$^qUk0C*O`7#b_Z9ry^Qd&{1;fFK^T1_Kv{87y!T9ETf*y4?FQU_oyvy); zZ~%e$B;r_p zUh$-(-p6&+>$r}38rOx88}nm*7{?k)I_{g`y596QNI*!8vS2s^s{O7YiV@gTrfG$4m%KG6)CCjgTxy+VH{m{s54zD(*sNxYESSw zU96swPCv8PNa;89jB&dY$B0Fbw`VN+f9ZkJ|40qA-MK_)CF(8%_g^isK*x6QK;bpx zm{kjL5Ny&A@!7bP2nEbJMCf3a5%GdrNyN*W&*uy@Nw#s03Gp5#@)<=$QW<+HB7$k0 zhEG%!-3|Dvlx|R*r+AiPn{<0 zxpeMW;dA6iI4&iY6eh>=HeQVV0M@n29t0eZJKk8_^ztd?adF3An|_2B8y|w^z8{Bv z$OtdL;rS!W_F+WM&*SRFyZgM)oWRVU?28kH!z%BGV|!&y zdeh)#v4e-r^Z?wbKZFn;$kf-z{v z@gywd7Hb9>(Jz7uN$t*%dn6or9&DjMlBwc69>dX(5n>Us8xV`;A&cbrT^ZA}wS=mw z==~v6S1&RNxdaqrce%d<8JqyZ3)bP_2b&lluyKci9XN)A58xOHmLYWzd=~y_FapO| z@FzeSJ@ z+TV3AB6G;kIN?8&t1b<%m&=(YemiJoKSXv)AUg*G{q;vr?e!l6j&Rmrk%(h}c^g6E zk%zEshI#o-^ykp;=f44w;Q|xRheUXY38!*3JXHJzKSy|^BH&u!0awC5@b@_QQ&=&B zIuPhLvSQ70$HAvEZmQJudtBG(E;|hDa>l5;?5{CDj@N$74PrnacWkgRKV@_<6C-`G zle132=p&!&SxJ(^ff!XROXcrtmL7hrdPo`SE@!yLFU_L0;(p0>iN{z1>5MHRi##*p z=q!EYg2V!4N{l!TFe8owlZnlO#6fNV&md(TBo`#2-uXmg6TzjEBM)rrbT&kK2%s%W zBo6O{??edC@Z=eOj1_va%xrRZ+lJNc-K`tCFR)&-AO@=a^jt~}?WHS1S)UbIo-&*?ziMQt0}&*|o#x96;0v0`G|hIJFycdl=r$gOE7 z%J#++xxMkx*2`N z`Y^Ig#g0ZAMy~k#*SO>cy|lAEQ&HHYy1fRQ`=YT(#U`XXf_fd^Ob%w6QY4%3|MHiq>0kdOUP2@?iu~B@mXAV_F`PewnA5mAN}(B0+P@6THsCea3;X-juLg?V?2(q zk;=oi7Q?R+KUdx^(6*NZZ^AzleplYLkjM0t$Ff*?XTk5v+XLF|Wm(y$Bixm@6Y|JM zd6aAAv48E#y9ab{@-`#fmAA){hatp-y!Wd-`{lP!;{f7p`8amKd@bL8_-z~+t^d>T zyL{ht;#@wCf4Y269EFeJ4uxSu1_E0DHQZMQ2Dvm&29Q>3AZ$jQMl~;-|x<<@9W8GNCy!hkT z57F{{1dZuJ%cMMvpNs>NciE^AzH6pfLitE?UM~5q<8+QhA_TJj=uQKZTQ7t0wNr_3 zo(JD4ww^iG<`mnz1M=RdmIrz`IuUOZPL%sRL1HjLcEfs1rC{6N4b0!F`nm>hwI${w2tvh z@MApvT$gb{3Z3ck{Xoa`{W*NJG4%t}Y#ytf7wxua*Ti&|^s6SlrwHZSV`~C22jS} zF$ z6(3f7O!0BWrxbsr_?+U4ioa4kr1-X?jKjt;XoW_>vGK7))a!I2>a~uDdY7^LnA+6` za=HQS%I;G9tm1t{$a{c@+w*ZnS)TwpW$Ye&oFPU2{))pDPf(nuDC-Ttw@~SG6~&G{ zZi@9v%k_oMh3%W?!=}M`y+|tM9Y;ht=ors-P6UhaNxJ|c>2ZE|tV=qPgLJ$@nf^OG zFQhw61i#qx2fxfCM!cjePU;w@G9Bm&&8JrB1|rg(qx3Q&(#!W|>-x=WR+t&W$J0s7 zC_U*N>m;`FWr(V0nb^XI;3=Fvr}X|CIzHMlwEq6rwzg&;=rbpD*xR(|NVw^9)zwGB z&3}9<+|+z%>%yCtRhCvCiRYGn6`F_Ncn9D9>tFk2G*y;|RtV>lH_T z80yHU{nSaQDAz%UkRQS`?caFe>>S{qkjRLLq9-HzamLeHV`2_4O@)RoVo1dr2!lF7 z?AOO4oGO9oz$1|&sZQ|8y#@K|bl`)OXQl(+&d_SABqBGmwBdnV025pV|Av5l(2YSG z{M`Z9iEIj}k=h(w4*#XWort|Gm4WCdKSksU06zi)6W{5ioE`1=JfB5iKa3V;9L zA^7uxyO1_N_&WRr!Sx6q5S)NK2L^0?gMzmZJ2;qz@FBs!BV=gsD;$Rf&mg2Qs735> z7y`ueGI$XFkpbJ_KG-QmmXCPBe!!z%@Eb&Z6M=~PmKW3^@PHSvxBC>%198v5SS4iq z*bB}8^%F0M;7UL11+OE)b6)Umn8E(59anbOtIO57}1ITpdKG#Q@ z{5cSkIT8XR^Th9EzD{DkKb|QwX{a>PEJQ5x2MCI^2$7w&sAeIiRSS`uRYPK-5CvI_ z8d@;1+HXbD!I`I0z+#Ch$)rvzvP6h+nL}|-k<*2kkohLr&JdzB^CA*Ug_xSjPITl< zAu2N8WSX;tn3>g5k4(?@yTM(VRZHR=IfaI-s#*}|3Nbg6D}o~D`5y#ZOXkZI-Rjd2 z>$1#=j9KR21fn~01ZphOCZezPvU&D>d4+ivIio;jd9h~r``(H`W+{Q_Ib95YY^9B1 zE)s)2*A0xh!p1O5i3xkzcQc0B_S?$JUheZGbDu(hUjp&oO#J*^!%@8cTtDNN@FtT(Aa9|E3_~Xfd=DCJRr;>q=&sl#LS3j97 zrZS5&5I9(*PGcf}kvHUFV34&Od{k3qUjdGxJ0U5^W|+rqB{5ZYN{`SHTH3Yzt^eisRlKZ8Ynw=J!Vuiee(URENGM>oP3_Cv(%x- z;b#pety9~iWVX@$^!0r+#XYA8linwTuirppdJ}x8H&=a?qP%jgY2r&RFLkE7qf+A3 z1*()((}fF`1tnY_F0`Xi!Uc14N>h{#PAZz%Sx7glnT)0S%9__qsIOST zUiVuPnUo*|jYPr)aG*dsa=Wg#a9K&|J&d+^tm*s596$cQsdM^&rROp#zKxTiTCzI6 z9_l_v>6Ore8T*xPf9M@)xv0Tfv*E(^Fcpb5;LOX%ecy`)42>So18D}KQGWi&qLRWA zyreSD=V2lbMdBMZcNX66NgdV{Kfh>XF*<_2?^qw}O#zj#$b@g3#cNhvAa=M?%_|v$ zaS20^spi{UTY|NX&8-d1ixwL*OmkadbxyoVJ&$XL&RA_q+G^`*?|Xs13Xb`wH`cU5RdTwN!n0HI z7u8f7Lu{sWy)K_fsAJNNu_esCrI%h(e9kd&ga4k)hNmml6n*{<)WAj>=kyFV>p^s$KYXA<3e<) z5@#mL(-e88aV4$bv6&^Tin>$zle*1>G}a7EC`j{I)WEt-5v>iyTI)>MO|0IuvA%87 z+HR&>@6DUXigXQ1;)1l+&#hY2VD5>I&JEr1lswbSOQvLM?!nU+H!t+0oneZjwlk|% zZCu3sS{lun*V-CRn0++OzH{x$R(qQ?kOwW_q(FfeiUrq&r`Oe%T8(z|d?_uf&#*~- zr4)N!`?}5z7td>3-?qAaUHf`He`5(ymY?)ypHM1E&HbgCS4}P@N*eS-AelAPdY$;}sjb5;SSN8+Jh!AC6Sh^gMJ%4zx^PSNrd6xjVWD;Yl6XyA=3vA* z2cxvSydpjhTDA7JjqNAI&#qcHZ*u#( zQN@(<@^j-8S9NV@@7mD0qJ87W_LcF8>sEAanuUjZcl(x!>!yJ2?%1?$d3@sP_{8S& z_{5FfD`%}ek|3O-mJSBx$j1 zZ;94os{5Z~K?=u4T%9e)IILsOs5&RMJ!41eD6aIN-p#rcT*~fAX}6xSMVI#67v1VR zS*ZdwzpFO=|776`>I=hE=%eDB1V1`69%KAGnqH|HizFYu%fzMgF^+C5ei({6E+6~a z>G|58Euz?A5?6(z%hv_k?Gal(tIIU0JZ~#Jdu=5AwtT0rIOG zu8Z4-I9J|WTu6NVh&+CWT6rAPb>*E7dE~Rs#@&bjSKdm3#gZ;0BSS9DFZ`sVZjC8er+hY1 z*ELFM%FM(0rhXI}%~aZ(Bki4Go-xG?+^TrB;`NFjQM^gv8RRbHRCJx0W>!!6-R|CHF*^SB)m=|hTt((o7_ zGvx12M7-=T3>5oTF_?DI@G2tY)GN&`?a1Gu*sZu#@p?tEX9d37l}59a{6Grweaig# z-Xg{oOB7F3oUAxqQSMXl*D5XdDd;muquggJE>~oqgW;Wua=(J+>yY+<_{?Gcd{>Z< zjeqCEvtN9{<$}gesgI2FJPG^o~ zrKQuSPmjk>nl|kn>-)ZM9=!>DUmUY2xNhj$>e$}g1J#B74)|r+2VzabI?j#;KZrI) zn_}3dviZUh7ISA-gt7{u*9)B%*1tV-77jc)O!@3^_|`ERj|#z62}ek zq|i+7KE0l}sy-D#K8?%m!3A_3^p^6>_G6#nEtnA*C=mS#_(E~|?b@dokSsKj*Wa#v zx{^dJ@;*dBSvePwR8~@B6QY$oUHi0xboC;#hNDyiMZ)1RI}sR60pSG|IQqdX95aGy z97Dlu9K*8kCK4=wKL}38F&Z=>*W7@esr~^C66FQw;g}z+z_B3UgLgo%4#$DP1{?~R0k__s9$bdJW&{oJR|NBLJSq4DPHvwU>;XUx`Dp;ukkoX3 z%?rK=*zX1R10M54ZTWRC_%Bf3@Pe-apsD;O0Gi5Y0pIol+V6tGaxDM~%L@VD^McKQ zr@i1(!1ujiE8quS@LLq*AoP}i7d+9^{>%&bSbq^peXzWQUHbq(hpGwi3oqbQg6os697B>U=rYJKbQiz#t&Y@qh_ZcQ1$p>KcJ55BYwbM&<(!mUO(ywH0t*;*wzBv z=!?>Kk01ON#l6K3E<*0N`hkz?xy=_1?(Ke%1?tm&kPG;XAM606PRe0HM!T?^?!a1s2Y zgZsf#60lQJ9I#6;DmWXlMZpS$#6@8~H9EgWMj85fp%)Mr{sP-zEITrU7q|~@bT2ZL z_kow$f@5SDpVZ;Z|G+U)NPo-=l_U4aaJHwc*O8&my7u6KrZI$i%cc;20EPH1*?8>o zPDi-E0E_VYz>~wQ`u&RWW3OjgxJvx|U271Vil-t0QL+Sn2GTX%J!$L6lyBcucESptflZ$TbsknGGrmBAe&*{kO~}v9QyqsY$ZW~ zhNB3<5EIV1Ai+@a4}B7)i4I^Phn_ElzJ}GS;jn?4h?U zR6}R1eQBRw3t>2ZA#cO`cGJVwVf3u@vGqV3OBkPspl^bSAXMTf$$<%%4WI8VAh72Y z@-BSeZhEYg1)~40LzQw~7b?`(7ch`+d9V;a%A?M)w+OMN$$Jiv^BGO7i1*!Wfj`0gd6ql5iqi5>} zbL7|*%nT-DT*gl@u45>U>P%PT z*;2zY)UXUSEJF>;P{T6RpbS=@M5=;^lY05iX{m;Ygf^JPnAf}rt6=LEHgapWrCv(| zPqu*>H87(FX4Jrp8kkW7PqqOk+j7Rd*5)OP-NmN8=zx(O6q3xPaZ$4e3KFX+v6>RA zDY2Rot0}RGv9<8^)Ks>%)-Rb~v$zpT&DOugPFpXFY+GjYglF@FXR`paS-jaS-fR|c zHj6hKg-R;zlX}j?^oW)!3aO%yDhjEhkSYqPqL3;Ise%yMey@7T;>FGLy_R~Wsb`vc zrm1I|dZwvInyOkv;84y3BJ?oTvs&YXCfDq7$Hr4zWtG1*bDO-mb+u(Yl=Co!hpDzv z>n?Suag?A58JSzM70|hsZh_7POA_T*tOl$6KHdw?Iwj z`c-RI%M2BK+B2-mYcY=_d)8)H;D517xn&M(bq;HF4r_G|YjqB5bq;HF4r{fBEVbqU zJ~m8!Xy6*5Lg(S52cclEHSD+uwY&(mya+8zT5IMu*EF>*s+-$-dez(|b>2UNhMHX_ zS3gbKI=+b5FS4!@9_XvLrSHMU?vBgHZV%QLZztcoT0<;)Y`tFqyit>@fi>JTWux8J zp!8d-M;hn0vpcZ4kK0KzrcA>^;tid$lsGMB`m{vM#_kPelcu_Q@nbJ1{{K~p4wWD~ zDKbtA_PJY#LqgLrV;_JuJaHYVjN){LO>TwI_Uf)IRiiUe7AsR zo3+l$W4O!rQP6D5)>*!81i1O;;^U2_A6gGknRoq7K_gu$VWLpQZ%8S*MLCo1z{a|=$^*UJ&y{UM+^9P9{8S5oX3ms z+cfZce?hO6IwtF^_b>vipK)7I36D4d*83Xb+nPSy*bDfT@2!;gFut^@MUXMxmN zFVU$k@B2_BZ$-dJgcsvSd2A2N)0MXvH!p|Ut+VnhZP5+?d(181c_p2#6%)d_1gY^6 zX)E?xnkP~+b;ygR@yo|wf`N89Q{}}(9!DgM;~kQ8TvzNqGdP7GBUs{iFZ(j3UjqQN z>zT@*<(;6>yk~sGyN>ISQ~BMV0_8E6q~p3_*ByUdaH{l>+!;v;Aq+{8gYCgMwz#C@ zI$zg?WL82lB!oe%Q$X4_SB%!xsB|T;7}xJ~pmofr-4a03UHCCQ-yOxce%C0?cSJFt zSlS;+d={AL6=@v`bT!gK(8bV{0CswmGF_dt?!B`Qo3f>Mf2=H5^(W7ij1u#%ryWPW zQ!{Y?vg{cc>*v+X#K;%h7x_wwXb4k@;1hoE;n6Q^T*;q-_XXQ1k?I1X%mu-vC?buD z;`5c^lNF~c&Qh#aY*t*X*rwQ_*r|BA;#GERqUsU{+;_npst|Q-DiWqPanmR3p)0`xc?-Jq=MK0GP&36LvM8z`28H%$MYZUn` zCx5fz62-F>+Z0zTQaMTfjfxj5zE4r+gdqL{N`F-G6NxK|sHtw9EwoEptJDG8Y6$r6J2Hb3uSI7X-*9Z44ix7*`ytI7v~~I)iVf z(lv^66sgpuoTZAbimMc9Jd*LDSCqZk!1rmTxn_>(zNGk{ijOGD zTolBAS81yM$p4(;ONzf%{Jr8I75M@re^fC?ajYV@nqmADMcK;@^l3`hDK;s}-foEJ zLR6-cJ>Gy+p_AqsUSg-B?D+=zQl(|@H_#te`X0rvDt=2*=FEWazez_h%8%D3&#HkT10=W4~BMD)MzBtqT;ivOkY-z4Ip^@4^U zQar5je^ok+GEy$rI`a9KPeeM|;|(}k!)0$blw*$apQm`f;%3FG6lJeA$d$d?fS=ZI zJU-<7ki8(^x;$T;y5L|%zH=CkN3`I0#WKZdil-^oD9%xwuh^=%Lh*dX^@6%Zjfm{+Wn+m**=m#^(i)lLm;K zEx z_z+FZKjK89#QY<^cD!IEj()&p*%`q`976%kCx?T}af}3fiRHqBQ{XkJuN${G%xV%s=8JFU&vUEHBJI;xsSJKbj4|{3G7A zn13`DfcZxg0GNNot{3JXO$T89(J27TKdJ;^{!ty^Zk#5pLKf3zPb zhWSU|0$~2pcL2T4KgtDnLBP3r1A?JA4h%-(I4JlS5`+SFZleLWHMR4PRw35TKYATJ zCBZ@P6bIL%K1Kyg5Nqcjak8>I|7b7b%={xX{(By!oHuZ8Uhp!GesDd6Wdv&^+rc;@ z`)6tfh!bZtPcqDv4w>%COU$792(I3l<963;sKRPEr zE0i-VXUU-celFev`1Z=mIu${v7`0s>`}u`6JcbNoE=-A*hD!ihLG79`Deqqx>ww=;|8Z`$~;z%49IY!5Ko6{5aS0r+9&1%X$f=Ohrr zz^-h9AvxEh1fkNvBo0J^Hryt}91UM;_#s@b3}cJwUlTEoW&!-@(=FU-700q)V0#Yl zWtPR-wrfinxD1=`EbmF;Gp zLh5XYcdhlFw1U$kpdfumlP6@eK+HOCZP~PTZB6%vwa1%IA(J!S&76wfr&Ih5wi0@q zL4m^8wy)v}dQO#qp7{8)DULaZqPeSmeeH%eys0p00;=d}|yV1YRlP^|YduY!|fQf5S$Sr6;jAQMwO-rLlNl(`Q7n%;1% z=?&-=wI=6Jp=~X}YzCR~06(lCwDUpSDi;M48hXxusO4md|7o)y%=h!L=0D)mHsRO_ zc~A2hk`cUB|CMT{7emCE7n7CbuFy@OPpG3af;CJPn4te7c zW}S_D9|Bx?9gs&^{PF(asq;K;#LuRI7q%V^5B+pD?j!KK^0q==9AT7)@1BIbJK(oz z;Pq~Vyf>Tx>%ARuuDm^v$MG=ABii!a4?okC;z##yDD+%>;aSHx{vKAed_RP0^Fqs{ zape0Ze)#t2vQe{9_$ihEl85eD{H&ie_mi};Nwa)(&*0~t$30HHpy?#eqd)xo=CSVc zkoPM~0Bv4G`(?xEJD`W}LLfe~WW100=HkaZU3r6%Sp~wZv+^u$(GCB5=-1gclg`$P z388*HHQu>!V4*(Ubv^g7OifLFw(DpI+jYI^tEu5;eHq6ql5`=_fVwm)+i_gG&$RZM zaBV&ZE=coCxi)_c&^pNnZ)8p*x4TTHyuuT2>z+Mq$`~=wJQq2}%QK}eh3$sOk`vhu zxc<0^h|?dZ;gc1oE6!5nvxe!K6&EYEDRwA!DqgO5mEs2!Z&v)Q;@yg0QhZR6_aXCp zOi^^Tpr2CuM~crWzNpB1f$4sycvw+%wFvi7>5Pvmimn!PzS5$r1ueQ-py(2SqN@dp zt`;b|TA=7^fugGgimnzYx&@%?;5=xTwYs|AX#7AU$} zpy+CWqN@dpt`;b|TA=7^fugGgimn#;gy!?KqUdT7{({n?s|Ec#rA1c@T6DF*Fdizb zKhf0!MW+B1T`e%K@uI5*ExKBu=xTwYs|AX#7AU$}py+CWOEtadYC(&x7AU$}py+CW zqN@dR;GE?VT`f>_wLsC;0!3E~6kRP)bhW@QX*$u>f)-sZP;|9G(bWP)R|^zfE$}5x zC%RhDqN@dpt`^9LskARe(bXbcbhSXy)dEFV3lv=~P;|9G(bWP)R|^zfEl_l|K+)9# zMOO_wLsC;0!3E~6kRP)bhW_SwOm{$%yQnN_+>@W;UfHNN`FUDbh&u!9#Z-* zieWs!sDm0#gaWgei1ZVbF4Ooq8h)PQ`HGtruTuP=;?0VmQ$)>5J|G3tb)`ibK3b9e zLzb&l5#0xmd&%gw7+9#gmW4DSP+_b-W%S3rI|OxeF+c!|>T{6u`$Me8t&r?stX zO`09@DZT5$$|_DOHOjE#>%wL-6Ld$X3XJn6ad(3))P#8tckRutkJNib@p@Vh*!N(( zzWLA<3+RvC3*X}P9ixV(!zek3Be_Z{*MwXDjz`UZ3u@y4!^$#KkyX6 z-yi%}!e0!35%{5D@kYU42L3DIXWuqs4}Rcb`^y9WRq#)PzZm=(;9;Mk9Q;?oUkQI` z4}RdOfg36U8Y z(H)QzrW!3{##+XQVa6OG@_w$kLPDZchC$E#ds4CJCjjA};DHqy&zcLr&TOmN=%wB; zRJ{@2$f=YYE`JsNfC_ytXvV=0egf$kVy8P4oQMZfIC!4yVol+gVD42v}IGBcGMAV!?Py>H7piTQ&z&Bo>U@4B7 z!A&@^tl-x;>uic0a}#_)2coc-F^+z)0mqEsA{;}(WjKZdzVIT!)i?&h`*Dm0e01jq zXW`gCIE-Un@FyJegTLZf5U@itAn1eRz#s?5K>-cC$Hg*5kr<{Z7P}Oq#4JULSk@RF zlp^hzU@gviY;Y?4;{tX7PY9|JQX0(0u`HO2V|nl^NShM;7RRZ9q3)efr4&=+jRF zK%d?YfIgj;KcG*45CDBTEq_3t&X+p$>9p1WefpCC=+ikR;h-1n2SA@rWis^XR3<~8 z{xksk^k)Fjr?U?PefrM;(5GL66NWyWT4CtZKMa6A{YC)v>Fk|CpS}kGefp;X(5KV1 z6!hs!arL(P!MT7d{a`r&_B{AHhdqxA0kG$h3xGY3%>dZ*;B+L|^Y}CxAoS^X0iaL+ zA^`gI`vK6WbA}l7>E8kcefoC*(5Jr-fqVR5I{^Ch>j2QFvws17`V9c+)7hS&PyZwU z`gG1ygFgLv0QBiE0lwtNs%Xz6Rz-Uru`03WQ4j8dpb5tTK?{xpgC#f)3Oo_;@bD~{3Gcj6e%gbLS-HqamQva(}C`hpfa z9u}Lm@uK%fjw8uu zWGskcG6}XQ8Ice-fEHeSRDo@4-%N<>rnqtlFlFjynP|sm99LiQ!57ER-#mCV$d4m@ z@Hy~sidP{chFl1WFN2Y#pi&wNYGOB=%EgESJr-V&?h{{NyAq=1Keolw^vc z$&jCasbo45^&*)rfv1pTfs*O?qIrRJEc^hOFnD9q^_=lMAR>~ME{?UBW zJqK=SD!JZ?G@<0@{T3mnt&M#W-U+9JD{H`=kT>B$lr(D~y%Rb5lwA=FK%1TPDflP% zf#ALq`1B|xgEzT|0cE^FBp`Y4${J9hSTWg_F`9Q{DSdbGY(CQ0ryGa*SD6Gam>AhET~Bx9mzvRkb)r9RQu;UBy1r}!p~$vAD^Kp2!SvCo+T|tXyAPccQRgn_>IO72?$K@dyB0Y%VlLD z3JeLC4IdH`_(Vl4;S>`};9Jz>PoFuz7D5AlU?;HK10jUD`1LF<#@)am_K!?1r`udI zysogD&4S&@Y!)Q5Io)PMem9@w)H+_$fBe}nmofO+YNh`K{BZgNb9PJYIasdbi7c@v zl4j;A$H*YC@t|S}_4t|Eq;I}Nv=BPPyO^*Yzn(R2YC`O7jS$`?1S@aBZu*RnC9aTU zb+WrPNm8~f1S~h+RRCs))5TF7<(eWdA=KgL#1?}rlOT+xBwZjuVsLA)co!3fnNUI; zzn*6m69zHqg@+0AA;j_P?e=n5SRKa{XBmy@k9a@i9ASLz8+R)Wi3_TfEGM)LGbmU2>h;HAQqCyW#CV#0|g zl)!7$^I|*CAj^=v*eomsMxj$@huN{(CdS{GB8K;c^rjQfaGUB~mc}N_*UVBXm!)7) z-N;036(9m{ZbWKPj#fv`wdWm(#|goCON;^8vyS=*?*f8lNY;^U9Q{!2lp-@TCb1ET z;__+MUm{T4-io>sks0{0EY?vPUA+Nm>h#W4db?s=krhVATY`?4ijF5>9rIugta-i& z`FyU#&$?WA#^J}bRu1FHUxJ^FW0-aSh;s6~H^UPZ7t>jPH*HrbKeS_J z3EhIpAD^6Z+l9XF`S}?k&rewEd))Kmlh0mV_TiC}izbFHo|M5E=$88#&o7?*g$c!H z4#OCIMoCKCuRTB184vZ3hdL(}fhW{|X)z?MnN)%>_)?h1`=f{9uWas=$>k%9iiVfW zI$Ar1TnEp&FgPh0Ga?!fhy7g_#*S2HUbE=6#Rn{aYfCdWR-0D^>s@Ng5LUiu#?T1)Tdf&tiB@fBZ%-6n zc4B9F>J~0+Z8(EFn7s#!hgQIn`Azei&ww4h_h|f3OSqxEZDns$|1pCf)%DKj@;lq6 z^W3!>48XNQ2lsO)_oDc3Aa9p*vvkfaA!~o|p zZ8@4-t@_>CbmWz6!98EQW~1Ena=X-4C2l9|Bv`wt`(oGTPH^`HJLx5#P(WEC<8W_VWZ$@L1sipty7C_C|pSefSgi=1kNt{H(L`suAGI zdjRrS7RqB;tUOLfapi3X?VhuhcP7GJc`rj=9AT8la#?vB;dkXd0D3Nd)>(O-2yo@a zFp18Vj|vhi?}PBW^1>jtTVcva^55`t#RK1gDdY2$g|g%!$VfykKlLZ-4CL->+y7&ynCGb z%X8$to+j^Q$m2O!XUq3H1i0lp2zhaYk+%RpTfRJ`$A6+d7vRPj2iiI-F9%GnJa0x) z-as&0c@tHhz5h5*{s}8g`AAkOA7^6F#c<=TG+sGU9?QiUeMBpdmN0s|9$bGwKI=F% zb^{xpIvckJ9``)rIFEz4aI6&2+ z1l{nz$9gtC8-S=LmnYFPtik>*G>GSo292g3c^8K2PM?wo09v>$pBHm7h=Aq@z99)ObEQlaBUb z*^ZLV*o!6o1b(SKexC1;G=4jE!APLJ*i?B##V#>pS#v((UDwn8>~J?4`SD4WbRjRE zB;X6llOh=uk~`g{$4GgSwahyx=|TzXy(TOqy)rj`oGORS`-byzV+kPXhwvjm-|>0q5qwMOxk6`p|E=_Pp|dd$ zIq8`GNRkwJ5$A?xJZEiMN4g}9o}5N=Qnz*FZvxGrIDTy1XDZG1kcS*y8`tFDtnuc2 z@;vsh@GtL$Jhb;uD$U1T9#?7T$2oNucFm{rdE$4`~CaMNVA8~QaA3IUp_asr8@?^Q~V4OQN$8ST+%d@wI zO@3JR2w{?*fjBSoJ{nPK<}+oMVd@#eGSM+BA>zF=o`?o8iHPrnQ-LGUZ{pLO@oXnV zbS=Eh3e#U;dbTNs^C?K=bC~gLD~yNN8!_E{?-2Pk&77(E;KpWr=E97hFj$M*?2jhIz1nhI}SdU zdjk1UPT@m*`gx7h_<;O~=d+&YE%k}?#ZEl!QBzI^Dwoe_;s8ZH#WNrbr|4zi5lOj> zN7jOT=8@+45t|iHS3Fm7xnifH)ED@#RQg)Q4=H|BkrNgu_b$b~ijOFML-9$)rxky! z_`KrJ6@R1nC&j35GZk;X8Z;71kNH)r@BMJ{t7y;qTaUeb>!enas|MOmwi z_#Z3HzAE{DuJ~)k*A)MtC~KC%C-zT)T;#)a{S*f%4pS^rl(oy?o2c{@#gi0IQ>;@I zJF4K9HO#;>H2hq}6^d&VI~6x6%35ZmyHe?E6hEl=F-1=GXZdeayi4(3MSf>7o-2BY zUsrrm@%xHDQT&*F-V?D~enSKw9io0}m+u zBgLO8{#@}@MJ~u=x<4uU=-!i#DT!Ip z;)RMADPFF)O_58UnC{;dZ&$oWkxP#lFZQv4-&b1fVuSW0CLS}pg^!z6lb;4*iCl3; zT%gEhlccXu+)l*rlSI6{ZdLm8MDX25#5e2X8h=2;|6A$jHU2k5e%Rp!K{|E8o9;iI6*ji1+e%rB78nQ*pWCCL+>ZLB#udyN2JO;kz_^ zFA@1XtoRraFXf*S$6!I9hW|$C-)nq0X3}L6^D!@-2>vp~=^DO>2>E9c@zUL(@fT_M zl}gjL4&y&a9EbL&;kPP&R>SX6dM^?D-y%Z(cZuk1ysYtWD*jc&Lud<>n?po72Pqb6 z_-Lia6CtOXI25)xH2gfp)rxC1{t6=U|A^wJ6z@{}vf`tPKUI8%i0k-<(tlOV%rx?b zDNazFt+-b4YDKhgxnFP_3Zf|r_ESU?ko#q{BKuXme@Ye6wG{dk#X7}C#ifepD6UXk zt+-xsgW|=Cmn(jlh;#dx;x5HKigzh~L2<9*gNlzUepm4)iqh|a++QgDisEaEhZQkV zN%H5n9m~OQI^M5?6{Y_JdX&=R6(=cjnIrj6Qk4D==-EooSER9C^6?vwc&?)Khd_5I z&9#4wzd~_`;&qBU6{Q~pKCufAlztG93u2l63yRVo0{x)U`xN&pitQG}A5faB3Yq>F zioa2meh|WsDE+pg^n(x{<$E32Us3u&pbM3bD@s2I;U_9xt~gzh>li6Vtf&K*Dt(Tk z^m`D#TIuzQ8x*flyh`yp#SbV-e+SRWJ*0u3Rs5XdeTrXJ+^5K;%;bMuQEa(@{-M(U zt;n^KPbDgH$o6HVUXk|XNOMIbQTjtb*$)JGlZNk7QUwol4)S zc(>x$6~C>>C8B&UOMeOYrqX{>^w~c_ctkNX?|Y!+3;8n{53E$IRh0bEHWrfxN;zG_i1U+i58xKkDCA{|TZuT|?TXhDQLgJ1cM?%985aTGL>l!V{RQA! zK3`F;%ZVu0%|w((p5rLTi=>gSd}kuxvHHBJAR?c|M94j#2zgR(s2l`|T&XwEQg4u7 z$#Bq8KgdVw0rWD4BR@GW&|66(UnwtWDKGNBhvA^_C*r*KDZQVF@;s~bK_UuqMCrGQ zDBqg$6-k3oac6&&qu7L+S~`7NIr!r7=@qR*N-`r7gW@bK9m<3xNP_`+828M$kJQFug%SV{>b7F<98)~ zFU&_uZ%p{L&u4^RI~WSTcF5a*#M{^W#-A<-AO8Gh;n!LspK05FBzw>PBZc>b55I9q z`0&9?_aB+MbN`X}*6`uCFAg8>yJi28%7bky!-xA_5kB1i!dsV(Y6~CE-w-}LVB?8M%>)4^M9WI^ZO3uynF4v_S$=|J)V8e-D?Wc%h^^~^{0b-_jjzx*|4_b z#SQD$K5%eH@yneL9L&GUDjw?(+9`Y_@Zo-u7iQz1^AF z^xoxz!M8^QUt0fC$F74b`ga{Xdd;qbE&H!Oxcd2y^}7zX#daNB6-%oN6z{1ntP0ib zsm4iG7s|1rQUm|)t$$ynA<%vHKkWIBjJx;s8^&CB?)PrJschtdsgsIva@C&d&RH4H z-0)79|F-upKV#lKzC3^4bptn?SzHxBSpQu%s1N`0tA@2`oqEM!6$gJ(_uYRwn00Z% z_T5#79~=`otE#keT-D^Nz&nBT$borv^Kk;!@6kl(Nf~ms?>d;iV|7(Y-SmSackHPy z*nVA)^Yy&m-;Viayz$gaCr#Xa=N&I? zA9>is1I0WA?81?`Q}bTxcyV)P-Du=&6Bc9ib?Tx**+K>DMhF!U%3l{2Dn+ROSoiGn zG5mGn?;`y1a&`3bHPq1&(9zC>j?y9rX5hrIfjm4hAj%EyZ^w^xMDB>JHcY zw(snT+Grc=?SkvF&gs~>_N-fOX!-f6zVDVD3{0}}PuOw%n%}Pp)CP)oSNkWfE?Zsd zyQTjwH!mT`u%+dN#IJu}pnFW!i>Kan>(|SIX#M`W;;KE>#Z|8i_@t$~@yM51RWPZr zDhU6gA6j{N1BF#7!efg&ncwOT6r&a5Ts*5g*pRw?bkzd;yW{U$n^JdkYoM6rvkEir ziB+M`#PikaKjw%J@z-_}l4engH zIY(mpv5Ilq0e3mvC2*e!cO~3&;64lP!{MF__fEL^jVv#C$vnh&bg{;!SVw2)K-b`4 zY;6}#RqKjj2O<$(I6ZbmtYzqAe39SMwXUn@l&;wNj-KAGPOxz!+PrI188WZ+}Uj=l|DaCP={_Dvg#4XC(|-rgix;Bdv5lq5f43X|85htBbQ zW?Ji@A5OOpro+wk3hST>Znq8!$gXw3Jr1`H_tGq&ZXHa8+pPmuky{64 zaJzNDvBs@~MQ|Ug4rb+ zY*V3>kC1f0L0i%D=D5A#UvMmV0(?{8FYTrC4Mg{seUZ*dUonWRMrnOc06u=_ZYOhI0$D8+Q7j>rCfDWNL&{1=U5IX;Aw}=Q(gjo!=p?QO*F0G}>7O{xQy1kcF|% z3GCR;Xz*t_4d5T|>_*p=!>p`{&PT{+w(|sZJIOf#`JC+Vp>2xuMJ!AATTT?o-)lL1 zfp?$fEJ2YUww$f-d<0sBm;;t`614G@oG zL`vOsDehKy9?G2B&uR*Ur$K|Mn;9__J{zS?9iThI3VatuOdX`OKqGkugVcL~9;tyV z$g>$@vV*xp@DJ}m;evVR!fAz%K;DA+-+((1u7p~G1-HQ+3LgtG!Kn|xoe|!FtOcjh z9SMIGeI{5)_vr9u#+^=gmMIQj8ija6s?1qxfa#^*4<}PFB~1-*Z$*kPNs$qp*TXYN zSt0e{v3h}gR7Y@zJfsAI#c17`49#SbMwCP4fzVW&TOJM+j{8Sw-)H(98+Cmax*K3u z$l(yQJK~H7ToiM10N0?}rvvxzu$>a%4#fE$THe2~>k_F(Wrs@aKO^}O^Vq{f3vBL^ zINYkRoafNKZ09Rbq0fq(2CvW&b}fQOJO+&gLQCw+$orb~jqjjs*v^l$g!g)6H&kkG zA@9}fo1t?1Uh`{YE=|rV{*`szs$)R>b`>gCJEi8oA*w-Sx$yTHi8VRkn zKSKFN{29s(gf`gIk#Xl5=*4orCEEEu?mlN9?tbTIxCfm3aZhm`#XZ$|3iqHDd7b&_ zw_k_4Mr5Gv1VRHgcW9hXP$0|Mj56EK-!R@l&pX*JPO;}Bc;tN?fd*PxHH~imeca)!6$qr z1M``n6>dgO(hBGu0P6@~Mi(1IT46g`+33=yQ>YbwiV4r4H(8G$Yd?a!(~8eUzYWhu zA=63>>on$f4&8z9KD5-dxg4NE;T@>|w0Z2A8R1wLDJnPGfrYNah8|FW<{o`rN* zgg2lf(iYKO6Mh2;rX5aqeRvdkj$p2v!+EI8v?H0Vw(u%+>a-;++3N6NC~?|R->NvpXU+DZ-3BclQ77pB$C zK=H$upgX43A3!84JObS*t-;Jl3mK_V=8o`{6x>92M)+vDo5>#u^L)Ux6?Bgd&!%o# z=*|jX!(6u>4)NLHD66uK{;}|7)WJ%+al#w(Nfvi%Vr~L=Q8TMKuc6(CNTE*!7oN12~4x--HzqvfZs zr#l?3V%|2;of&={MN03cdqj8}^LY~8k?`r1b28l{!>8b$-g_*vlPxSG%uhMechNr*{wI}pHr=Dcx3h5PjDt^B_+1w6OAFx64u3+$ z?3J{P>)+QRjYVJNi?=c>@WjI3uBuROjp9j5xc% zInqjd7!5Lz{;O#eF$CRN&N$@MwnnUjssibbeL6$Numu;2kVpr-;Qj-mqy{K<pUCa(d<*T% zkx%p>X8mDQbR_)<`*mjhY3AujSsYl=LGms(D}^ZE8>TNY+K5izkad(0q3Ay5cB#$5 zAj678S>9##UPy~K%bE-pqfZ}nf(O3qJQOpTQ18iE1HdLq*n-GN6%(r zl|uNUpCV#PD2qQ&!Nz8zak~1&&Xe+ zy5^;yXy>Es(OzoMESs(9(Ht7qh)6p+lMy?F@I^1<2))*R0e=3dOcR|F5{Sw?(IrGm zR3?h`LZn7zblo6CFe*dp$&$fPbQjCfD<^*c{ODrl z;A=t@M!!UbeBC||Av2>VQuLMfGf-Qx72!fGeXspG)jF4|+G{U{4pRg48TmW-EK2`} zeG=9BC#L*Qaa+;bnDQs0Z!QI&L|sK*VvT=lmw`F*DwbPt?-p6~8QG5<)u-FOOHh%~ z9OlU9I}HI=bPox?kEIAiA7PIQ_^OduD0(JSN%0*3S4Q;53`zC<6TK{AiWKy*NTZ|I zQ$ZmgKPJeE9%L^}6CykMb=Ha_0%E4*89tUgKY9(4P7nJoMQ&2^GDo$&UL5=zw;270?sG!NpS+u zMyivJd(esE9&*Oxp60}GcbqER)13>ES_Z{V{TPFhb0t!;oE_+jwsR}oKIg}{mvA5L{0W*H&Kt;ZvGWe@CC&%9 z&vE{NJN9`oQ_XWyaG&ouxG!)<;J(lqjr$^JJnn}({Ndq#%lQDAzz)_w0NBC$D?IPF zoS#8i4_MBHpPR$`kb}%tZbm*IPKC70Ha_RRopmXBR?@xN&YH)7RZG$7_uE;s(B(3ZW{g+u ztWQa-CUMZtIvf%+kKs}!LFPV)a@q|)fpZthtI?dmoeo+FO zeOvJ*BR>iKiqhbj*#{cZ$Zw6m2?6|*N)A~tGQh3dSyXVWkd-2D|C+&S@7;=|jn?m> z*58MmobFS>!ipa2qiPsqKlR8!qquviI1Y5VThOfSpI-}R{`w>LPP9P#L6UsGP(*#P zY-s70{n$xxioWC&=}gByVEezmvR+ zB&*+kk0du^MWt+O7!fS{)7#PJMWy^L!)(`IR7xLF=|VUPi@}a|Lk=#2pj~c4(rX!R z&loS?7eM!d{;P*(B^)%gU1H5S59C|9XqK14;m^Z>0TrM{`<*8Wv;`ivA3?Ll8>v)) zunyxIuFUm{iPs--U+H>v(re~xxJlM7B8icL&3JA*ZuW_`TSadp#NK=JBn)pdT%0Jw z&9Nxue5oVDxs9|`(up>CFDEUvWWpaME!AXbew4UC+WHz9vM6tXj1nC(Y=zK<7f4O5 zmG$v7(o$9Hgyxp^0;#J`p?88_DB}gPi;A=CO?D^pA+_~W1kUD=#sH};`bcd(0f$># z%Mdz*IMnNQt(sjPdI!QUF*K{jt&y1zz+cpO3mjDAtzeoZy1XEQoct)R%NhjRd#B=e z-A0!`5?ykEG5>k2Zk3ZCFfO{6^gemG@LjygsOol671@odek`iu_l$*91*#5Ov>%Hn zS0Txr6Ho3jNv;(9rm76*TF^%R6C$7CM*fo`{|3sRL-~hO!Mso^l;fumEc$&49HLfn za4hC;MEH8zvW}R=Jn?lkeDG)Qy>5zI{I?`O6ES7Z{sgo%6_x_JwCs=U%aJE3 z%5U^lg9LIH8=h?7xf+mC$mVGPc_$H&})`h6VNPJn>< z<*Zk~j|JshWmAw89|tRjn}VeJI9l-sB$82N*km-_w-hoZqmLkPwi_TBrH^EkKP;Jv znOCyLDatyGqkmH@?lW^LXcmK^b8n+=vn5L)vEE?j?~1vZ&z8)80-;A<#bI}{;WRm) zA~|QE$$3n2J{eWdYP2R}#Ioi-jl$W5@dVft?Y*;d+yn|GfkwnJ&9czPaefnN89_|U zi$I$+50f;>Z_=D8Y5oi}-)|tj_fV_$;$i7s6;E%mr1vW2%ZRnu#}O+H6OKvG#GC=z zq_;%UBfm-SC`qpl;f2y4mV6g#8JT`F5}+-bS*+Wm_?7y|4Ek9|U0}nVNw<9zZI+E3 zZTwG$;zy1*{;SclMotj7EDS#Zx2z~Kt)&G>#-5Owi-$UyMP|K;z@>ir7Uw7Xj=vTO z9u7Z=>$jGk&sJGAJ_se!?b@F}@G=~kXGO=- zSvn4d9SP0k>b zuH~8F7<-zSGYJ`UCTYo*ava#i$&_t3^3{rUmW*WcIANH;$vh(c$n@G#iy%4E7)%)v zmy=?nZ$#7@5A3R-5yS;ZSX2cdi~>d_$n^AZdPX`uM<)_Vc#iQ}?-}b_?-?i3QZneH{5 zGs9zh=dgqkotdr?oms|YP7#w~4qa0|v(wR*1UwiSXh{5l-2_Ekz9~aAjyTEj7i&AGM<$|Xqbe7h z?5dfhB^roEODjP~c}VasO_2O-eOZDuR)R{^1BEaiW$|2~>Rls1<#A8Zim?n-G29dV znwLyTmYCuhK&`@H0)Y>*pS6;J(F+VK2pH+$6cZ6HZ^B>#!jz$fd>ou?YbC+uZMhnR zT#dLNk3R?_R7f6)PKCAd@;(uBgFY{LrAz%&t zC~!4hpW@H9RulNOhR+%hq(sByYA8rUN_mI{&iKWr4rYRAGO^O-hY=L;H^hT`tDM!Vofsn3h~r2U*cp z+!#}6?}L_5GWcozhXs>Eu@4IhKAgE=D*T(KX2(^@q&=l#@}^X-q~tPsa_Ta8GKa{> zn5c+=<;EdY^q(@Y{-9*SyW%{SkT0zW?I50Ycv@JJf_DYM@UHgqCabI~ zqGusoyIw21p5a~PwTQ!Sp7PTt4gcLYEtE_?U~;^nX*f$>3*)AX1)f9fy1T z>Vu2H#E0=0z(=a~)pY$g3pVKka$Emw&9QI5>Le+s>+)veB_#n zdl~+0>saGqHpq%Vq#_=B7TvRjg^fIZdHU|#@Elg`sCY?@o6yzqh;Yo5&=$ho;yjvg zzwsrQIPtLpKHj=Eq4CbfP*dEC1sTlRrN4W5Yso}E#tkC6nx+_L#ncjAMp$u@ZV$l? z?f*O6XF(!sg}4iUsFg!Sqhd_0#M=_R4p9r7tRRF?gTLfq03JF3uNdoLNbYZp$}ADh zAlwXB{0hK@1PB%Q`)mSi9_ZVI68v#GAs!*_i+hP2u23PT5h(=jUO@b!aAtv6j6Xk& z!Cg%U1tD?V;}>}}KM^=Tn;$ZyVm@Wlr5kI1OJ=g+vjjUjBoWwDJ}YUAFsvZB49Ths z2?HNFte7}g5?tQop~_TLE5T(*9-o+3R|zbcOgVH+#vev+LJWW650s0Mn7@!Ugm=TC ze@%$DQ_evDZvL2xM;lBjSsR{gAS`~FGD+hrhG%jda^blSSzke5p-~Eg%llbnvi!`n zVO|NBT=e=6(>g>PM)ctiHB2DKXYCcZ$IlAHvj!Me z5L|}jQf3N63n5>eZ3LG$xydj!w?(l3O3vsosU+phqaIgS@)V4x0OpL~G9>5BFtm6X zK0iB5&TkC{WYjP*;lAVUgSQn%@7H`FRVE$v*2fsK)odM!^0fBVe%ZwFzhD7tQ`R zt%3a;Y_kW3dKZ-(KEH!vKi_(oD{0-v!Ja`)zI|ZmWY-xNk;G_zgk}!XM7wJ5>{{Qk zrFW>EW^rim3pGAC)Y;QF1h*gUv171jT|5vyAYnobErdkRz~(;iD#ahF4H(ibMf--% zjUDj9ATK7z3NA1<rMB!qV*gDLKj9cS85M^ZcjAmK03RE$}%IR9(?fTGC!#Q`*>ASzpp#+p@x{ zMptdzRNig%w|4a6_pU1ky9Ub3N;~_9tlGhW@}YrVtF{kzcLs*aH*M*|*}1e*r8dsm z+m3sMAXxfW&⪼z~H*A9CI#F&-UneqzbA}nUq62jUMOC%7H#Aki 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

  • c`WM1Heg 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 Q;$PI=7KDk<8)Y*850OKz&Hw-a literal 0 HcmV?d00001 diff --git a/sdk/lib/startup.o b/sdk/lib/startup.o new file mode 100644 index 0000000000000000000000000000000000000000..a6364e57ed3a10b61fc1ea0dfef49f4ed44124f7 GIT binary patch literal 19484 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 BD_RAM + + +/* Add . to assign the start address of the section, * + * to prevent the change of the start address by ld doing section alignment */ + .ram_image1.text . : + { + /* these 4 sections is used by ROM global variable */ + /* Don't move them and never add RAM code variable to these sections */ + __image1_validate_code__ = .; + KEEP(*(.image1.validate.rodata*)) + KEEP(*(.infra.ram.data*)) + KEEP(*(.timer.ram.data*)) + KEEP(*(.hal.ram.data*)) + __image1_bss_start__ = .; + *(.hal.flash.data*) + *(.hal.sdrc.data*) + __image1_bss_end__ = .; + + *(.hal.ram.text*) + *(.hal.flash.text*) + *(.hal.sdrc.text*) + *(.rodata*) + *(.infra.ram.text*) + __ram_image1_text_end__ = .; + } > BD_RAM + + .image2.start.table : + { + __ram_image2_text_start__ = .; + __image2_entry_func__ = .; + KEEP(*(SORT(.image2.ram.data*))) + __image2_validate_code__ = .; + KEEP(*(.image2.validate.rodata*)) + } > BD_RAM + + .ram_image2.text : + { + KEEP(*(.vectors .vectors.*)) + *(.infra.ram.start*) + *(.mon.ram.text*) + *(.text .text.* .gnu.linkonce.t.*) + *(.ramfunc .ramfunc.*); + *(.glue_7t) *(.glue_7) + *(.gnu.linkonce.r.*) + + + } > BD_RAM + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > BD_RAM + + .ram.data : + { + __data_start__ = .; + . = ALIGN(4); + *(vtable) + + . = ALIGN(4); + *(.data .data.*); + + + . = ALIGN(4); + /* preinit data */ + PROVIDE (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE (__preinit_array_end = .); + + + /* init data */ + + . = ALIGN(4); + KEEP(*(.init)) + + . = ALIGN(4); + PROVIDE (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE (__init_array_end = .); + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP(*crtbegin?.o(.ctors)) + KEEP(*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + KEEP(*(.ctors)) + + + /* finit data */ + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + PROVIDE (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE (__fini_array_end = .); + + . = ALIGN(4); + KEEP (*crtbegin.o(.dtors)) + KEEP(*crtbegin?.o(.dtors)) + KEEP(*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP(*(SORT(.dtors.*))) + KEEP(*crtend.o(.dtors)) + KEEP(*(.dtors)) + + } > BD_RAM + + . = ALIGN(4); + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx ALIGN(4) : AT(__exidx_start) + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + __ram_image2_text_end__ = .; + + } > BD_RAM + PROVIDE_HIDDEN (__exidx_end = .); + + + .sdr_data : + { + __sdram_data_start__ = .; + *(.sdram.data*) + __sdram_data_end__ = .; + + } > SDRAM_RAM + + + + /* .bss section which is used for uninitialized data */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + _sbss = . ; + _szero = .; + + *(.bss .bss.*) + *(COMMON) + *(.bdsram.data*) + + . = ALIGN(4); + _ebss = . ; + _ezero = .; + __bss_end__ = .; + } > BD_RAM + + .bf_data (NOLOAD): + { + __buffer_data_start__ = .; + *(.bfsram.data*) + __buffer_data_end__ = .; + + } > BD_RAM + + .heap (NOLOAD): + { + __end__ = .; + end = __end__; + *(.heap*) + __HeapLimit = .; + } > BD_RAM + + + /* stack section */ + . = ALIGN(8); + PROVIDE( _sstack = .); + PROVIDE(__StackLimit = _sstack); + + + .stack_dummy (NOLOAD) : AT(_sstack) + { + . = ALIGN(8); + . = . + STACK_SIZE; + . = ALIGN(8); + } > BD_RAM + + PROVIDE(_estack = .); + PROVIDE(__StackTop = _estack); + PROVIDE(__stack = __StackTop); + + + + . = ALIGN(4); + _end = . ; + + +} + + diff --git a/sdk/src/sw/os/basic_types.h b/sdk/src/sw/os/basic_types.h new file mode 100644 index 0000000..5a1d607 --- /dev/null +++ b/sdk/src/sw/os/basic_types.h @@ -0,0 +1,431 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * 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, USA + * + * + ******************************************************************************/ +#ifndef __BASIC_TYPES_H__ +#define __BASIC_TYPES_H__ + +//#define PLATFORM_FREERTOS +#include + +#define PLATFORM_LITTLE_ENDIAN 0 +#define PLATFORM_BIG_ENDIAN 1 + +#define SYSTEM_ENDIAN PLATFORM_LITTLE_ENDIAN + +#define SUCCESS 0 +#define FAIL (-1) + +#undef _SUCCESS +#define _SUCCESS 1 + +#undef _FAIL +#define _FAIL 0 + +#ifndef FALSE + #define FALSE 0 +#endif + +#ifndef TRUE + #define TRUE (!FALSE) +#endif + +#define _TRUE TRUE +#define _FALSE FALSE + +#ifndef NULL +#define NULL 0 +#endif + +#ifdef __GNUC__ +#define __weak __attribute__((weak)) +#define likely(x) __builtin_expect ((x), 1) +#define unlikely(x) __builtin_expect ((x), 0) +#endif + +typedef unsigned int uint; +typedef signed int sint; + + +#define s8 int8_t +#define u8 uint8_t +#define s16 int16_t +#define u16 uint16_t +#define s32 int32_t +#define u32 uint32_t +#define s64 int64_t +#define u64 uint64_t + +typedef unsigned int BOOL; + +#define UCHAR uint8_t +#define USHORT uint16_t +#define UINT uint32_t +#define ULONG uint32_t + +typedef struct { volatile int counter; } atomic_t; + +typedef enum _RTK_STATUS_ { + _EXIT_SUCCESS = 0, + _EXIT_FAILURE = 1 +}RTK_STATUS, *PRTK_STATUS; + +#define IN +#define OUT +#define VOID void +#define INOUT +#define NDIS_OID uint +#define NDIS_STATUS uint + +#ifndef PVOID +typedef void * PVOID; +#endif + +typedef u32 dma_addr_t; + +typedef void (*proc_t)(void*); + +typedef unsigned int __kernel_size_t; +typedef int __kernel_ssize_t; + +typedef __kernel_size_t SIZE_T; +typedef __kernel_ssize_t SSIZE_T; +#define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +#define MEM_ALIGNMENT_OFFSET (sizeof (SIZE_T)) +#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1) + +#define SIZE_PTR SIZE_T +#define SSIZE_PTR SSIZE_T + +#ifndef ON +#define ON 1 +#endif + +#ifndef OFF +#define OFF 0 +#endif + +#ifndef ENABLE +#define ENABLE 1 +#endif + +#ifndef DISABLE +#define DISABLE 0 +#endif + + +#define BIT0 0x0001 +#define BIT1 0x0002 +#define BIT2 0x0004 +#define BIT3 0x0008 +#define BIT4 0x0010 +#define BIT5 0x0020 +#define BIT6 0x0040 +#define BIT7 0x0080 +#define BIT8 0x0100 +#define BIT9 0x0200 +#define BIT10 0x0400 +#define BIT11 0x0800 +#define BIT12 0x1000 +#define BIT13 0x2000 +#define BIT14 0x4000 +#define BIT15 0x8000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +#define BIT_(__n) (1<<(__n)) + +#ifndef BIT +#define BIT(__n) (1<<(__n)) +#endif + +#define SECTION(_name) __attribute__ ((__section__(_name))) +#define _PACKED_ __attribute__ ((packed)) +#define _LONG_CALL_ __attribute__ ((long_call)) +#define _WEAK __attribute__ ((weak)) + + + +//port from fw by thomas +// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness + +#define SWAP32(x) ((u32)( \ + (((u32)(x) & (u32)0x000000ff) << 24) | \ + (((u32)(x) & (u32)0x0000ff00) << 8) | \ + (((u32)(x) & (u32)0x00ff0000) >> 8) | \ + (((u32)(x) & (u32)0xff000000) >> 24))) + +#define WAP16(x) ((u16)( \ + (((u16)(x) & (u16)0x00ff) << 8) | \ + (((u16)(x) & (u16)0xff00) >> 8))) + +#if SYSTEM_ENDIAN == PLATFORM_LITTLE_ENDIAN +#ifndef rtk_le16_to_cpu +#define rtk_cpu_to_le32(x) ((u32)(x)) +#define rtk_le32_to_cpu(x) ((u32)(x)) +#define rtk_cpu_to_le16(x) ((u16)(x)) +#define rtk_le16_to_cpu(x) ((u16)(x)) +#define rtk_cpu_to_be32(x) SWAP32((x)) +#define rtk_be32_to_cpu(x) SWAP32((x)) +#define rtk_cpu_to_be16(x) WAP16((x)) +#define rtk_be16_to_cpu(x) WAP16((x)) +#endif + +#elif SYSTEM_ENDIAN == PLATFORM_BIG_ENDIAN +#ifndef rtk_le16_to_cpu +#define rtk_cpu_to_le32(x) SWAP32((x)) +#define rtk_le32_to_cpu(x) SWAP32((x)) +#define rtk_cpu_to_le16(x) WAP16((x)) +#define rtk_le16_to_cpu(x) WAP16((x)) +#define rtk_cpu_to_be32(x) ((__u32)(x)) +#define rtk_be32_to_cpu(x) ((__u32)(x)) +#define rtk_cpu_to_be16(x) ((__u16)(x)) +#define rtk_be16_to_cpu(x) ((__u16)(x)) +#endif +#endif + + +/* + * Call endian free function when + * 1. Read/write packet content. + * 2. Before write integer to IO. + * 3. After read integer from IO. +*/ + +// +// Byte Swapping routine. +// +#define EF1Byte (u8) +#define EF2Byte le16_to_cpu +#define EF4Byte le32_to_cpu + +// +// Read LE format data from memory +// +#define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr))) +#define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr))) +#define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr))) + +// +// Write LE data to memory +// +#define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr)))=EF1Byte(_val) +#define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr)))=EF2Byte(_val) +#define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr)))=EF4Byte(_val) + +// +// Example: +// BIT_LEN_MASK_32(0) => 0x00000000 +// BIT_LEN_MASK_32(1) => 0x00000001 +// BIT_LEN_MASK_32(2) => 0x00000003 +// BIT_LEN_MASK_32(32) => 0xFFFFFFFF +// +#define BIT_LEN_MASK_32(__BitLen) \ + (0xFFFFFFFF >> (32 - (__BitLen))) +// +// Example: +// BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 +// BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 +// +#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_32(__BitLen) << (__BitOffset)) + +// +// Description: +// Return 4-byte value in host byte ordering from +// 4-byte pointer in litten-endian system. +// +#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + (EF4Byte(*((u32 *)(__pStart)))) + +// +// Description: +// Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to +// 4-byte value in host byte ordering. +// +#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_32(__BitLen) \ + ) + +// +// Description: +// Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering +// and return the result in 4-byte value in host byte ordering. +// +#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + & \ + ( ~ BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \ + ) + +// +// Description: +// Set subfield of little-endian 4-byte value to specified value. +// +#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u32 *)(__pStart)) = \ + EF4Byte( \ + LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \ + ); + + +#define BIT_LEN_MASK_16(__BitLen) \ + (0xFFFF >> (16 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_16(__BitLen) << (__BitOffset)) + +#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + (EF2Byte(*((u16 *)(__pStart)))) + +#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_16(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + & \ + ( ~ BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u16 *)(__pStart)) = \ + EF2Byte( \ + LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \ + ); + +#define BIT_LEN_MASK_8(__BitLen) \ + (0xFF >> (8 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_8(__BitLen) << (__BitOffset)) + +#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + (EF1Byte(*((u8 *)(__pStart)))) + +#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_8(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u8 *)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \ + ); + +//pclint +#define LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + ) + +//pclint +#define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \ +{ \ + *((pu1Byte)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \ + | \ + ((u1Byte)__Value) \ + ); \ +} + + + +// Get the N-bytes aligment offset from the current length +#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment)) + +typedef unsigned char BOOLEAN,*PBOOLEAN; + +#define TEST_FLAG(__Flag,__testFlag) (((__Flag) & (__testFlag)) != 0) +#define SET_FLAG(__Flag, __setFlag) ((__Flag) |= __setFlag) +#define CLEAR_FLAG(__Flag, __clearFlag) ((__Flag) &= ~(__clearFlag)) +#define CLEAR_FLAGS(__Flag) ((__Flag) = 0) +#define TEST_FLAGS(__Flag, __testFlags) (((__Flag) & (__testFlags)) == (__testFlags)) + +/* Define compilor specific symbol */ +// +// inline function +// + +#define __inline__ inline +#define __inline inline +#define __inline_definition inline + +// +// pack +// + + +#define RTW_PACK_STRUCT_BEGIN +#define RTW_PACK_STRUCT_STRUCT __attribute__ ((__packed__)) +#define RTW_PACK_STRUCT_END + + +typedef struct _RAM_START_FUNCTION_ { + VOID (*RamStartFun) (VOID); +}RAM_START_FUNCTION, *PRAM_START_FUNCTION; + +typedef struct _RAM_FUNCTION_START_TABLE_ { + VOID (*RamStartFun) (VOID); + VOID (*RamWakeupFun) (VOID); + VOID (*RamPatchFun0) (VOID); + VOID (*RamPatchFun1) (VOID); + VOID (*RamPatchFun2) (VOID); +}RAM_FUNCTION_START_TABLE, *PRAM_FUNCTION_START_TABLE; + +#endif// __BASIC_TYPES_H__ diff --git a/sdk/src/sw/os/platform_options.h b/sdk/src/sw/os/platform_options.h new file mode 100644 index 0000000..a270d6c --- /dev/null +++ b/sdk/src/sw/os/platform_options.h @@ -0,0 +1,105 @@ + +#ifndef __PLATFORM_OPTIONS_H__ +#define __PLATFORM_OPTIONS_H__ + + + +/* + * Target Platform Selection + */ + +const static int SYSTEM_CLK = 166666666; +const static int CPU_CLOCK_SEL_VALUE = 0; +//const static int DRAM_TIMING_TCK = 20000; +const static int SDR_CLOCK_SEL_VALUE = 1; + + +// +// Configuration for boot sequence +// +const static int CONFIG_MP=0; + +// +// Config for modules +// +const static int CONFIG_SPIC_MODULE = 1; +const static int CONFIG_SDR_EN = 1; + +// +#define CONFIG_UART_LOG_HISTORY 1 +#define CONFIG_DEBUG_LOG 1 +#define CONFIG_CHIP_B_CUT 1 + + +// + +#undef CONFIG_TIMER_TEST +#define CONFIG_TIMER_MODULE 1 +#undef CONFIG_WDG +#define CONFIG_WDG_NON 1 +#define CONFIG_GDMA_EN 1 +#define CONFIG_GDMA_NORMAL 1 +#undef CONFIG_GDMA_TEST +#define CONFIG_GDMA_MODULE 1 +#undef CONFIG_WIFI_EN +#define CONFIG_GPIO_EN 1 +#define CONFIG_GPIO_NORMAL 1 +#undef CONFIG_GPIO_TEST +#define CONFIG_GPIO_MODULE 1 +#undef CONFIG_SDIO_DEVICE_EN +#undef CONFIG_SDIO_HOST_EN +#undef CONFIG_USB_EN +#define CONFIG_SPI_COM_EN 1 +#define CONFIG_SPI_COM_NORMAL 1 +#undef CONFIG_SPI_COM_TEST +#define CONFIG_SPI_COM_MODULE 1 +#define CONFIG_UART_EN 1 +#define CONFIG_UART_NORMAL 1 +#undef CONFIG_UART_TEST +#define CONFIG_UART_MODULE 1 +#define CONFIG_I2C_EN 1 +#define CONFIG_I2C_NORMAL 1 +#undef CONFIG_I2C_TEST +#define CONFIG_I2C_MODULE 1 +#undef CONFIG_DEBUG_LOG_I2C_HAL +#undef CONFIG_PCM_EN +#define CONFIG_I2S_EN 1 +#define CONFIG_I2S_NORMAL 1 +#undef CONFIG_I2S_TEST +#define CONFIG_I2S_MODULE 1 +#undef CONFIG_DEBUG_LOG_I2S_HAL +#undef CONFIG_NFC_EN +#undef CONFIG_NFC_NORMAL +#undef CONFIG_NFC_TEST +#define CONFIG_NFC_MODULE 1 +#undef CONFIG_SOC_PS_EN +#undef CONFIG_MII_EN +#define CONFIG_PWM_EN 1 +#define CONFIG_PWM_NORMAL 1 +#undef CONFIG_PWM_TEST +#define CONFIG_PWM_MODULE 1 +#define CONFIG_EFUSE_EN 1 +#define CONFIG_EFUSE_NORMAL 1 +#undef CONFIG_EFUSE_TEST +#define CONFIG_EFUSE_MODULE 1 +#define CONFIG_SDR_NORMAL 1 +#undef CONFIG_SDR_TEST +#define CONFIG_SDR_MODULE 1 +#define CONFIG_SPIC_EN 1 +#define CONFIG_SPIC_NORMAL 1 +#undef CONFIG_SPIC_TEST + +#define CONFIG_ADC_EN 1 +#define CONFIG_DAC_EN 1 +#define CONFIG_DAC_NORMAL 1 +#undef CONFIG_DAC_TEST +#define CONFIG_DAC_MODULE 1 +#define CONFIG_DEBUG_LOG_DAC_HAL 1 +#define CONFIG_NOR_FLASH 1 +#undef CONFIG_SPI_FLASH +#undef CONFIG_NAND_FLASH +#undef CONFIG_NONE_FLASH + + +#endif // __PLATFORM_OPTIONS_H__ + diff --git a/sdk/src/sw/os/section_config.h b/sdk/src/sw/os/section_config.h new file mode 100644 index 0000000..6100b69 --- /dev/null +++ b/sdk/src/sw/os/section_config.h @@ -0,0 +1,212 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _SECTION_CONFIG_H_ +#define _SECTION_CONFIG_H_ + +#include "basic_types.h" + +#define RAM_DEDECATED_VECTOR_TABLE_SECTION \ + SECTION(".ram_dedecated_vector_table") + +#define RAM_USER_IRQ_FUN_TABLE_SECTION \ + SECTION(".ram_user_define_irq_table") + +#define RAM_USER_IRQ_DATA_TABLE_SECTION \ + SECTION(".ram_user_define_data_table") + +//3 Timer Section +#define SECTION_RAM_TIMER2TO7_VECTOR_TABLE \ + SECTION(".timer2_7_vector_table.data") + +#define SECTION_RAM_BSS_TIMER_RECORDER_TABLE \ + SECTION(".timer.ram.data") + +#define TIMER_ROM_TEXT_SECTION \ + SECTION(".timer.rom.text") + +#define TIMER_ROM_DATA_SECTION \ + SECTION(".timer.rom.rodata") + +#define TIMER_RAM_TEXT_SECTION \ + SECTION(".timer.ram.text") + +#define TIMER_RAM_DATA_SECTION \ + SECTION(".timer.ram.data") + + +//3 Wifi Section +#define WIFI_ROM_TEXT_SECTION \ + SECTION(".wifi.rom.text") + +#define WIFI_ROM_DATA_SECTION \ + SECTION(".wifi.rom.rodata") + +#define WIFI_RAM_TEXT_SECTION \ + SECTION(".wifi.ram.text") + +#define WIFI_RAM_DATA_SECTION \ + SECTION(".wifi.ram.data") + +//3 Hal Section +#define HAL_ROM_TEXT_SECTION \ + SECTION(".hal.rom.text") + +#define HAL_ROM_DATA_SECTION \ + SECTION(".hal.rom.rodata") + +#define HAL_RAM_TEXT_SECTION \ + SECTION(".hal.ram.text") + +#define HAL_FLASH_TEXT_SECTION \ + SECTION(".hal.flash.text") + +#define HAL_FLASH_DATA_SECTION \ + SECTION(".hal.flash.data") + +#define HAL_SDRC_TEXT_SECTION \ + SECTION(".hal.sdrc.text") + +#define HAL_SDRC_DATA_SECTION \ + SECTION(".hal.sdrc.data") + +#define HAL_RAM_DATA_SECTION \ + SECTION(".hal.ram.data") + +#define HAL_RAM_BSS_SECTION \ + SECTION(".hal.ram.bss") + +#define HAL_ROM_OP_SECTION \ + SECTION(".halop.rom.rodata") + +//3 Store the Image 1 validate code +#define IMAGE1_VALID_PATTEN_SECTION \ + SECTION(".image1.validate.rodata") + +#define IMAGE2_VALID_PATTEN_SECTION \ + SECTION(".image2.validate.rodata") + +//3 Infra Section +#define INFRA_ROM_TEXT_SECTION \ + SECTION(".infra.rom.text") + +#define INFRA_ROM_DATA_SECTION \ + SECTION(".infra.rom.rodata") + +#define INFRA_RAM_TEXT_SECTION \ + SECTION(".infra.ram.text") + +#define INFRA_RAM_DATA_SECTION \ + SECTION(".infra.ram.data") + +#define INFRA_RAM_BSS_SECTION \ + SECTION(".infra.ram.bss") + +#define INFRA_START_SECTION \ + SECTION(".infra.ram.start") + + +//3 Pin Mutex Section +#define PINMUX_ROM_TEXT_SECTION \ + SECTION(".hal.rom.text") + +#define PINMUX_ROM_DATA_SECTION \ + SECTION(".hal.rom.rodata") + +#define PINMUX_RAM_TEXT_SECTION \ + SECTION(".hal.ram.text") + +#define PINMUX_RAM_DATA_SECTION \ + SECTION(".hal.ram.data") + +#define PINMUX_RAM_BSS_SECTION \ + SECTION(".hal.ram.bss") + + +//3 Monitor App Section +#define MON_ROM_TEXT_SECTION \ + SECTION(".mon.rom.text") + +#define MON_ROM_DATA_SECTION \ + SECTION(".mon.rom.rodata") + +#define MON_RAM_TEXT_SECTION \ + SECTION(".mon.ram.text") + +#define MON_RAM_DATA_SECTION \ + SECTION(".mon.ram.data") + +#define MON_RAM_BSS_SECTION \ + SECTION(".mon.ram.bss") + + +//3 SDIO Section +#define SECTION_SDIO_RAM +#define SECTION_SDIO_ROM + +//3 SRAM Config Section +#define SRAM_BD_DATA_SECTION \ + SECTION(".bdsram.data") + +#define SRAM_BF_DATA_SECTION \ + SECTION(".bfsram.data") + + +#define START_RAM_FUN_SECTION \ + SECTION(".start.ram.data") + +#define START_RAM_FUN_A_SECTION \ + SECTION(".start.ram.data.a") + +#define START_RAM_FUN_B_SECTION \ + SECTION(".start.ram.data.b") + +#define START_RAM_FUN_C_SECTION \ + SECTION(".start.ram.data.c") + +#define START_RAM_FUN_D_SECTION \ + SECTION(".start.ram.data.d") + +#define START_RAM_FUN_E_SECTION \ + SECTION(".start.ram.data.e") + +#define IMAGE2_START_RAM_FUN_SECTION \ + SECTION(".image2.ram.data") + +#define SDRAM_DATA_SECTION \ + SECTION(".sdram.data") + +//3 Wlan Section +#define WLAN_ROM_TEXT_SECTION \ + SECTION(".wlan.rom.text") + +#define WLAN_ROM_DATA_SECTION \ + SECTION(".wlan.rom.rodata") + +#define WLAN_RAM_MAP_SECTION \ + SECTION(".wlan_ram_map") + +//3 Apple Section +#define APPLE_ROM_TEXT_SECTION \ + SECTION(".apple.rom.text") + +#define APPLE_ROM_DATA_SECTION \ + SECTION(".apple.rom.rodata") + +//3 Libc Section +#define LIBC_ROM_TEXT_SECTION \ + SECTION(".libc.rom.text") + +#define LIBC_ROM_DATA_SECTION \ + SECTION(".libc.rom.rodata") + +#define LIBC_RAM_BSS_SECTION \ + SECTION(".libc.ram.bss") + +#endif //_SECTION_CONFIG_H_ diff --git a/sdk/src/targets/cmsis/core_cm3.h b/sdk/src/targets/cmsis/core_cm3.h new file mode 100644 index 0000000..64db5c7 --- /dev/null +++ b/sdk/src/targets/cmsis/core_cm3.h @@ -0,0 +1,1661 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V3.20 + * @date 25. February 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \ingroup Cortex_M3 + @{ + */ + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03) /*!< Cortex-M Core */ + + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + #define __STATIC_INLINE static __inline + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ + #define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) + #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + #define __STATIC_INLINE static inline + +#endif + +/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all +*/ +#define __FPU_USED 0 + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TMS470__ ) + #if defined __TI__VFP_SUPPORT____ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif +#endif + +#include /* standard types definitions */ +//#include /* rlx basic types definitions */ +#include /* Core Instruction Access */ +#include /* Core Function Access */ +//#include "hal_irqn.h" + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200 + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0 + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 4 + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0 + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if (__CM3_REV < 0x0201) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Registers Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* SCB Hard Fault Status Registers Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1]; + __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) + __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29]; + __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43]; + __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6]; + __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1]; + __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1]; + __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1]; + __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2]; + __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55]; + __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131]; + __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759]; + __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1]; + __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39]; + __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8]; + __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if (__MPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register */ +#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Cortex-M3 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +/** \brief Set Priority Grouping + + The function sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** \brief Get Priority Grouping + + The function reads the priority grouping field from the NVIC Interrupt Controller. + + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ +} + + +/** \brief Enable External Interrupt + + The function enables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +} + + +/** \brief Disable External Interrupt + + The function disables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + + +/** \brief Get Pending Interrupt + + The function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + + +/** \brief Set Pending Interrupt + + The function sets the pending bit of an external interrupt. + + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + + +/** \brief Clear Pending Interrupt + + The function clears the pending bit of an external interrupt. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Get Active Interrupt + + The function reads the active register in NVIC and returns the active bit. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + */ +__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + + +/** \brief Set Interrupt Priority + + The function sets the priority of an interrupt. + + \note The priority cannot be set for every core interrupt. + + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + + +/** \brief Get Interrupt Priority + + The function reads the priority of an interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented + priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief Encode Priority + + The function encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. + + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** \brief Decode Priority + + The function decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + +/** \brief System Reset + + The function initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + + +/** \brief Set Vector Table Offset + + + The function sets Vector Table Offset register. + + \param [in] TableAddress Vector table address. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetVectorTable(uint32_t TableAddress) +{ + SCB->VTOR = TableAddress; +} + + +/** \brief Set Vector Table Offset + + + The function sets Vector Table Offset register. + + \param [in] TableAddress Vector table address. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetCCR(void) +{ + uint32_t reg_value; + + reg_value = SCB->CCR; + reg_value |= SCB_CCR_DIV_0_TRP_Msk | SCB_CCR_UNALIGN_TRP_Msk; + SCB->CCR = reg_value; +} + + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + The function initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + + \param [in] ticks Number of ticks between two interrupts. + + \return 0 Function succeeded. + \return 1 Function failed. + + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = ticks - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** \brief ITM Send Character + + The function transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + + \param [in] ch Character to transmit. + + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ + (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + + +/** \brief ITM Receive Character + + The function inputs a character via the external variable \ref ITM_RxBuffer. + + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) { + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** \brief ITM Check Character + + The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) { + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { + return (0); /* no character available */ + } else { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif diff --git a/sdk/src/targets/cmsis/core_cmFunc.h b/sdk/src/targets/cmsis/core_cmFunc.h new file mode 100644 index 0000000..0a18faf --- /dev/null +++ b/sdk/src/targets/cmsis/core_cmFunc.h @@ -0,0 +1,636 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V3.20 + * @date 25. February 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#ifndef __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp"); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + __ASM volatile (""); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); + __ASM volatile (""); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H */ diff --git a/sdk/src/targets/cmsis/core_cmInstr.h b/sdk/src/targets/cmsis/core_cmInstr.h new file mode 100644 index 0000000..d213f0e --- /dev/null +++ b/sdk/src/targets/cmsis/core_cmInstr.h @@ -0,0 +1,688 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V3.20 + * @date 05. March 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#ifndef __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constrant "l" + * Otherwise, use general registers, specified by constrant "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (short)__builtin_bswap16(value); +#else + uint32_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << (32 - op2)); +} + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git a/sdk/src/targets/cmsis/target_rtk/target_8195a/app_start.c b/sdk/src/targets/cmsis/target_rtk/target_8195a/app_start.c new file mode 100644 index 0000000..237aac0 --- /dev/null +++ b/sdk/src/targets/cmsis/target_rtk/target_8195a/app_start.c @@ -0,0 +1,48 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +//#include "build_info.h" + + + + +extern int main( void ); + +#ifdef PLATFORM_RTX +extern void SVC_Handler (void); +extern void PendSV_Handler (void); +extern void SysTick_Handler (void); +#endif + + + + +// The Main App entry point +void _AppStart(void) +{ +#ifdef PLATFORM_RTX + InterruptForOSInit((VOID*)SVC_Handler, + (VOID*)PendSV_Handler, + (VOID*)SysTick_Handler); + __asm ( + "ldr r0, =SystemInit\n" + "blx r0\n" + "ldr r0, =_start\n" + "bx r0\n" + ); + + DiagPrintf("OS system finished\n"); +#else + + main(); + +#endif // end of else of "#ifdef CONFIG_MBED_ENABLED" + +} diff --git a/sdk/src/targets/cmsis/target_rtk/target_8195a/diag.h b/sdk/src/targets/cmsis/target_rtk/target_8195a/diag.h new file mode 100644 index 0000000..187bd47 --- /dev/null +++ b/sdk/src/targets/cmsis/target_rtk/target_8195a/diag.h @@ -0,0 +1,806 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _DIAG_H_ +#define _DIAG_H_ + +#ifdef __cplusplus +extern "C" { +#endif +#include "platform_options.h" +#include "basic_types.h" + +#include /* for size_t */ + +extern u32 ConfigDebugErr; +extern u32 ConfigDebugInfo; +extern u32 ConfigDebugWarn; + +extern u32 CfgSysDebugErr; +extern u32 CfgSysDebugInfo; +extern u32 CfgSysDebugWarn; + +#define DBG_ERR_MSG_ON(x) (ConfigDebugErr |= (x)) +#define DBG_WARN_MSG_ON(x) (ConfigDebugWarn |= (x)) +#define DBG_INFO_MSG_ON(x) (ConfigDebugInfo |= (x)) + +#define DBG_ERR_MSG_OFF(x) (ConfigDebugErr &= ~(x)) +#define DBG_WARN_MSG_OFF(x) (ConfigDebugWarn &= ~(x)) +#define DBG_INFO_MSG_OFF(x) (ConfigDebugInfo &= ~(x)) + +// Define debug group +#define _DBG_BOOT_ 0x00000001 +#define _DBG_GDMA_ 0x00000002 +#define _DBG_GPIO_ 0x00000004 +#define _DBG_TIMER_ 0x00000008 +#define _DBG_I2C_ 0x00000010 +#define _DBG_I2S_ 0x00000020 +#define _DBG_MII_ 0x00000040 +#define _DBG_NFC_ 0x00000080 +#define _DBG_PCM_ 0x00000100 +#define _DBG_PWM_ 0x00000200 +#define _DBG_SDIO_ 0x00000400 +#define _DBG_SSI_ 0x00000800 +#define _DBG_SPI_FLASH_ 0x00001000 +#define _DBG_SDR_ 0x00002000 +#define _DBG_UART_ 0x00004000 +#define _DBG_USB_OTG_ 0x00008000 +#define _DBG_USB_CORE_ 0x00010000 +#define _DBG_CRYPTO_ 0x00020000 +#define _DBG_ADC_ 0x00040000 +#define _DBG_DAC_ 0x00080000 + +#define _DBG_MISC_ 0x40000000 +#define _DBG_FAULT_ 0x80000000 + +typedef enum _SYSTEM_DBG_DEFINE_ { + _SYSDBG_MISC_ = 1<<0, + _SYSDBG_MAILBOX_ = 1<<1, + _SYSDBG_TIMER_ = 1<<2 + +} SYSTEM_DBG; + +extern +_LONG_CALL_ u32 +DiagPrintf( + IN const char *fmt, ... +); + +u32 +DiagSPrintf( + IN u8 *buf, + IN const char *fmt, ... +); + +int +prvDiagPrintf( + IN const char *fmt, ... +); + +int +prvDiagSPrintf( + IN char *buf, + IN const char *fmt, ... +); + + +#define _DbgDump DiagPrintf + +#define DRIVER_PREFIX "RTL8195A[Driver]: " +#define HAL_PREFIX "RTL8195A[HAL]: " +#define DMA_PREFIX "RTL8195A[DMA]: " +#define SDIO_PREFIX "RTL8195A[SDIO]" +#define MBOX_PREFIX "[OS-MBOX]" +#define TIMER_PREFIX "[OS-TMR]" + +#define BOOT_ERR_PREFIX "[BOOT Err]" +#define BOOT_WARN_PREFIX "[BOOT Wrn]" +#define BOOT_INFO_PREFIX "[BOOT Inf]" + +#define GDMA_ERR_PREFIX "[GDMA Err]" +#define GDMA_WARN_PREFIX "[GDMA Wrn]" +#define GDMA_INFO_PREFIX "[GDMA Inf]" + +#define GPIO_ERR_PREFIX "[GPIO Err]" +#define GPIO_WARN_PREFIX "[GPIO Wrn]" +#define GPIO_INFO_PREFIX "[GPIO Inf]" + +#define TIMER_ERR_PREFIX "[TIMR Err]" +#define TIMER_WARN_PREFIX "[TIMR Wrn]" +#define TIMER_INFO_PREFIX "[TIMR Inf]" + +#define I2C_ERR_PREFIX "[I2C Err]" +#define I2C_WARN_PREFIX "[I2C Wrn]" +#define I2C_INFO_PREFIX "[I2C Inf]" + +#define I2S_ERR_PREFIX "[I2S Err]" +#define I2S_WARN_PREFIX "[I2S Wrn]" +#define I2S_INFO_PREFIX "[I2S Inf]" + +#define MII_ERR_PREFIX "[MII Err]" +#define MII_WARN_PREFIX "[MII Wrn]" +#define MII_INFO_PREFIX "[MII Inf]" + +#define NFC_ERR_PREFIX "[NFC Err]" +#define NFC_WARN_PREFIX "[NFC Wrn]" +#define NFC_INFO_PREFIX "[NFC Inf]" + +#define PCM_ERR_PREFIX "[PCM Err]" +#define PCM_WARN_PREFIX "[PCM Wrn]" +#define PCM_INFO_PREFIX "[PCM Inf]" + +#define PWM_ERR_PREFIX "[PWM Err]" +#define PWM_WARN_PREFIX "[PWM Wrn]" +#define PWM_INFO_PREFIX "[PWM Inf]" + +#define SSI_ERR_PREFIX "[SSI Err]" +#define SSI_WARN_PREFIX "[SSI Wrn]" +#define SSI_INFO_PREFIX "[SSI Inf]" + +#define SDIO_ERR_PREFIX "[SDIO Err]" +#define SDIO_WARN_PREFIX "[SDIO Wrn]" +#define SDIO_INFO_PREFIX "[SDIO Inf]" + +#define SPIF_ERR_PREFIX "[SPIF Err]" +#define SPIF_WARN_PREFIX "[SPIF Wrn]" +#define SPIF_INFO_PREFIX "[SPIF Inf]" + +#define SDR_ERR_PREFIX "[SDR Err]" +#define SDR_WARN_PREFIX "[SDR Wrn]" +#define SDR_INFO_PREFIX "[SDR Inf]" + +#define UART_ERR_PREFIX "[UART Err]" +#define UART_WARN_PREFIX "[UART Wrn]" +#define UART_INFO_PREFIX "[UART Inf]" + +#define USB_ERR_PREFIX "[USB Err]" +#define USB_WARN_PREFIX "[USB Wrn]" +#define USB_INFO_PREFIX "[USB Inf]" + +#define IPSEC_ERR_PREFIX "[CRYP Err]" +#define IPSEC_WARN_PREFIX "[CRYP Wrn]" +#define IPSEC_INFO_PREFIX "[CRYP Inf]" + +#define ADC_ERR_PREFIX "[ADC Err]" +#define ADC_WARN_PREFIX "[ADC Wrn]" +#define ADC_INFO_PREFIX "[ADC Inf]" + +#define DAC_ERR_PREFIX "[DAC Err]" +#define DAC_WARN_PREFIX "[DAC Wrn]" +#define DAC_INFO_PREFIX "[DAC Inf]" + +#define MISC_ERR_PREFIX "[MISC Err]" +#define MISC_WARN_PREFIX "[MISC Wrn]" +#define MISC_INFO_PREFIX "[MISC Inf]" + +#define OTG_ERR_PREFIX "[OTG Err]" +#define OTG_WARN_PREFIX "[OTG Wrn]" +#define OTG_INFO_PREFIX "[OTG Inf]" + +#define OTG_PREFIX "RTL8195A[OTG]: " +#define OTG_PREFIX_LVL "RTL8195A[OTG_LVL_%2x]: " + +//#ifdef +#define CONFIG_DEBUG_ERROR 1 +#define CONFIG_DEBUG_WARN 1 +#define CONFIG_DEBUG_INFO 1 + +#ifndef likely +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#ifdef CONFIG_DEBUG_LOG + +#if CONFIG_DEBUG_ERROR // if Build-In Debug Error Message + +#define DBG_BOOT_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_BOOT_)) \ + _DbgDump("\r"BOOT_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_GDMA_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_GDMA_)) \ + _DbgDump("\r"GDMA_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_GPIO_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_GPIO_)) \ + _DbgDump("\r"GPIO_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_TIMER_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_TIMER_)) \ + _DbgDump("\r"TIMER_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_I2C_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_I2C_)) \ + _DbgDump("\r"I2C_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_I2S_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_I2S_)) \ + _DbgDump("\r"I2S_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_MII_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_MII_)) \ + _DbgDump("\r"MII_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_NFC_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_NFC_)) \ + _DbgDump("\r"NFC_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_PCM_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_PCM_)) \ + _DbgDump("\r"PCM_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_PWM_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_PWM_)) \ + _DbgDump("\r"PWM_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SSI_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_SSI_)) \ + _DbgDump("\r"SSI_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SDIO_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_SDIO_)) \ + _DbgDump("\r"SDIO_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SPIF_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_SPI_FLASH_)) \ + _DbgDump("\r"SPIF_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SDR_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_SDR_)) \ + _DbgDump("\r"SDR_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_UART_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_UART_)) \ + _DbgDump("\r"UART_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_USBOTG_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_USB_OTG_)) \ + _DbgDump("\r" __VA_ARGS__);\ +}while(0) + +#define DBG_USBCOR_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_USB_CORE_)) \ + _DbgDump("\r"USB_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_CRYPTO_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_CRYPTO_)) \ + _DbgDump("\r"IPSEC_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_ADC_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_ADC_)) \ + _DbgDump("\r"ADC_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_DAC_ERR(...) do {\ + if (likely(ConfigDebugErr & _DBG_DAC_)) \ + _DbgDump("\r"DAC_ERR_PREFIX __VA_ARGS__);\ +}while(0) + +#define MSG_MBOX_ERR(...) do {\ + if (likely(CfgSysDebugErr & _SYSDBG_MAILBOX_)) \ + _DbgDump("\r"MBOX_PREFIX __VA_ARGS__);\ +}while(0) + +#define MSG_TIMER_ERR(...) do {\ + if (likely(CfgSysDebugErr & _SYSDBG_TIMER_)) \ + _DbgDump("\r"TIMER_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_8195A_OTG(...) do{\ + if (unlikely(ConfigDebugInfo & _DBG_USB_OTG_)) \ + _DbgDump("\r"OTG_PREFIX __VA_ARGS__);\ + }while(0) + + +#define DBG_8195A_OTG_LVL(LVL,...) do{\ + if (unlikely(ConfigDebugInfo & _DBG_USB_OTG_)){ \ + _DbgDump("\r"OTG_PREFIX_LVL,LVL);\ + _DbgDump(__VA_ARGS__);\ + }\ + }while(0) + +#else // else of "#if CONFIG_DEBUG_ERROR" + +#define DBG_BOOT_ERR(...) +#define DBG_GDMA_ERR(...) +#define DBG_GPIO_ERR(...) +#define DBG_TIMER_ERR(...) +#define DBG_I2C_ERR(...) +#define DBG_I2S_ERR(...) +#define DBG_MII_ERR(...) +#define DBG_NFC_ERR(...) +#define DBG_PCM_ERR(...) +#define DBG_PWM_ERR(...) +#define DBG_SSI_ERR(...) +#define DBG_SDIO_ERR(...) +#define DBG_SPIF_ERR(...) +#define DBG_SDR_ERR(...) +#define DBG_UART_ERR(...) +#define DBG_USBOTG_ERR(...) +#define DBG_USBCOR_ERR(...) +#define DBG_CRYPTO_ERR(...) +#define DBG_ADC_ERR(...) +#define DBG_DAC_ERR(...) + +#define MSG_MBOX_ERR(...) +#define MSG_TIMER_ERR(...) +#define DBG_8195A_OTG(...) +#define DBG_8195A_OTG_LVL(LVL,...) + +#endif // end of else of "#if CONFIG_DEBUG_ERROR" + +// ============================================================= + +#if CONFIG_DEBUG_WARN // if Build-In Debug Warring Message + +#define DBG_BOOT_WARN(...) do {\ + if (unlikely(ConfigDebugWarn& _DBG_BOOT_)) \ + _DbgDump("\r"BOOT_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_GDMA_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_GDMA_)) \ + _DbgDump("\r"GDMA_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_GPIO_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_GPIO_)) \ + _DbgDump("\r"GPIO_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_TIMER_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_TIMER_)) \ + _DbgDump("\r"TIMER_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_I2C_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_I2C_)) \ + _DbgDump("\r"I2C_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_I2S_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_I2S_)) \ + _DbgDump("\r"I2S_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_MII_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_MII_)) \ + _DbgDump("\r"MII_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_NFC_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_NFC_)) \ + _DbgDump("\r"NFC_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_PCM_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_PCM_)) \ + _DbgDump("\r"PCM_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_PWM_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_PWM_)) \ + _DbgDump("\r"PWM_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SSI_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_SSI_)) \ + _DbgDump("\r"SSI_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SDIO_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_SDIO_)) \ + _DbgDump("\r"SDIO_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SPIF_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_SPI_FLASH_)) \ + _DbgDump("\r"SPIF_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SDR_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_SDR_)) \ + _DbgDump("\r"SDR_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_UART_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_UART_)) \ + _DbgDump("\r"UART_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_USBOTG_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_USB_OTG_)) \ + _DbgDump("\r" __VA_ARGS__);\ +}while(0) + +#define DBG_USBCOR_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_USB_CORE_)) \ + _DbgDump("\r"USB_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_CRYPTO_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_CRYPTO_)) \ + _DbgDump("\r"IPSEC_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_ADC_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_ADC_)) \ + _DbgDump("\r"ADC_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_DAC_WARN(...) do {\ + if (unlikely(ConfigDebugWarn & _DBG_DAC_)) \ + _DbgDump("\r"DAC_WARN_PREFIX __VA_ARGS__);\ +}while(0) + +#define MSG_MBOX_WARN(...) do {\ + if (unlikely(CfgSysDebugWarn& _SYSDBG_MAILBOX_)) \ + _DbgDump("\r"MBOX_PREFIX __VA_ARGS__);\ +}while(0) + +#define MSG_TIMER_WARN(...) do {\ + if (unlikely(CfgSysDebugWarn & _SYSDBG_TIMER_)) \ + _DbgDump("\r"TIMER_PREFIX __VA_ARGS__);\ +}while(0) + +#else // else of "#if CONFIG_DEBUG_WARN" + +#define DBG_BOOT_WARN(...) +#define DBG_GDMA_WARN(...) +#define DBG_GPIO_WARN(...) +#define DBG_TIMER_WARN(...) +#define DBG_I2C_WARN(...) +#define DBG_I2S_WARN(...) +#define DBG_MII_WARN(...) +#define DBG_NFC_WARN(...) +#define DBG_PCM_WARN(...) +#define DBG_PWM_WARN(...) +#define DBG_SSI_WARN(...) +#define DBG_SDIO_WARN(...) +#define DBG_SPIF_WARN(...) +#define DBG_SDR_WARN(...) +#define DBG_UART_WARN(...) +#define DBG_USBOTG_WARN(...) +#define DBG_USBCOR_WARN(...) +#define DBG_CRYPTO_WARN(...) +#define DBG_ADC_WARN(...) +#define DBG_DAC_WARN(...) + +#define MSG_MBOX_WARN(...) +#define MSG_TIMER_WARN(...) + +#endif // end of else of "#if CONFIG_DEBUG_WARN" + +// ============================================================= + +#if CONFIG_DEBUG_INFO // if Build-In Debug Information Message + +#define DBG_BOOT_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_BOOT_)) \ + _DbgDump("\r"BOOT_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_GDMA_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_GDMA_)) \ + _DbgDump("\r"GDMA_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_GPIO_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_GPIO_)) \ + _DbgDump("\r"GPIO_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_TIMER_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_TIMER_)) \ + _DbgDump("\r"TIMER_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_I2C_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_I2C_)) \ + _DbgDump("\r"I2C_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_I2S_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_I2S_)) \ + _DbgDump("\r"I2S_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_MII_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_MII_)) \ + _DbgDump("\r"MII_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_NFC_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_NFC_)) \ + _DbgDump("\r"NFC_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_PCM_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_PCM_)) \ + _DbgDump("\r"PCM_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_PWM_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_PWM_)) \ + _DbgDump("\r"PWM_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SSI_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_SSI_)) \ + _DbgDump("\r"SSI_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SDIO_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_SDIO_)) \ + _DbgDump("\r"SDIO_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SPIF_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_SPI_FLASH_)) \ + _DbgDump("\r"SPIF_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_SDR_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_SDR_)) \ + _DbgDump("\r"SDR_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_UART_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_UART_)) \ + _DbgDump("\r"UART_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_USBOTG_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_USB_OTG_)) \ + _DbgDump("\r" __VA_ARGS__);\ +}while(0) + +#define DBG_USBCOR_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_USB_CORE_)) \ + _DbgDump("\r"USB_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_CRYPTO_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_CRYPTO_)) \ + _DbgDump("\r"IPSEC_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_ADC_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_ADC_)) \ + _DbgDump("\r"ADC_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_DAC_INFO(...) do {\ + if (unlikely(ConfigDebugInfo & _DBG_DAC_)) \ + _DbgDump("\r"DAC_INFO_PREFIX __VA_ARGS__);\ +}while(0) + +#define MSG_MBOX_INFO(...) do {\ + if (unlikely(CfgSysDebugInfo & _SYSDBG_MAILBOX_)) \ + _DbgDump("\r"MBOX_PREFIX __VA_ARGS__);\ +}while(0) + +#define MSG_TIMER_INFO(...) do {\ + if (unlikely(CfgSysDebugInfo & _SYSDBG_TIMER_)) \ + _DbgDump("\r"TIMER_PREFIX __VA_ARGS__);\ +}while(0) + +#else // else of "#if CONFIG_DEBUG_INFO" + +#define DBG_BOOT_INFO(...) +#define DBG_GDMA_INFO(...) +#define DBG_GPIO_INFO(...) +#define DBG_TIMER_INFO(...) +#define DBG_I2C_INFO(...) +#define DBG_I2S_INFO(...) +#define DBG_MII_INFO(...) +#define DBG_NFC_INFO(...) +#define DBG_PCM_INFO(...) +#define DBG_PWM_INFO(...) +#define DBG_SSI_INFO(...) +#define DBG_SDIO_INFO(...) +#define DBG_SPIF_INFO(...) +#define DBG_SDR_INFO(...) +#define DBG_UART_INFO(...) +#define DBG_USBOTG_INFO(...) +#define DBG_USBCOR_INFO(...) +#define DBG_CRYPTO_INFO(...) +#define DBG_ADC_INFO(...) +#define DBG_DAC_INFO(...) + +#define MSG_MBOX_INFO(...) +#define MSG_TIMER_INFO(...) + +#endif // end of else of "#if CONFIG_DEBUG_INFO" + +#define DBG_8195A_DRIVER(...) do {\ + if (unlikely(ConfigDebugErr & (_DBG_I2S_|_DBG_PCM_|_DBG_TIMER_))) \ + _DbgDump("\r"DRIVER_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_8195A_HAL(...) do {\ + if (unlikely(ConfigDebugErr & (_DBG_SDR_|_DBG_MISC_))) \ + _DbgDump("\r"HAL_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_8195A_DMA(...) do {\ + if (unlikely(ConfigDebugErr & _DBG_GDMA_)) \ + _DbgDump("\r"DMA_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_8195A_SDIO(...) do {\ + if (unlikely(ConfigDebugErr & _DBG_SDIO_)) \ + _DbgDump("\r"SDIO_PREFIX __VA_ARGS__);\ +}while(0) + +#define DBG_8195A(...) do {\ + if (unlikely(ConfigDebugErr & _DBG_MISC_)) \ + _DbgDump("\r" __VA_ARGS__);\ +}while(0) + +#define MONITOR_LOG(...) do {\ + if (unlikely(ConfigDebugErr & _DBG_MISC_)) \ + _DbgDump( __VA_ARGS__);\ +}while(0) + +#define DBG_ERROR_LOG(...) do {\ + if (unlikely(ConfigDebugErr & _DBG_FAULT_)) \ + _DbgDump( __VA_ARGS__);\ +}while(0) + +#define DBG_ASSERT(x) do {\ + if (unlikely(!(x))) \ + _DbgDump("Assertion: %s:%s, %d\n", __FILE__, __func__, __LINE__);\ + }while(0) + + +#else // else of "#if CONFIG_DEBUG_LOG" +#define DBG_8195A_DRIVER(...) + +#define DBG_8195A_HAL(...) + +#define DBG_8195A(...) + +#define DBG_8195A_DMA(...) + +#define MONITOR_LOG(...) + +#define DBG_ERROR_LOG(...) + +#define DBG_8195A_SDIO(...) + +#define DBG_BOOT_ERR(...) +#define DBG_GDMA_ERR(...) +#define DBG_GPIO_ERR(...) +#define DBG_TIMER_ERR(...) +#define DBG_I2C_ERR(...) +#define DBG_I2S_ERR(...) +#define DBG_MII_ERR(...) +#define DBG_NFC_ERR(...) +#define DBG_PCM_ERR(...) +#define DBG_PWM_ERR(...) +#define DBG_SSI_ERR(...) +#define DBG_SDIO_ERR(...) +#define DBG_SPIF_ERR(...) +#define DBG_SDR_ERR(...) +#define DBG_UART_ERR(...) +#define DBG_USBOTG_ERR(...) +#define DBG_USBCOR_ERR(...) +#define DBG_CRYPTO_ERR(...) +#define DBG_ADC_ERR(...) +#define DBG_DAC_ERR(...) +#define MSG_MBOX_ERR(...) +#define MSG_TIMER_ERR(...) + +#define DBG_BOOT_WARN(...) +#define DBG_GDMA_WARN(...) +#define DBG_GPIO_WARN(...) +#define DBG_TIMER_WARN(...) +#define DBG_I2C_WARN(...) +#define DBG_I2S_WARN(...) +#define DBG_MII_WARN(...) +#define DBG_NFC_WARN(...) +#define DBG_PCM_WARN(...) +#define DBG_PWM_WARN(...) +#define DBG_SSI_WARN(...) +#define DBG_SDIO_WARN(...) +#define DBG_SPIF_WARN(...) +#define DBG_SDR_WARN(...) +#define DBG_UART_WARN(...) +#define DBG_USBOTG_WARN(...) +#define DBG_USBCOR_WARN(...) +#define DBG_CRYPTO_WARN(...) +#define DBG_ADC_WARN(...) +#define DBG_DAC_WARN(...) +#define MSG_MBOX_WARN(...) +#define MSG_TIMER_WARN(...) + +#define DBG_BOOT_INFO(...) +#define DBG_GDMA_INFO(...) +#define DBG_GPIO_INFO(...) +#define DBG_TIMER_INFO(...) +#define DBG_I2C_INFO(...) +#define DBG_I2S_INFO(...) +#define DBG_MII_INFO(...) +#define DBG_NFC_INFO(...) +#define DBG_PCM_INFO(...) +#define DBG_PWM_INFO(...) +#define DBG_SSI_INFO(...) +#define DBG_SDIO_INFO(...) +#define DBG_SPIF_INFO(...) +#define DBG_SDR_INFO(...) +#define DBG_UART_INFO(...) +#define DBG_USBOTG_INFO(...) +#define DBG_USBCOR_INFO(...) +#define DBG_CRYPTO_INFO(...) +#define DBG_ADC_INFO(...) +#define DBG_DAC_INFO(...) + +#define MSG_MBOX_INFO(...) +#define MSG_TIMER_INFO(...) + +#define DBG_ASSERT(x) + +#endif + +#define ANSI_COLOR_GREEN "\x1b[32m" +#define ANSI_COLOR_CYAN "\x1b[36m" +#define ANSI_COLOR_YELLOW "\x1b[33m" +#define ANSI_COLOR_MAGENTA "\x1b[35m" +#define ANSI_COLOR_RED "\x1b[31m" +#define ANSI_COLOR_BLUE "\x1b[34m" +#define ANSI_COLOR_RESET "\x1b[0m" + +#define IDENT_ONE_SPACE " " +#define IDENT_TWO_SPACE " " +#define IDENT_FOUR_SPACE " " +#define IDENT_SIX_SPACE " " +#define IDENT_EIGHT_SPACE " " + +#ifdef CONFIG_DEBUG_LOG +typedef enum _DBG_CFG_TYPE_ { + DBG_CFG_ERR=0, + DBG_CFG_WARN=1, + DBG_CFG_INFO=2 +} DBG_CFG_TYPE; + +typedef struct _DBG_CFG_CMD_ { + u8 cmd_name[16]; + u32 cmd_type; +} DBG_CFG_CMD, *PDBG_CFG_CMD; + +#endif + +typedef enum _CONSOLE_OP_STAGE_ { + ROM_STAGE = 0, + RAM_STAGE = 1 +}CONSOLE_OP_STAGE; + +#ifdef __cplusplus +} +#endif +#endif //_DIAG_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_adc.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_adc.h new file mode 100644 index 0000000..1cfa3cc --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_adc.h @@ -0,0 +1,300 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_ADC_H_ +#define _HAL_ADC_H_ + +#include "rtl8195a.h" +#include "rtl8195a_adc.h" +#include "hal_gdma.h" + +//================ ADC Configuration ========================= +#define ADC_INTR_OP_TYPE 1 +#define ADC_DMA_OP_TYPE 1 + +// ADC SAL management macros +#define SAL_ADC_USER_CB_NUM (sizeof(SAL_ADC_USER_CB) / sizeof(PSAL_ADC_USERCB_ADPT)) + +// ADC used module. +// Please set the ADC module flag to 1 to enable the related +#define ADC0_USED 1 +#define ADC1_USED 1 +#define ADC2_USED 1 +#define ADC3_USED 1 + + +//================ Debug MSG Definition ======================= +#define ADC_PREFIX "RTL8195A[adc]: " +#define ADC_PREFIX_LVL " [ADC_DBG]: " + +typedef enum _ADC_DBG_LVL_ { + HAL_ADC_LVL = 0x01, + SAL_ADC_LVL = 0x02, + VERI_ADC_LVL = 0x04, +}ADC_DBG_LVL,*PADC_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_ADC_HAL + + #define DBG_8195A_ADC(...) do{ \ + _DbgDump("\r"ADC_PREFIX __VA_ARGS__);\ + }while(0) + + + #define ADCDBGLVL 0xFF + #define DBG_8195A_ADC_LVL(LVL,...) do{\ + if (LVL&ADCDBGLVL){\ + _DbgDump("\r"ADC_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_ADC_LOG_PERD 100 + #define DBG_8195A_ADC(...) + #define DBG_8195A_ADC_LVL(...) +#endif +#endif + + +//================ ADC HAL Related Enumeration ================== +// ADC Module Selection +typedef enum _ADC_MODULE_SEL_ { + ADC0_SEL = 0x0, + ADC1_SEL = 0x1, + ADC2_SEL = 0x2, + ADC3_SEL = 0x3, +}ADC_MODULE_SEL,*PADC_MODULE_SEL; + +// ADC module status +typedef enum _ADC_MODULE_STATUS_ { + ADC_DISABLE = 0x0, + ADC_ENABLE = 0x1, +}ADC_MODULE_STATUS, *PADC_MODULE_STATUS; + +// ADC Data Endian +typedef enum _ADC_DATA_ENDIAN_ { + ADC_DATA_ENDIAN_LITTLE = 0x0, + ADC_DATA_ENDIAN_BIG = 0x1, +}ADC_DATA_ENDIAN,*PADC_DATA_ENDIAN; + +// ADC Debug Select +typedef enum _ADC_DEBUG_SEL_ { + ADC_DBG_SEL_DISABLE = 0x0, + ADC_DBG_SEL_ENABLE = 0x1, +}ADC_DEBUG_SEL,*PADC_DEBUG_SEL; + +typedef enum _ADC_COMPARE_SET_ { + ADC_COMP_SMALLER_THAN = 0x0, + ADC_COMP_GREATER_THAN = 0x1, +}ADC_COMPARE_SET, *PADC_COMPARE_SET; + +// ADC feature status +typedef enum _ADC_FEATURE_STATUS_{ + ADC_FEATURE_DISABLED = 0, + ADC_FEATURE_ENABLED = 1, +}ADC_FEATURE_STATUS,*PADC_FEATURE_STATUS; + +// ADC operation type +typedef enum _ADC_OP_TYPE_ { + ADC_RDREG_TYPE = 0x0, + ADC_DMA_TYPE = 0x1, + ADC_INTR_TYPE = 0x2, +}ADC_OP_TYPE, *PADC_OP_TYPE; + +// ADC device status +typedef enum _ADC_DEVICE_STATUS_ { + ADC_STS_UNINITIAL = 0x00, + ADC_STS_INITIALIZED = 0x01, + ADC_STS_IDLE = 0x02, + + ADC_STS_TX_READY = 0x03, + ADC_STS_TX_ING = 0x04, + + ADC_STS_RX_READY = 0x05, + ADC_STS_RX_ING = 0x06, + + ADC_STS_ERROR = 0x07, + ADC_STS_FULL = 0x08, +}ADC_DEVICE_STATUS, *PADC_DEVICE_STATUS; + +// ADC error type +typedef enum _ADC_ERR_TYPE_ { + ADC_ERR_FIFO_RD_ERROR = 0x40, //ADC FIFO read error +}ADC_ERR_TYPE, *PADC_ERR_TYPE; + +// ADC initial status +typedef enum _ADC_INITAIL_STATUS_ { + ADC0_INITED = 0x1, + ADC1_INITED = 0x2, + ADC2_INITED = 0x4, + ADC3_INITED = 0x8, +}ADC_INITAIL_STATUS, *PADC_INITAIL_STATUS; + + +//================ ADC HAL Data Structure ====================== +// ADC HAL initial data structure +typedef struct _HAL_ADC_INIT_DAT_ { + u8 ADCIdx; //ADC index used + u8 ADCEn; //ADC module enable + u8 ADCEndian; //ADC endian selection, + //but actually it's for 32-bit ADC data swap control + //1'b0: no swap, + //1'b1: swap the upper 16-bit and the lower 16-bit + u8 ADCBurstSz; //ADC DMA operation threshold + + u8 ADCCompOnly; //ADC compare mode only enable (without FIFO enable) + u8 ADCOneShotEn; //ADC one-shot mode enable + u8 ADCOverWREn; //ADC overwrite mode enable + u8 ADCOneShotTD; //ADC one shot mode threshold + + u16 ADCCompCtrl; //ADC compare mode control, + //1'b0:less than the compare threshold + //1'b1:greater than the compare threshod + u16 ADCCompTD; //ADC compare mode threshold + + u8 ADCDataRate; //ADC down sample data rate, + u8 ADCAudioEn; //ADC audio mode enable + u8 ADCEnManul; //ADC enable manually + u8 ADCDbgSel; + + u32 RSVD0; + + u32 *ADCData; //ADC data pointer + u32 ADCPWCtrl; //ADC0 power control + u32 ADCIntrMSK; //ADC Interrupt Mask + u32 ADCAnaParAd3; //ADC analog parameter 3 +}HAL_ADC_INIT_DAT,*PHAL_ADC_INIT_DAT; + +// ADC HAL Operations +typedef struct _HAL_ADC_OP_ { + RTK_STATUS (*HalADCInit) (VOID *Data); //HAL ADC initialization + RTK_STATUS (*HalADCDeInit) (VOID *Data); //HAL ADC de-initialization + RTK_STATUS (*HalADCEnable) (VOID *Data); //HAL ADC de-initialization + u32 (*HalADCReceive) (VOID *Data); //HAL ADC receive + RTK_STATUS (*HalADCIntrCtrl) (VOID *Data); //HAL ADC interrupt control + u32 (*HalADCReadReg) (VOID *Data, u8 ADCReg);//HAL ADC read register +}HAL_ADC_OP, *PHAL_ADC_OP; + +// ADC user callback adapter +typedef struct _SAL_ADC_USERCB_ADPT_ { + VOID (*USERCB) (VOID *Data); + u32 USERData; +}SAL_ADC_USERCB_ADPT, *PSAL_ADC_USERCB_ADPT; + +// ADC user callback structure +typedef struct _SAL_ADC_USER_CB_ { + PSAL_ADC_USERCB_ADPT pTXCB; //ADC Transmit Callback + PSAL_ADC_USERCB_ADPT pTXCCB; //ADC Transmit Complete Callback + PSAL_ADC_USERCB_ADPT pRXCB; //ADC Receive Callback + PSAL_ADC_USERCB_ADPT pRXCCB; //ADC Receive Complete Callback + PSAL_ADC_USERCB_ADPT pRDREQCB; //ADC Read Request Callback + PSAL_ADC_USERCB_ADPT pERRCB; //ADC Error Callback + PSAL_ADC_USERCB_ADPT pDMATXCB; //ADC DMA Transmit Callback + PSAL_ADC_USERCB_ADPT pDMATXCCB; //ADC DMA Transmit Complete Callback + PSAL_ADC_USERCB_ADPT pDMARXCB; //ADC DMA Receive Callback + PSAL_ADC_USERCB_ADPT pDMARXCCB; //ADC DMA Receive Complete Callback +}SAL_ADC_USER_CB, *PSAL_ADC_USER_CB; + +// ADC Transmit Buffer +typedef struct _SAL_ADC_TRANSFER_BUF_ { + u32 DataLen; //ADC Transmfer Length + u32 *pDataBuf; //ADC Transfer Buffer Pointer + u32 RSVD; // +}SAL_ADC_TRANSFER_BUF,*PSAL_ADC_TRANSFER_BUF; + +// Software API Level ADC Handler +typedef struct _SAL_ADC_HND_ { + u8 DevNum; //ADC device number + u8 PinMux; //ADC pin mux seletion + u8 OpType; //ADC operation type selection + volatile u8 DevSts; //ADC device status + + u32 ADCExd; //ADC extended options: + //bit 0: example + //bit 31~bit 1: Reserved + u32 ErrType; // + u32 TimeOut; //ADC IO Timeout count + + PHAL_ADC_INIT_DAT pInitDat; //Pointer to ADC initial data struct + PSAL_ADC_TRANSFER_BUF pRXBuf; //Pointer to ADC TX buffer + PSAL_ADC_USER_CB pUserCB; //Pointer to ADC User Callback +}SAL_ADC_HND, *PSAL_ADC_HND; + +// ADC SAL handle private +typedef struct _SAL_ADC_HND_PRIV_ { + VOID **ppSalADCHnd; //Pointer to SAL_ADC_HND pointer + SAL_ADC_HND SalADCHndPriv; //Private SAL_ADC_HND +}SAL_ADC_HND_PRIV, *PSAL_ADC_HND_PRIV; + +//ADC SAL management adapter +typedef struct _SAL_ADC_MNGT_ADPT_ { + PSAL_ADC_HND_PRIV pSalHndPriv; //Pointer to SAL_ADC_HND + PHAL_ADC_INIT_DAT pHalInitDat; //Pointer to HAL ADC initial data( HAL_ADC_INIT_DAT ) + PHAL_ADC_OP pHalOp; //Pointer to HAL ADC operation( HAL_ADC_OP ) + VOID (*pHalOpInit)(VOID*);//Pointer to HAL ADC initialize function + + PIRQ_HANDLE pIrqHnd; //Pointer to IRQ handler in SAL layer( IRQ_HANDLE ) + VOID (*pSalIrqFunc)(VOID*); //Used for SAL ADC interrupt function + VOID (*pHalGdmaOpInit)(VOID*); //Pointer to HAL ADC initialize function + PHAL_GDMA_ADAPTER pHalGdmaAdp; + PHAL_GDMA_OP pHalGdmaOp; + + VOID (*pSalDMAIrqFunc)(VOID*); //Used for SAL I2C interrupt function + PIRQ_HANDLE pIrqGdmaHnd; + PSAL_ADC_USER_CB pUserCB; //Pointer to SAL user callbacks (SAL_ADC_USER_CB ) +}SAL_ADC_MNGT_ADPT, *PSAL_ADC_MNGT_ADPT; + + +//================ ADC HAL Function Prototype =================== +// ADC HAL inline function +// For checking I2C input index valid or not +static inline RTK_STATUS +RtkADCIdxChk( + IN u8 ADCIdx +) +{ +#if !ADC0_USED + if (ADCIdx == ADC0_SEL) + return _EXIT_FAILURE; +#endif + +#if !ADC1_USED + if (ADCIdx == ADC1_SEL) + return _EXIT_FAILURE; +#endif + +#if !ADC2_USED + if (ADCIdx == ADC2_SEL) + return _EXIT_FAILURE; +#endif + +#if !ADC3_USED + if (ADCIdx == ADC3_SEL) + return _EXIT_FAILURE; +#endif + + return _EXIT_SUCCESS; +} + +VOID HalADCOpInit(IN VOID *Data); +PSAL_ADC_HND RtkADCGetSalHnd(IN u8 DACIdx); +RTK_STATUS RtkADCFreeSalHnd(IN PSAL_ADC_HND pSalADCHND); +RTK_STATUS RtkADCLoadDefault(IN VOID *Data); +RTK_STATUS RtkADCInit(IN VOID *Data); +RTK_STATUS RtkADCDeInit(IN VOID *Data); +//RTK_STATUS RtkADCReceive(IN VOID *Data); +u32 RtkADCReceive(IN VOID *Data); +u32 RtkADCReceiveBuf(IN VOID *Data,IN u32 *pBuf); +uint32_t RtkADCReceiveBuf_for_random(IN VOID *Data); + +PSAL_ADC_MNGT_ADPT RtkADCGetMngtAdpt(IN u8 ADCIdx); +RTK_STATUS RtkADCFreeMngtAdpt(IN PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt); +VOID ADCISRHandle(IN VOID *Data); +VOID ADCGDMAISRHandle(IN VOID *Data); + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_api.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_api.h new file mode 100644 index 0000000..9067a0c --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_api.h @@ -0,0 +1,64 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#ifndef _HAL_API_H_ +#define _HAL_API_H_ + +#define HAL_READ32(base, addr) \ + rtk_le32_to_cpu(*((volatile u32*)(base + addr))) + +#define HAL_WRITE32(base, addr, value32) \ + ((*((volatile u32*)(base + addr))) = rtk_cpu_to_le32(value32)) + + +#define HAL_READ16(base, addr) \ + rtk_le16_to_cpu(*((volatile u16*)(base + addr))) + +#define HAL_WRITE16(base, addr, value) \ + ((*((volatile u16*)(base + addr))) = rtk_cpu_to_le16(value)) + + +#define HAL_READ8(base, addr) \ + (*((volatile u8*)(base + addr))) + +#define HAL_WRITE8(base, addr, value) \ + ((*((volatile u8*)(base + addr))) = value) + +#define PinCtrl HalPinCtrlRtl8195A + +#define DiagPutChar HalSerialPutcRtl8195a +#define DiagGetChar HalSerialGetcRtl8195a +#define DiagGetIsrEnReg HalSerialGetIsrEnRegRtl8195a +#define DiagSetIsrEnReg HalSerialSetIrqEnRegRtl8195a + +#define InterruptForOSInit VectorTableInitForOSRtl8195A +#define InterruptRegister VectorIrqRegisterRtl8195A +#define InterruptUnRegister VectorIrqUnRegisterRtl8195A + +#define InterruptEn VectorIrqEnRtl8195A +#define InterruptDis VectorIrqDisRtl8195A + +#define SpicFlashInit SpicFlashInitRtl8195A +#define Calibration32k En32KCalibration +#define WDGInit InitWDGIRQ + +typedef enum _HAL_Status +{ + HAL_OK = 0x00, + HAL_BUSY = 0x01, + HAL_TIMEOUT = 0x02, + HAL_ERR_PARA = 0x03, // error with invaild parameters + HAL_ERR_MEM = 0x04, // error with memory allocation failed + HAL_ERR_HW = 0x05, // error with hardware error + + HAL_ERR_UNKNOWN = 0xee // unknown error + +} HAL_Status; + + +#endif //_HAL_API_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_dac.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_dac.h new file mode 100644 index 0000000..564b613 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_dac.h @@ -0,0 +1,284 @@ +//====================================================== +// Routines to access hardware +// +// Copyright (c) 2013 Realtek Semiconductor Corp. +// +// This module is a confidential and proprietary property of RealTek and +// possession or use of this module requires written permission of RealTek. +//====================================================== +#ifndef _HAL_DAC_H_ +#define _HAL_DAC_H_ + +#include "rtl8195a_dac.h" +#include "hal_api.h" +#include "hal_gdma.h" + +//#include "cmsis_os.h" + +//================ DAC Configuration ========================= +#define DAC_INTR_OP_TYPE 1 +#define DAC_DMA_OP_TYPE 1 + +// DAC SAL management macros +#define SAL_DAC_USER_CB_NUM (sizeof(SAL_DAC_USER_CB) / sizeof(PSAL_DAC_USERCB_ADPT)) + +// DAC SAL used module. +// Please set the DAC module flag to 1 to enable the related DAC module functions. +#define DAC0_USED 1 +#define DAC1_USED 1 + + +//================ Debug MSG Definition ======================= +#define DAC_PREFIX "RTL8195A[dac]: " +#define DAC_PREFIX_LVL " [DAC_DBG]: " + +typedef enum _DAC_DBG_LVL_ { + HAL_DAC_LVL = 0x00, + SAL_DAC_LVL = 0x02, + VERI_DAC_LVL = 0x04, +}DAC_DBG_LVL,*PDAC_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_DAC_HAL + + #define DBG_8195A_DAC(...) do{ \ + _DbgDump("\r"DAC_PREFIX __VA_ARGS__);\ + }while(0) + + + #define DACDBGLVL 0xFF + #define DBG_8195A_DAC_LVL(LVL,...) do{\ + if (LVL&DACDBGLVL){\ + _DbgDump("\r"DAC_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_DAC_LOG_PERD 100 + #define DBG_8195A_DAC(...) + #define DBG_8195A_DAC_LVL(...) +#endif +#endif + + +//================ DAC HAL Related Enumeration ================== +// DAC Module Selection +typedef enum _DAC_MODULE_SEL_ { + DAC0_SEL = 0x0, + DAC1_SEL = 0x1, +}DAC_MODULE_SEL,*PDAC_MODULE_SEL; + +// DAC module status +typedef enum _DAC_MODULE_STATUS_ { + DAC_DISABLE = 0x0, + DAC_ENABLE = 0x1, +}DAC_MODULE_STATUS, *PDAC_MODULE_STATUS; + +// DAC Data Rate +typedef enum _DAC_DATA_RATE_ { + DAC_DATA_RATE_10K = 0x0, + DAC_DATA_RATE_250K = 0x1, +}DAC_DATA_RATE,*PDAC_DATA_RATE; + +// DAC Data Endian +typedef enum _DAC_DATA_ENDIAN_ { + DAC_DATA_ENDIAN_LITTLE = 0x0, + DAC_DATA_ENDIAN_BIG = 0x1, +}DAC_DATA_ENDIAN,*PDAC_DATA_ENDIAN; + +// DAC Debug Select +typedef enum _DAC_DEBUG_SEL_ { + DAC_DBG_SEL_DISABLE = 0x0, + DAC_DBG_SEL_ENABLE = 0x1, +}DAC_DEBUG_SEL,*PDAC_DEBUG_SEL; + +// DAC Dsc Debug Select +typedef enum _DAC_DSC_DEBUG_SEL_ { + DAC_DSC_DBG_SEL_DISABLE = 0x0, + DAC_DSC_DBG_SEL_ENABLE = 0x1, +}DAC_DSC_DEBUG_SEL,*PDAC_DSC_DEBUG_SEL; + + +// DAC Bypass Dsc Debug Select +typedef enum _DAC_BYPASS_DSC_SEL_ { + DAC_BYPASS_DSC_SEL_DISABLE = 0x0, + DAC_BYPASS_DSC_SEL_ENABLE = 0x1, +}DAC_BYPASS_DSC_SEL,*PDAC_BYPASS_DSC_SEL; + +// DAC feature status +typedef enum _DAC_FEATURE_STATUS_{ + DAC_FEATURE_DISABLED = 0, + DAC_FEATURE_ENABLED = 1, +}DAC_FEATURE_STATUS,*PDAC_FEATURE_STATUS; + +// DAC operation type +typedef enum _DAC_OP_TYPE_ { + DAC_POLL_TYPE = 0x0, + DAC_DMA_TYPE = 0x1, + DAC_INTR_TYPE = 0x2, +}DAC_OP_TYPE, *PDAC_OP_TYPE; + +// DAC device status +typedef enum _DAC_Device_STATUS_ { + DAC_STS_UNINITIAL = 0x00, + DAC_STS_INITIALIZED = 0x01, + DAC_STS_IDLE = 0x02, + + DAC_STS_TX_READY = 0x03, + DAC_STS_TX_ING = 0x04, + + DAC_STS_RX_READY = 0x05, + DAC_STS_RX_ING = 0x06, + + DAC_STS_ERROR = 0x07, +}DAC_Device_STATUS, *PDAC_Device_STATUS; + +//DAC device error type +typedef enum _DAC_ERR_TYPE_ { + DAC_ERR_FIFO_OVER = 0x04, //DAC FIFO overflow. + DAC_ERR_FIFO_STOP = 0x08, //DAC FIFO is completely empty, and it will be stopped automatically. + DAC_ERR_FIFO_WRFAIL = 0x10, //When DAC is NOT enabled, a write operation attempts to access DAC register. + DAC_ERR_FIFO_DSC_OVER0 = 0x20, + DAC_ERR_FIFO_DSC_OVER1 = 0x40, +}DAC_ERR_TYPE, *PDAC_ERR_TYPE; + + +//====================================================== +// DAC HAL initial data structure +typedef struct _HAL_DAC_INIT_DAT_ { + u8 DACIdx; //DAC index used + u8 DACEn; //DAC module enable + u8 DACDataRate; //DAC data rate, 1'b0:10KHz, 1'b1:250KHz + u8 DACEndian; //DAC endian selection, + //but actually it's for 32-bit DAC data swap control + //1'b0: no swap, + //1'b1: swap the upper 16-bit and the lower 16-bit + u8 DACFilterSet; //DAC filter settle + u8 DACBurstSz; //DAC burst size + u8 DACDbgSel; //DAC debug sel + u8 DACDscDbgSel; //DAC debug dsc sel + + u8 DACBPDsc; //DAC bypass delta sigma for loopback + u8 DACDeltaSig; //DAC bypass value of delta sigma + u16 RSVD1; + + + + u32 *DACData; //DAC data pointer + u32 DACPWCtrl; //DAC0 and DAC1 power control + u32 DACAnaCtrl0; //DAC anapar_da control 0 + u32 DACAnaCtrl1; //DAC anapar_da control 1 + u32 DACIntrMSK; //DAC Interrupt Mask +}HAL_DAC_INIT_DAT,*PHAL_DAC_INIT_DAT; + +// DAC HAL Operations +typedef struct _HAL_DAC_OP_ { + RTK_STATUS (*HalDACInit) (VOID *Data); //HAL DAC initialization + RTK_STATUS (*HalDACDeInit) (VOID *Data); //HAL DAC de-initialization + RTK_STATUS (*HalDACEnable) (VOID *Data); //HAL DAC de-initialization + u8 (*HalDACSend) (VOID *Data); //HAL DAC receive + RTK_STATUS (*HalDACIntrCtrl) (VOID *Data); //HAL DAC interrupt control + u32 (*HalDACReadReg) (VOID *Data, u8 DACReg);//HAL DAC read register +}HAL_DAC_OP, *PHAL_DAC_OP; + +// DAC user callback adapter +typedef struct _SAL_DAC_USERCB_ADPT_ { + VOID (*USERCB) (VOID *Data); + u32 USERData; +}SAL_DAC_USERCB_ADPT, *PSAL_DAC_USERCB_ADPT; + +// DAC user callback structure +typedef struct _SAL_DAC_USER_CB_ { + PSAL_DAC_USERCB_ADPT pTXCB; //DAC Transmit Callback + PSAL_DAC_USERCB_ADPT pTXCCB; //DAC Transmit Complete Callback + PSAL_DAC_USERCB_ADPT pRXCB; //DAC Receive Callback + PSAL_DAC_USERCB_ADPT pRXCCB; //DAC Receive Complete Callback + PSAL_DAC_USERCB_ADPT pRDREQCB; //DAC Read Request Callback + PSAL_DAC_USERCB_ADPT pERRCB; //DAC Error Callback + PSAL_DAC_USERCB_ADPT pDMATXCB; //DAC DMA Transmit Callback + PSAL_DAC_USERCB_ADPT pDMATXCCB; //DAC DMA Transmit Complete Callback + PSAL_DAC_USERCB_ADPT pDMARXCB; //DAC DMA Receive Callback + PSAL_DAC_USERCB_ADPT pDMARXCCB; //DAC DMA Receive Complete Callback +}SAL_DAC_USER_CB, *PSAL_DAC_USER_CB; + +// DAC Transmit Buffer +typedef struct _SAL_DAC_TRANSFER_BUF_ { + u32 DataLen; //DAC Transmfer Length + u32 *pDataBuf; //DAC Transfer Buffer Pointer + u32 RSVD; // +}SAL_DAC_TRANSFER_BUF,*PSAL_DAC_TRANSFER_BUF; + +// Software API Level DAC Handler +typedef struct _SAL_DAC_HND_ { + u8 DevNum; //DAC device number + u8 PinMux; //DAC pin mux seletion + u8 OpType; //DAC operation type selection + volatile u8 DevSts; //DAC device status + + u32 DACExd; //I2C extended options: + //bit 0: example + //bit 31~bit 1: Reserved + u32 ErrType; // + u32 TimeOut; //I2C IO Timeout count + + PHAL_DAC_INIT_DAT pInitDat; //Pointer to I2C initial data struct + PSAL_DAC_TRANSFER_BUF pTXBuf; //Pointer to I2C TX buffer + PSAL_DAC_USER_CB pUserCB; //Pointer to I2C User Callback +}SAL_DAC_HND, *PSAL_DAC_HND; + +// DAC SAL handle private +typedef struct _SAL_DAC_HND_PRIV_ { + VOID **ppSalDACHnd; //Pointer to SAL_I2C_HND pointer + SAL_DAC_HND SalDACHndPriv; //Private SAL_I2C_HND +}SAL_DAC_HND_PRIV, *PSAL_DAC_HND_PRIV; + +//DAC SAL management adapter +typedef struct _SAL_DAC_MNGT_ADPT_ { + PSAL_DAC_HND_PRIV pSalHndPriv; //Pointer to SAL_DAC_HND + PHAL_DAC_INIT_DAT pHalInitDat; //Pointer to HAL DAC initial data( HAL_I2C_INIT_DAT ) + PHAL_DAC_OP pHalOp; //Pointer to HAL DAC operation( HAL_DAC_OP ) + PIRQ_HANDLE pIrqHnd; //Pointer to IRQ handler in SAL layer( IRQ_HANDLE ) + + PHAL_GDMA_ADAPTER pHalGdmaAdp; + PHAL_GDMA_OP pHalGdmaOp; + PIRQ_HANDLE pIrqGdmaHnd; + + PSAL_DAC_USER_CB pUserCB; //Pointer to SAL user callbacks (SAL_DAC_USER_CB ) + +//NeoJou +// osThreadId thread_id; +}SAL_DAC_MNGT_ADPT, *PSAL_DAC_MNGT_ADPT; + + +//================ DAC HAL Function Prototype =================== +// DAC HAL inline function +// For checking DAC input index valid or not +static inline RTK_STATUS +RtkDACIdxChk( + IN u8 DACIdx +) +{ +#if !DAC0_USED + if (DACIdx == DAC0_SEL) + return _EXIT_FAILURE; +#endif + +#if !DAC1_USED + if (DACIdx == DAC1_SEL) + return _EXIT_FAILURE; +#endif + + return _EXIT_SUCCESS; +} + +VOID HalDACOpInit(IN VOID *Data); +RTK_STATUS RtkDACLoadDefault(IN VOID *Data); +RTK_STATUS RtkDACInit(IN VOID *Data); +RTK_STATUS RtkDACDeInit(IN VOID *Data); +extern RTK_STATUS RtkDACSend(IN VOID *Data); +//extern osEvent RtkDACWait(void); +PSAL_DAC_HND RtkDACGetSalHnd(IN u8 DACIdx); +RTK_STATUS RtkDACFreeSalHnd(IN PSAL_DAC_HND pSalDACHND); +PSAL_DAC_MNGT_ADPT RtkDACGetMngtAdpt(IN u8 DACIdx); +RTK_STATUS RtkDACFreeMngtAdpt(IN PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt); + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_diag.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_diag.h new file mode 100644 index 0000000..61ad49e --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_diag.h @@ -0,0 +1,107 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_DIAG_H_ +#define _HAL_DIAG_H_ + + +//Register offset +#define UART_REV_BUF_OFF 0x00 +#define UART_TRAN_HOLD_OFF 0x00 +#define UART_DLH_OFF 0x04 +#define UART_DLL_OFF 0x00 +#define UART_INTERRUPT_EN_REG_OFF 0x04 +#define UART_INTERRUPT_IDEN_REG_OFF 0x08 +#define UART_FIFO_CTL_REG_OFF 0x08 +#define UART_LINE_CTL_REG_OFF 0x0c +#define UART_MODEM_CTL_REG_OFF 0x10 +#define UART_LINE_STATUS_REG_OFF 0x14 +#define UART_MODEM_STATUS_REG_OFF 0x18 +#define UART_FIFO_ACCESS_REG_OFF 0x70 +#define UART_STATUS_REG_OFF 0x7c +#define UART_TFL_OFF 0x80 +#define UART_RFL_OFF 0x84 + + +//Buad rate +#define UART_BAUD_RATE_2400 2400 +#define UART_BAUD_RATE_4800 4800 +#define UART_BAUD_RATE_9600 9600 +#define UART_BAUD_RATE_19200 19200 +#define UART_BAUD_RATE_38400 38400 +#define UART_BAUD_RATE_57600 57600 +#define UART_BAUD_RATE_115200 115200 +#define UART_BAUD_RATE_921600 921600 +#define UART_BAUD_RATE_1152000 1152000 + +#define UART_PARITY_ENABLE 0x08 +#define UART_PARITY_DISABLE 0 + +#define UART_DATA_LEN_5BIT 0x0 +#define UART_DATA_LEN_6BIT 0x1 +#define UART_DATA_LEN_7BIT 0x2 +#define UART_DATA_LEN_8BIT 0x3 + +#define UART_STOP_1BIT 0x0 +#define UART_STOP_2BIT 0x4 + + +#define HAL_UART_READ32(addr) HAL_READ32(LOG_UART_REG_BASE, addr) +#define HAL_UART_WRITE32(addr, value) HAL_WRITE32(LOG_UART_REG_BASE, addr, value) +#define HAL_UART_READ16(addr) HAL_READ16(LOG_UART_REG_BASE, addr) +#define HAL_UART_WRITE16(addr, value) HAL_WRITE16(LOG_UART_REG_BASE, addr, value) +#define HAL_UART_READ8(addr) HAL_READ8(LOG_UART_REG_BASE, addr) +#define HAL_UART_WRITE8(addr, value) HAL_WRITE8(LOG_UART_REG_BASE, addr, value) + +typedef struct _LOG_UART_ADAPTER_ { + u32 BaudRate; + u32 FIFOControl; + u32 IntEnReg; + u8 Parity; + u8 Stop; + u8 DataLength; +}LOG_UART_ADAPTER, *PLOG_UART_ADAPTER; + +typedef struct _COMMAND_TABLE_ { + const u8* cmd; + u16 ArgvCnt; + u32 (*func)(u16 argc, u8* argv[]); + const u8* msg; +}COMMAND_TABLE, *PCOMMAND_TABLE; + +//VOID +//HalLogUartHandle(void); + + +extern _LONG_CALL_ u32 +HalLogUartInit( + IN LOG_UART_ADAPTER UartAdapter + ); + + +extern _LONG_CALL_ VOID +HalSerialPutcRtl8195a( + IN u8 c + ); + +extern _LONG_CALL_ u8 +HalSerialGetcRtl8195a( + IN BOOL PullMode + ); + +extern _LONG_CALL_ u32 +HalSerialGetIsrEnRegRtl8195a(VOID); + +extern _LONG_CALL_ VOID +HalSerialSetIrqEnRegRtl8195a ( + IN u32 SetValue +); + + +#endif//_HAL_DIAG_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_efuse.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_efuse.h new file mode 100644 index 0000000..047fada --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_efuse.h @@ -0,0 +1,28 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_EFUSE_H_ +#define _HAL_EFUSE_H_ + +_LONG_CALL_ extern VOID HalEFUSEPowerSwitch8195AROM(IN u8 bWrite, IN u8 PwrState, IN u8 L25OutVoltage); +_LONG_CALL_ extern u32 HALEFUSEOneByteReadROM(IN u32 CtrlSetting, IN u16 Addr, OUT u8 *Data, IN u8 L25OutVoltage); +_LONG_CALL_ extern u32 HALEFUSEOneByteWriteROM(IN u32 CtrlSetting, IN u16 Addr, IN u8 Data, IN u8 L25OutVoltage); + +#define EFUSERead8 HALEFUSEOneByteReadROM +#define EFUSEWrite8 HALEFUSEOneByteWriteROM + +#define L25EOUTVOLTAGE 7 + +VOID HalEFUSEOpInit( + IN VOID *Data +); + + +#endif + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_gdma.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_gdma.h new file mode 100644 index 0000000..4a8d1f3 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_gdma.h @@ -0,0 +1,95 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_GDMA_H_ +#define _HAL_GDMA_H_ + +#include "rtl8195a_gdma.h" + +typedef struct _GDMA_CH_LLI_ELE_ { + u32 Sarx; + u32 Darx; + u32 Llpx; + u32 CtlxLow; + u32 CtlxUp; + u32 Temp; +}GDMA_CH_LLI_ELE, *PGDMA_CH_LLI_ELE; +#if 1 +#if 0 +typedef struct _GDMA_CH_LLI_ { + PGDMA_CH_LLI_ELE pLliEle; + PGDMA_CH_LLI pNextLli; +}GDMA_CH_LLI, *PGDMA_CH_LLI; + +typedef struct _BLOCK_SIZE_LIST_ { + u32 BlockSize; + PBLOCK_SIZE_LIST pNextBlockSiz; +}BLOCK_SIZE_LIST, *PBLOCK_SIZE_LIST; +#else +struct GDMA_CH_LLI { + PGDMA_CH_LLI_ELE pLliEle; + struct GDMA_CH_LLI *pNextLli; +}; + +struct BLOCK_SIZE_LIST { + u32 BlockSize; + struct BLOCK_SIZE_LIST *pNextBlockSiz; +}; + +#endif + +#endif +typedef struct _HAL_GDMA_ADAPTER_ { + u32 ChSar; + u32 ChDar; + GDMA_CHANNEL_NUM ChEn; + GDMA_CTL_REG GdmaCtl; + GDMA_CFG_REG GdmaCfg; + u32 PacketLen; + u32 BlockLen; + u32 MuliBlockCunt; + u32 MaxMuliBlock; + struct GDMA_CH_LLI *pLlix; + struct BLOCK_SIZE_LIST *pBlockSizeList; + + PGDMA_CH_LLI_ELE pLli; + u32 NextPlli; + u8 TestItem; + u8 ChNum; + u8 GdmaIndex; + u8 IsrCtrl:1; + u8 GdmaOnOff:1; + u8 Llpctrl:1; + u8 Lli0:1; + u8 Rsvd4to7:4; + u8 GdmaIsrType; +}HAL_GDMA_ADAPTER, *PHAL_GDMA_ADAPTER; + + +typedef struct _HAL_GDMA_OP_ { + VOID (*HalGdmaOnOff)(VOID *Data); + BOOL (*HalGdamChInit)(VOID *Data); + BOOL (*HalGdmaChSeting)(VOID *Data); + BOOL (*HalGdmaChBlockSeting)(VOID *Data); + VOID (*HalGdmaChDis)(VOID *Data); + VOID (*HalGdmaChEn)(VOID *Data); + VOID (*HalGdmaChIsrEnAndDis) (VOID *Data); + u8 (*HalGdmaChIsrClean)(VOID *Data); + VOID (*HalGdmaChCleanAutoSrc)(VOID *Data); + VOID (*HalGdmaChCleanAutoDst)(VOID *Data); +}HAL_GDMA_OP, *PHAL_GDMA_OP; + + +VOID HalGdmaOpInit( + IN VOID *Data +); + +extern const HAL_GDMA_OP _HalGdmaOp; + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_gpio.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_gpio.h new file mode 100644 index 0000000..d69629f --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_gpio.h @@ -0,0 +1,277 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_GPIO_H_ +#define _HAL_GPIO_H_ + + +#define HAL_GPIO_PIN_INT_MODE 0x80 + +typedef enum { + _PORT_A = 0, + _PORT_B = 1, + _PORT_C = 2, + _PORT_D = 3, + _PORT_E = 4, + _PORT_F = 5, + _PORT_G = 6, + _PORT_H = 7, + _PORT_I = 8, + _PORT_J = 9, + _PORT_K = 10, + + _PORT_MAX +} HAL_GPIO_PORT_NAME; + +typedef enum { + _PA_0 = (_PORT_A<<4|0), + _PA_1 = (_PORT_A<<4|1), + _PA_2 = (_PORT_A<<4|2), + _PA_3 = (_PORT_A<<4|3), + _PA_4 = (_PORT_A<<4|4), + _PA_5 = (_PORT_A<<4|5), + _PA_6 = (_PORT_A<<4|6), + _PA_7 = (_PORT_A<<4|7), + + _PB_0 = (_PORT_B<<4|0), + _PB_1 = (_PORT_B<<4|1), + _PB_2 = (_PORT_B<<4|2), + _PB_3 = (_PORT_B<<4|3), + _PB_4 = (_PORT_B<<4|4), + _PB_5 = (_PORT_B<<4|5), + _PB_6 = (_PORT_B<<4|6), + _PB_7 = (_PORT_B<<4|7), + + _PC_0 = (_PORT_C<<4|0), + _PC_1 = (_PORT_C<<4|1), + _PC_2 = (_PORT_C<<4|2), + _PC_3 = (_PORT_C<<4|3), + _PC_4 = (_PORT_C<<4|4), + _PC_5 = (_PORT_C<<4|5), + _PC_6 = (_PORT_C<<4|6), + _PC_7 = (_PORT_C<<4|7), + _PC_8 = (_PORT_C<<4|8), + _PC_9 = (_PORT_C<<4|9), + + _PD_0 = (_PORT_D<<4|0), + _PD_1 = (_PORT_D<<4|1), + _PD_2 = (_PORT_D<<4|2), + _PD_3 = (_PORT_D<<4|3), + _PD_4 = (_PORT_D<<4|4), + _PD_5 = (_PORT_D<<4|5), + _PD_6 = (_PORT_D<<4|6), + _PD_7 = (_PORT_D<<4|7), + _PD_8 = (_PORT_D<<4|8), + _PD_9 = (_PORT_D<<4|9), + + _PE_0 = (_PORT_E<<4|0), + _PE_1 = (_PORT_E<<4|1), + _PE_2 = (_PORT_E<<4|2), + _PE_3 = (_PORT_E<<4|3), + _PE_4 = (_PORT_E<<4|4), + _PE_5 = (_PORT_E<<4|5), + _PE_6 = (_PORT_E<<4|6), + _PE_7 = (_PORT_E<<4|7), + _PE_8 = (_PORT_E<<4|8), + _PE_9 = (_PORT_E<<4|9), + _PE_A = (_PORT_E<<4|10), + + _PF_0 = (_PORT_F<<4|0), + _PF_1 = (_PORT_F<<4|1), + _PF_2 = (_PORT_F<<4|2), + _PF_3 = (_PORT_F<<4|3), + _PF_4 = (_PORT_F<<4|4), + _PF_5 = (_PORT_F<<4|5), +// _PF_6 = (_PORT_F<<4|6), +// _PF_7 = (_PORT_F<<4|7), + + _PG_0 = (_PORT_G<<4|0), + _PG_1 = (_PORT_G<<4|1), + _PG_2 = (_PORT_G<<4|2), + _PG_3 = (_PORT_G<<4|3), + _PG_4 = (_PORT_G<<4|4), + _PG_5 = (_PORT_G<<4|5), + _PG_6 = (_PORT_G<<4|6), + _PG_7 = (_PORT_G<<4|7), + + _PH_0 = (_PORT_H<<4|0), + _PH_1 = (_PORT_H<<4|1), + _PH_2 = (_PORT_H<<4|2), + _PH_3 = (_PORT_H<<4|3), + _PH_4 = (_PORT_H<<4|4), + _PH_5 = (_PORT_H<<4|5), + _PH_6 = (_PORT_H<<4|6), + _PH_7 = (_PORT_H<<4|7), + + _PI_0 = (_PORT_I<<4|0), + _PI_1 = (_PORT_I<<4|1), + _PI_2 = (_PORT_I<<4|2), + _PI_3 = (_PORT_I<<4|3), + _PI_4 = (_PORT_I<<4|4), + _PI_5 = (_PORT_I<<4|5), + _PI_6 = (_PORT_I<<4|6), + _PI_7 = (_PORT_I<<4|7), + + _PJ_0 = (_PORT_J<<4|0), + _PJ_1 = (_PORT_J<<4|1), + _PJ_2 = (_PORT_J<<4|2), + _PJ_3 = (_PORT_J<<4|3), + _PJ_4 = (_PORT_J<<4|4), + _PJ_5 = (_PORT_J<<4|5), + _PJ_6 = (_PORT_J<<4|6), +// _PJ_7 = (_PORT_J<<4|7), + + _PK_0 = (_PORT_K<<4|0), + _PK_1 = (_PORT_K<<4|1), + _PK_2 = (_PORT_K<<4|2), + _PK_3 = (_PORT_K<<4|3), + _PK_4 = (_PORT_K<<4|4), + _PK_5 = (_PORT_K<<4|5), + _PK_6 = (_PORT_K<<4|6), +// _PK_7 = (_PORT_K<<4|7), + + // Not connected + _PIN_NC = (int)0xFFFFFFFF +} HAL_PIN_NAME; + +typedef enum +{ + GPIO_PIN_LOW = 0, + GPIO_PIN_HIGH = 1, + GPIO_PIN_ERR = 2 // read Pin error +} HAL_GPIO_PIN_STATE; + +typedef enum { + DIN_PULL_NONE = 0, //floating or high impedance ? + DIN_PULL_LOW = 1, + DIN_PULL_HIGH = 2, + + DOUT_PUSH_PULL = 3, + DOUT_OPEN_DRAIN = 4, + + INT_LOW = (5|HAL_GPIO_PIN_INT_MODE), // Interrupt Low level trigger + INT_HIGH = (6|HAL_GPIO_PIN_INT_MODE), // Interrupt High level trigger + INT_FALLING = (7|HAL_GPIO_PIN_INT_MODE), // Interrupt Falling edge trigger + INT_RISING = (8|HAL_GPIO_PIN_INT_MODE) // Interrupt Rising edge trigger +} HAL_GPIO_PIN_MODE; + +enum { + GPIO_PORT_A = 0, + GPIO_PORT_B = 1, + GPIO_PORT_C = 2, + GPIO_PORT_D = 3 +}; + +typedef enum { + hal_PullNone = 0, + hal_PullUp = 1, + hal_PullDown = 2, + hal_OpenDrain = 3, + hal_PullDefault = hal_PullNone +} HAL_PinMode; + +typedef struct _HAL_GPIO_PORT_ { + u32 out_data; // to write the GPIO port + u32 in_data; // to read the GPIO port + u32 dir; // config each pin direction +}HAL_GPIO_PORT, *PHAL_GPIO_PORT; + +#define HAL_GPIO_PIN_NAME(port,pin) (((port)<<5)|(pin)) +#define HAL_GPIO_GET_PORT_BY_NAME(x) ((x>>5) & 0x03) +#define HAL_GPIO_GET_PIN_BY_NAME(x) (x & 0x1f) + +typedef struct _HAL_GPIO_PIN_ { + HAL_GPIO_PIN_MODE pin_mode; + u32 pin_name; // Pin: [7:5]: port number, [4:0]: pin number +}HAL_GPIO_PIN, *PHAL_GPIO_PIN; + + +typedef void (*GPIO_IRQ_FUN)(VOID *Data, u32 Id); +typedef void (*GPIO_USER_IRQ_FUN)(u32 Id); + +typedef struct _HAL_GPIO_ADAPTER_ { + IRQ_HANDLE IrqHandle; // GPIO HAL IRQ Handle + GPIO_USER_IRQ_FUN UserIrqHandler; // GPIO IRQ Handler + GPIO_IRQ_FUN PortA_IrqHandler[32]; // The interrupt handler triggered by Port A[x] + VOID *PortA_IrqData[32]; + VOID (*EnterCritical)(void); + VOID (*ExitCritical)(void); + u32 Local_Gpio_Dir[3]; // to record direction setting: 0- IN, 1- Out + u8 Gpio_Func_En; // Is GPIO HW function enabled ? + u8 Locked; +}HAL_GPIO_ADAPTER, *PHAL_GPIO_ADAPTER; + + +u32 +HAL_GPIO_GetPinName( + u32 chip_pin +); + +VOID +HAL_GPIO_PullCtrl( + u32 pin, + u32 mode +); + +VOID +HAL_GPIO_Init( + HAL_GPIO_PIN *GPIO_Pin +); + +VOID +HAL_GPIO_Irq_Init( + HAL_GPIO_PIN *GPIO_Pin +); + +VOID +HAL_GPIO_DeInit( + HAL_GPIO_PIN *GPIO_Pin +); + +s32 +HAL_GPIO_ReadPin( + HAL_GPIO_PIN *GPIO_Pin +); + +VOID +HAL_GPIO_WritePin( + HAL_GPIO_PIN *GPIO_Pin, + u32 Value +); + +VOID +HAL_GPIO_UserRegIrq( + HAL_GPIO_PIN *GPIO_Pin, + VOID *IrqHandler, + VOID *IrqData +); + +VOID +HAL_GPIO_UserUnRegIrq( + HAL_GPIO_PIN *GPIO_Pin +); + +VOID +HAL_GPIO_IntCtrl( + HAL_GPIO_PIN *GPIO_Pin, + u32 En +); + +VOID +HAL_GPIO_MaskIrq( + HAL_GPIO_PIN *GPIO_Pin +); + +VOID +HAL_GPIO_UnMaskIrq( + HAL_GPIO_PIN *GPIO_Pin +); + +#endif // end of "#define _HAL_GPIO_H_" + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_i2c.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_i2c.h new file mode 100644 index 0000000..9372d4e --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_i2c.h @@ -0,0 +1,555 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_I2C_H_ //#ifndef _HAL_I2C_H_ +#define _HAL_I2C_H_ + +#include "rtl8195a_i2c.h" +#include "hal_gdma.h" + +//================= I2C CONFIGURATION START ================== +// I2C SAL User Configuration Flags + +// I2C SAL operation types +#define I2C_POLL_OP_TYPE 0 +#define I2C_INTR_OP_TYPE 1 +#define I2C_DMA_OP_TYPE 0 + +// I2C supports user register address +#define I2C_USER_REG_ADDR 1 //I2C User specific register address by using + //the first I2C data as the register + //address + +// I2C SAL used module. Please set the I2C module flag to 1 to enable the related +// I2C module functions. +#define I2C0_USED 1 +#define I2C1_USED 0 +#define I2C2_USED 0 +#define I2C3_USED 0 +//================= I2C CONFIGURATION END =================== + + +//================= I2C HAL START ========================== +// I2C debug output +#define I2C_PREFIX "RTL8195A[i2c]: " +#define I2C_PREFIX_LVL " [i2c_DBG]: " + +typedef enum _I2C_DBG_LVL_ { + HAL_I2C_LVL = 0x01, + SAL_I2C_LVL = 0x02, + VERI_I2C_LVL = 0x03, +}I2C_DBG_LVL,*PI2C_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_I2C_HAL +#define DBG_I2C_LOG_PERD 100 + + #define I2CDBGLVL 0xFF + #define DBG_8195A_I2C(...) do{ \ + _DbgDump("\r"I2C_PREFIX __VA_ARGS__);\ + }while(0) + + #define DBG_8195A_I2C_LVL(LVL,...) do{\ + if (LVL&I2CDBGLVL){\ + _DbgDump("\r"I2C_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_I2C_LOG_PERD 100 + #define DBG_8195A_I2C(...) + #define DBG_8195A_I2C_LVL(...) +#endif +#else + #define DBG_I2C_LOG_PERD 100 + #define DBG_8195A_I2C(...) + #define DBG_8195A_I2C_LVL(...) +#endif + +//====================================================== +// I2C HAL related enumeration +// I2C Module Selection +typedef enum _I2C_MODULE_SEL_ { + I2C0_SEL = 0x0, + I2C1_SEL = 0x1, + I2C2_SEL = 0x2, + I2C3_SEL = 0x3, +}I2C_MODULE_SEL,*PI2C_MODULE_SEL; + +// I2C HAL initial data structure +typedef struct _HAL_I2C_INIT_DAT_ { + u8 I2CIdx; //I2C index used + u8 I2CEn; //I2C module enable + u8 I2CMaster; //Master or Slave mode + u8 I2CAddrMod; //I2C addressing mode(7-bit, 10-bit) + + u8 I2CSpdMod; //I2C speed mode(Standard, Fast, High) + u8 I2CSetup; //I2C SDA setup time + u8 I2CRXTL; //I2C RX FIFO Threshold + u8 I2CTXTL; //I2C TX FIFO Threshold + + u8 I2CBusLd; //I2C bus load (pf) for high speed mode + u8 I2CReSTR; //I2C restart support + u8 I2CGC; //I2C general support + u8 I2CStartB; //I2C start byte support + + u8 I2CSlvNoAck; //I2C slave no ack support + u8 I2CDMACtrl; //I2C DMA feature support + u8 I2CCmd; //I2C Command + u8 I2CDataLen; //I2C Data Length + + u8 I2CSlvAckGC; //I2C slave acks to General Call + u8 I2CStop; //I2C issues STOP bit or not + u16 RSVD0; + + u8 *I2CRWData; //I2C Read/Write data pointer + + u16 I2CIntrMSK; //I2C Interrupt Mask + u16 I2CIntrClr; //I2C Interrupt register to clear + + u16 I2CAckAddr; //I2C target address in I2C Master mode, + //ack address in I2C Slave mode + u16 I2CSdaHd; //I2C SDA hold time + + u32 I2CClk; //I2C bus clock (in kHz) + + u8 I2CTxDMARqLv; //I2C TX DMA Empty Level + u8 I2CRxDMARqLv; //I2C RX DMA Full Level + u16 RSVD1; //Reserved +}HAL_I2C_INIT_DAT,*PHAL_I2C_INIT_DAT; + +// I2C HAL Operations +typedef struct _HAL_I2C_OP_ { + HAL_Status (*HalI2CInit) (VOID *Data); //HAL I2C initialization + HAL_Status (*HalI2CDeInit) (VOID *Data); //HAL I2C de-initialization + HAL_Status (*HalI2CSend) (VOID *Data); //HAL I2C send + u8 (*HalI2CReceive) (VOID *Data); //HAL I2C receive + HAL_Status (*HalI2CEnable) (VOID *Data); //HAL I2C enable module + HAL_Status (*HalI2CIntrCtrl) (VOID *Data); //HAL I2C interrupt control + u32 (*HalI2CReadReg) (VOID *Data, u8 I2CReg);//HAL I2C read register + HAL_Status (*HalI2CWriteReg) (VOID *Data, u8 I2CReg, u32 RegVal);//HAL I2C write register + HAL_Status (*HalI2CSetCLK) (VOID *Data); //HAL I2C set bus clock + HAL_Status (*HalI2CMassSend) (VOID *Data); //HAL I2C mass send + HAL_Status (*HalI2CClrIntr) (VOID *Data); //HAL I2C clear interrupts + HAL_Status (*HalI2CClrAllIntr) (VOID *Data); //HAL I2C clear all interrupts + HAL_Status (*HalI2CDMACtrl) (VOID *Data); //HAL I2C DMA control +}HAL_I2C_OP, *PHAL_I2C_OP; +//================= I2C HAL END =========================== + + +//================= I2C SAL START ========================== +//I2C SAL Macros + +//====================================================== +// I2C SAL related enumerations +// I2C Extend Features +typedef enum _I2C_EXD_SUPPORT_{ + I2C_EXD_RESTART = 0x1, //BIT_0, RESTART bit + I2C_EXD_GENCALL = 0x2, //BIT_1, Master generates General Call. All "send" operations generate General Call addresss + I2C_EXD_STARTB = 0x4, //BIT_2, Using START BYTE, instead of START Bit + I2C_EXD_SLVNOACK = 0x8, //BIT_3, Slave no ack to master + I2C_EXD_BUS400PF = 0x10, //BIT_4, I2C bus loading is 400pf + I2C_EXD_SLVACKGC = 0x20, //BIT_5, Slave acks to a General Call + I2C_EXD_USER_REG = 0x40, //BIT_6, Using User Register Address + I2C_EXD_USER_TWOB = 0x80, //BIT_7, User Register Address is 2-byte + I2C_EXD_MTR_ADDR_RTY= 0x100, //BIT_8, Master retries to send start condition and Slave address when the slave doesn't ack + // the address. + I2C_EXD_MTR_ADDR_UPD= 0x200, //BIT_9, Master dynamically updates slave address + I2C_EXD_MTR_HOLD_BUS= 0x400, //BIT_10, Master doesn't generate STOP when the FIFO is empty. This would make Master hold + // the bus. +}I2C_EXD_SUPPORT,*PI2C_EXD_SUPPORT; + +// I2C operation type +typedef enum _I2C_OP_TYPE_ { + I2C_POLL_TYPE = 0x0, + I2C_DMA_TYPE = 0x1, + I2C_INTR_TYPE = 0x2, +}I2C_OP_TYPE, *PI2C_OP_TYPE; + +// I2C pinmux selection +typedef enum _I2C_PINMUX_ { + I2C_PIN_S0 = 0x0, + I2C_PIN_S1 = 0x1, + I2C_PIN_S2 = 0x2, + I2C_PIN_S3 = 0x3, //Only valid for I2C0 and I2C3 +}I2C_PINMUX, *PI2C_PINMUX; + +// I2C module status +typedef enum _I2C_MODULE_STATUS_ { + I2C_DISABLE = 0x0, + I2C_ENABLE = 0x1, +}I2C_MODULE_STATUS, *PI2C_MODULE_STATUS; + +// I2C device status +typedef enum _I2C_Device_STATUS_ { + I2C_STS_UNINITIAL = 0x00, + I2C_STS_INITIALIZED = 0x01, + I2C_STS_IDLE = 0x02, + + I2C_STS_TX_READY = 0x03, + I2C_STS_TX_ING = 0x04, + + I2C_STS_RX_READY = 0x05, + I2C_STS_RX_ING = 0x06, + + I2C_STS_ERROR = 0x10, + I2C_STS_TIMEOUT = 0x11, +}I2C_Device_STATUS, *PI2C_Device_STATUS; + +// I2C feature status +typedef enum _I2C_FEATURE_STATUS_{ + I2C_FEATURE_DISABLED = 0, + I2C_FEATURE_ENABLED = 1, +}I2C_FEATURE_STATUS,*PI2C_FEATURE_STATUS; + +// I2C device mode +typedef enum _I2C_DEV_MODE_ { + I2C_SLAVE_MODE = 0x0, + I2C_MASTER_MODE = 0x1, +}I2C_DEV_MODE, *PI2C_DEV_MODE; + +// I2C Bus Transmit/Receive +typedef enum _I2C_DIRECTION_ { + I2C_ONLY_TX = 0x1, + I2C_ONLY_RX = 0x2, + I2C_TXRX = 0x3, +}I2C_DIRECTION, *PI2C_DIRECTION; + +//I2C DMA module number +typedef enum _I2C_DMA_MODULE_SEL_ { + I2C_DMA_MODULE_0 = 0x0, + I2C_DMA_MODULE_1 = 0x1 +}I2C_DMA_MODULE_SEL, *PI2C_DMA_MODULE_SEL; + +// I2C0 DMA peripheral number +typedef enum _I2C0_DMA_PERI_NUM_ { + I2C0_DMA_TX_NUM = 0x8, + I2C0_DMA_RX_NUM = 0x9, +}I2C0_DMA_PERI_NUM,*PI2C0_DMA_PERI_NUM; + +// I2C1 DMA peripheral number +typedef enum _I2C1_DMA_PERI_NUM_ { + I2C1_DMA_TX_NUM = 0xA, + I2C1_DMA_RX_NUM = 0xB, +}I2C1_DMA_PERI_NUM,*PI2C1_DMA_PERI_NUM; + +// I2C0 DMA module used +typedef enum _I2C0_DMA_MODULE_ { + I2C0_DMA0 = 0x0, + I2C0_DMA1 = 0x1, +}I2C0_DMA_MODULE,*PI2C0_DMA_MODULE; + +// I2C0 DMA module used +typedef enum _I2C1_DMA_MODULE_ { + I2C1_DMA0 = 0x0, + I2C1_DMA1 = 0x1, +}I2C1_DMA_MODULE,*PI2C1_DMA_MODULE; + +// I2C command type +typedef enum _I2C_COMMAND_TYPE_ { + I2C_WRITE_CMD = 0x0, + I2C_READ_CMD = 0x1, +}I2C_COMMAND_TYPE,*PI2C_COMMAND_TYPE; + +// I2C STOP BIT +typedef enum _I2C_STOP_TYPE_ { + I2C_STOP_DIS = 0x0, + I2C_STOP_EN = 0x1, +}I2C_STOP_TYPE, *PI2C_STOP_TYPE; + +// I2C error type +typedef enum _I2C_ERR_TYPE_ { + I2C_ERR_RX_UNDER = 0x01, //I2C RX FIFO Underflow + I2C_ERR_RX_OVER = 0x02, //I2C RX FIFO Overflow + I2C_ERR_TX_OVER = 0x04, //I2C TX FIFO Overflow + I2C_ERR_TX_ABRT = 0x08, //I2C TX terminated + I2C_ERR_SLV_TX_NACK = 0x10, //I2C slave transmission terminated by master NACK, + //but there are data in slave TX FIFO + I2C_ERR_USER_REG_TO = 0x20, + + I2C_ERR_RX_CMD_TO = 0x21, + I2C_ERR_RX_FF_TO = 0x22, + I2C_ERR_TX_CMD_TO = 0x23, + I2C_ERR_TX_FF_TO = 0x24, + + I2C_ERR_TX_ADD_TO = 0x25, + I2C_ERR_RX_ADD_TO = 0x26, +}I2C_ERR_TYPE, *PI2C_ERR_TYPE; + +// I2C Time Out type +typedef enum _I2C_TIMEOUT_TYPE_ { + I2C_TIMEOOUT_DISABLE = 0x00, + I2C_TIMEOOUT_ENDLESS = 0xFFFFFFFF, +}I2C_TIMEOUT_TYPE, *PI2C_TIMEOUT_TYPE; + +//====================================================== +// SAL I2C related data structures +// I2C user callback adapter +typedef struct _SAL_I2C_USERCB_ADPT_ { + VOID (*USERCB) (VOID *Data); + u32 USERData; +}SAL_I2C_USERCB_ADPT, *PSAL_I2C_USERCB_ADPT; + +// I2C user callback structure +typedef struct _SAL_I2C_USER_CB_ { + PSAL_I2C_USERCB_ADPT pTXCB; //I2C Transmit Callback + PSAL_I2C_USERCB_ADPT pTXCCB; //I2C Transmit Complete Callback + PSAL_I2C_USERCB_ADPT pRXCB; //I2C Receive Callback + PSAL_I2C_USERCB_ADPT pRXCCB; //I2C Receive Complete Callback + PSAL_I2C_USERCB_ADPT pRDREQCB; //I2C Read Request Callback + PSAL_I2C_USERCB_ADPT pERRCB; //I2C Error Callback + PSAL_I2C_USERCB_ADPT pDMATXCB; //I2C DMA Transmit Callback + PSAL_I2C_USERCB_ADPT pDMATXCCB; //I2C DMA Transmit Complete Callback + PSAL_I2C_USERCB_ADPT pDMARXCB; //I2C DMA Receive Callback + PSAL_I2C_USERCB_ADPT pDMARXCCB; //I2C DMA Receive Complete Callback + PSAL_I2C_USERCB_ADPT pGENCALLCB; //I2C General Call Callback +}SAL_I2C_USER_CB, *PSAL_I2C_USER_CB; + +// I2C Transmit Buffer +typedef struct _SAL_I2C_TRANSFER_BUF_ { + u16 DataLen; //I2C Transmfer Length + u16 TargetAddr; //I2C Target Address. It's only valid in Master Mode. + u32 RegAddr; //I2C Register Address. It's only valid in Master Mode. + u32 RSVD; // + u8 *pDataBuf; //I2C Transfer Buffer Pointer +}SAL_I2C_TRANSFER_BUF,*PSAL_I2C_TRANSFER_BUF; + +typedef struct _SAL_I2C_DMA_USER_DEF_ { + u8 TxDatSrcWdth; + u8 TxDatDstWdth; + u8 TxDatSrcBstSz; + u8 TxDatDstBstSz; + u8 TxChNo; + u8 RSVD0; + u16 RSVD1; + u8 RxDatSrcWdth; + u8 RxDatDstWdth; + u8 RxDatSrcBstSz; + u8 RxDatDstBstSz; + u8 RxChNo; + u8 RSVD2; + u16 RSVD3; +}SAL_I2C_DMA_USER_DEF, *PSAL_I2C_DMA_USER_DEF; + +// RTK I2C OP +typedef struct _RTK_I2C_OP_ { + HAL_Status (*Init) (VOID *Data); + HAL_Status (*DeInit) (VOID *Data); + HAL_Status (*Send) (VOID *Data); + HAL_Status (*Receive) (VOID *Data); + HAL_Status (*IoCtrl) (VOID *Data); + HAL_Status (*PowerCtrl) (VOID *Data); +}RTK_I2C_OP, *PRTK_I2C_OP; + +// Software API Level I2C Handler +typedef struct _SAL_I2C_HND_ { + u8 DevNum; //I2C device number + u8 PinMux; //I2C pin mux seletion + u8 OpType; //I2C operation type selection + volatile u8 DevSts; //I2C device status + + u8 I2CMaster; //I2C Master or Slave mode + u8 I2CAddrMod; //I2C 7-bit or 10-bit mode + u8 I2CSpdMod; //I2C SS/ FS/ HS speed mode + u8 I2CAckAddr; //I2C target address in Master + //mode or ack address in Slave + //mode + + u16 I2CClk; //I2C bus clock + u8 MasterRead; //I2C Master Read Supported, + //An Address will be sent before + //read data back. + + u8 I2CDmaSel; //I2C DMA module select + // 0 for DMA0, + // 1 for DMA1 + u8 I2CTxDMARqLv; //I2C TX DMA Empty Level + u8 I2CRxDMARqLv; //I2C RX DMA Full Level + u16 RSVD0; //Reserved + + u32 RSVD1; //Reserved + + u32 I2CExd; //I2C extended options: + //bit 0: I2C RESTART supported, + // 0 for NOT supported, + // 1 for supported + //bit 1: I2C General Call supported + // 0 for NOT supported, + // 1 for supported + //bit 2: I2C START Byte supported + // 0 for NOT supported, + // 1 for supported + //bit 3: I2C Slave-No-Ack + // supported + // 0 for NOT supported, + // 1 for supported + //bit 4: I2C bus loading, + // 0 for 100pf, + // 1 for 400pf + //bit 5: I2C slave ack to General + // Call + //bit 6: I2C User register address + //bit 7: I2C 2-Byte User register + // address + //bit 8: I2C slave address no ack retry, + // It's only for Master mode, + // when slave doesn't ack the + // address + //bit 31~bit 8: Reserved + u32 ErrType; // + u32 TimeOut; //I2C IO Timeout count, in ms + + PHAL_I2C_INIT_DAT pInitDat; //Pointer to I2C initial data struct + PSAL_I2C_TRANSFER_BUF pTXBuf; //Pointer to I2C TX buffer + PSAL_I2C_TRANSFER_BUF pRXBuf; //Pointer to I2C RX buffer + PSAL_I2C_USER_CB pUserCB; //Pointer to I2C User Callback + PSAL_I2C_DMA_USER_DEF pDMAConf; //Pointer to I2C User Define DMA config +}SAL_I2C_HND, *PSAL_I2C_HND; + + + +//====================================================== +// I2C SAL Function Prototypes + +// For checking I2C input index valid or not +static inline HAL_Status +RtkI2CIdxChk( + IN u8 I2CIdx +) +{ + if (I2CIdx > I2C3_SEL) + return HAL_ERR_UNKNOWN; + + return HAL_OK; +} +#if 0 +//For checking I2C operation type valid or not +static inline HAL_Status +RtkI2COpTypeChk( + IN VOID *Data +) +{ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + + if (pSalI2CHND->OpType == I2C_POLL_TYPE) + return HAL_ERR_UNKNOWN; + + if (pSalI2CHND->OpType == I2C_DMA_TYPE) + return HAL_ERR_UNKNOWN; + + if (pSalI2CHND->OpType == I2C_INTR_TYPE) + return HAL_ERR_UNKNOWN; + + pSalI2CHND = pSalI2CHND; + + return HAL_OK; +} +#endif +//For checking I2C DMA available or not +static inline HAL_Status +RtkI2CDMAChk( + IN VOID *Data +) +{ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + + if (pSalI2CHND->OpType == I2C_DMA_TYPE) { + if (pSalI2CHND->DevNum >= I2C2_SEL) + return HAL_ERR_UNKNOWN; + } + else { + return HAL_ERR_UNKNOWN; + } + + return HAL_OK; +} + +//For checking I2C DMA available or not +static inline HAL_Status +RtkI2CDMAInitChk( + IN VOID *Data +) +{ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + + if (pSalI2CHND->OpType != I2C_DMA_TYPE) { + return HAL_ERR_UNKNOWN; + } + else { + return HAL_OK; + } + +} + +//====================================================== +//SAL I2C management function prototype +_LONG_CALL_ HAL_Status RtkI2CLoadDefault(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CInit(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CDeInit(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CSend(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CReceive(IN VOID *Data); +_LONG_CALL_ VOID RtkSalI2COpInit(IN VOID *Data); +//================= I2C SAL END =========================== + + +//================= I2C SAL MANAGEMENT START ================= +// I2C SAL management macros +#define SAL_USER_CB_NUM (sizeof(SAL_I2C_USER_CB) / sizeof(PSAL_I2C_USERCB_ADPT)) + +//====================================================== +// I2C SAL management data structures +// I2C SAL handle private +typedef struct _SAL_I2C_HND_PRIV_ { + VOID **ppSalI2CHnd; //Pointer to SAL_I2C_HND pointer + SAL_I2C_HND SalI2CHndPriv; //Private SAL_I2C_HND +}SAL_I2C_HND_PRIV, *PSAL_I2C_HND_PRIV; + +//I2C SAL management adapter +typedef struct _SAL_I2C_MNGT_ADPT_ { + PSAL_I2C_HND_PRIV pSalHndPriv; //Pointer to SAL_I2C_HND + PHAL_I2C_INIT_DAT pHalInitDat; //Pointer to HAL I2C initial data( HAL_I2C_INIT_DAT ) + PHAL_I2C_OP pHalOp; //Pointer to HAL I2C operation( HAL_I2C_OP ) + VOID (*pHalOpInit)(VOID*); //Pointer to HAL I2C initialize function + PIRQ_HANDLE pIrqHnd; //Pointer to IRQ handler in SAL layer( IRQ_HANDLE ) + PSAL_I2C_USER_CB pUserCB; //Pointer to SAL user callbacks (SAL_I2C_USER_CB ) + volatile u32 MstRDCmdCnt; //Used for Master Read command count + volatile u32 InnerTimeOut; //Used for SAL internal timeout count + VOID (*pSalIrqFunc)(VOID*); //Used for SAL I2C interrupt function + + PSAL_I2C_DMA_USER_DEF pDMAConf; //Pointer to I2C User Define DMA config + PHAL_GDMA_ADAPTER pHalTxGdmaAdp; //Pointer to HAL_GDMA_ADAPTER + PHAL_GDMA_ADAPTER pHalRxGdmaAdp; //Pointer to HAL_GDMA_ADAPTER + PHAL_GDMA_OP pHalGdmaOp; //Pointer to HAL_GDMA_OP + VOID (*pHalGdmaOpInit)(VOID*); //Pointer to HAL I2C initialize function + PIRQ_HANDLE pIrqTxGdmaHnd; //Pointer to IRQ handler for Tx GDMA + PIRQ_HANDLE pIrqRxGdmaHnd; //Pointer to IRQ handler for Rx GDMA + VOID (*pSalDMATxIrqFunc)(VOID*); //Used for SAL I2C interrupt function + VOID (*pSalDMARxIrqFunc)(VOID*); //Used for SAL I2C interrupt function + u32 RSVD; //Reserved +}SAL_I2C_MNGT_ADPT, *PSAL_I2C_MNGT_ADPT; + +//====================================================== +//SAL I2C management function prototype +PSAL_I2C_MNGT_ADPT RtkI2CGetMngtAdpt(IN u8 I2CIdx); +HAL_Status RtkI2CFreeMngtAdpt(IN PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt); +PSAL_I2C_HND RtkI2CGetSalHnd(IN u8 I2CIdx); +HAL_Status RtkI2CFreeSalHnd(IN PSAL_I2C_HND pSalI2CHND); +u32 RtkSalI2CSts(IN VOID *Data); + +extern _LONG_CALL_ VOID I2CISRHandle(IN VOID *Data); +extern _LONG_CALL_ VOID I2CTXGDMAISRHandle(IN VOID *Data); +extern _LONG_CALL_ VOID I2CRXGDMAISRHandle(IN VOID *Data); +extern HAL_Status I2CIsTimeout (IN u32 StartCount, IN u32 TimeoutCnt); +extern HAL_TIMER_OP HalTimerOp; +//====================================================== +// Function Prototypes +_LONG_CALL_ VOID HalI2COpInit(IN VOID *Data); +//================= I2C SAL MANAGEMENT END ================== + + +#endif //#ifndef _HAL_I2C_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_i2s.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_i2s.h new file mode 100644 index 0000000..e1302e9 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_i2s.h @@ -0,0 +1,392 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_I2S_H_ +#define _HAL_I2S_H_ + +#include "rtl8195a_i2s.h" + +/* User Define Flags */ + +#define I2S0_USED 1 +#define I2S1_USED 1 + +/* +typedef struct _GDMA_CH_LLI_ELE_ { + u32 Sarx; + u32 Darx; + u32 Llpx; + u32 CtlxLow; + u32 CtlxUp; + u32 Temp; +}GDMA_CH_LLI_ELE, *PGDMA_CH_LLI_ELE; +#if 1 +#if 0 +typedef struct _GDMA_CH_LLI_ { + PGDMA_CH_LLI_ELE pLliEle; + PGDMA_CH_LLI pNextLli; +}GDMA_CH_LLI, *PGDMA_CH_LLI; + +typedef struct _BLOCK_SIZE_LIST_ { + u32 BlockSize; + PBLOCK_SIZE_LIST pNextBlockSiz; +}BLOCK_SIZE_LIST, *PBLOCK_SIZE_LIST; +#else +struct GDMA_CH_LLI { + PGDMA_CH_LLI_ELE pLliEle; + struct GDMA_CH_LLI *pNextLli; +}; + +struct BLOCK_SIZE_LIST { + u32 BlockSize; + struct BLOCK_SIZE_LIST *pNextBlockSiz; +}; + +#endif + +#endif +typedef struct _HAL_I2S_ADAPTER_ { + u32 ChSar; + u32 ChDar; + GDMA_CHANNEL_NUM ChEn; + GDMA_CTL_REG GdmaCtl; + GDMA_CFG_REG GdmaCfg; + u32 PacketLen; + u32 BlockLen; + u32 MuliBlockCunt; + u32 MaxMuliBlock; + struct GDMA_CH_LLI *pLlix; + struct BLOCK_SIZE_LIST *pBlockSizeList; + + PGDMA_CH_LLI_ELE pLli; + u32 NextPlli; + u8 TestItem; + u8 ChNum; + u8 GdmaIndex; + u8 IsrCtrl:1; + u8 GdmaOnOff:1; + u8 Llpctrl:1; + u8 Lli0:1; + u8 Rsvd4to7:4; + u8 GdmaIsrType; +}HAL_I2S_ADAPTER, *PHAL_I2S_ADAPTER; + +*/ + +/**********************************************************************/ +/* I2S HAL initial data structure */ +typedef struct _HAL_I2S_INIT_DAT_ { + u8 I2SIdx; /*I2S index used*/ + u8 I2SEn; /*I2S module enable tx/rx/tx+rx*/ + u8 I2SMaster; /*I2S Master or Slave mode*/ + u8 I2SWordLen; /*I2S Word length 16 or 24bits*/ + + u8 I2SChNum; /*I2S Channel number mono or stereo*/ + u8 I2SPageNum; /*I2S Page Number 2~4*/ + u16 I2SPageSize; /*I2S page Size 1~4096 word*/ + + u8 *I2STxData; /*I2S Tx data pointer*/ + + u8 *I2SRxData; /*I2S Rx data pointer*/ + + u32 I2STxIntrMSK; /*I2S Tx Interrupt Mask*/ + u32 I2STxIntrClr; /*I2S Tx Interrupt register to clear */ + + u32 I2SRxIntrMSK; /*I2S Rx Interrupt Mask*/ + u32 I2SRxIntrClr; /*I2S Rx Interrupt register to clear*/ + + u16 I2STxIdx; /*I2S TX page index */ + u16 I2SRxIdx; /*I2S RX page index */ + + u16 I2SHWTxIdx; /*I2S HW TX page index */ + u16 I2SHWRxIdx; /*I2S HW RX page index */ + + + u16 I2SRate; /*I2S sample rate*/ + u8 I2STRxAct; /*I2S tx rx act*/ +}HAL_I2S_INIT_DAT, *PHAL_I2S_INIT_DAT; + +/**********************************************************************/ +/* I2S Data Structures */ +/* I2S Module Selection */ +typedef enum _I2S_MODULE_SEL_ { + I2S0_SEL = 0x0, + I2S1_SEL = 0x1, +}I2S_MODULE_SEL,*PI2S_MODULE_SEL; +/* +typedef struct _HAL_I2S_ADAPTER_ { + u32 Enable:1; + I2S_CTL_REG I2sCtl; + I2S_SETTING_REG I2sSetting; + u32 abc; + u8 I2sIndex; +}HAL_I2S_ADAPTER, *PHAL_I2S_ADAPTER; +*/ +/* I2S HAL Operations */ +typedef struct _HAL_I2S_OP_ { + RTK_STATUS (*HalI2SInit) (VOID *Data); + RTK_STATUS (*HalI2SDeInit) (VOID *Data); + RTK_STATUS (*HalI2STx) (VOID *Data, u8 *pBuff); + RTK_STATUS (*HalI2SRx) (VOID *Data, u8 *pBuff); + RTK_STATUS (*HalI2SEnable) (VOID *Data); + RTK_STATUS (*HalI2SIntrCtrl) (VOID *Data); + u32 (*HalI2SReadReg) (VOID *Data, u8 I2SReg); + RTK_STATUS (*HalI2SSetRate) (VOID *Data); + RTK_STATUS (*HalI2SSetWordLen) (VOID *Data); + RTK_STATUS (*HalI2SSetChNum) (VOID *Data); + RTK_STATUS (*HalI2SSetPageNum) (VOID *Data); + RTK_STATUS (*HalI2SSetPageSize) (VOID *Data); + + RTK_STATUS (*HalI2SClrIntr) (VOID *Data); + RTK_STATUS (*HalI2SClrAllIntr) (VOID *Data); + RTK_STATUS (*HalI2SDMACtrl) (VOID *Data); +/* + VOID (*HalI2sOnOff)(VOID *Data); + BOOL (*HalI2sInit)(VOID *Data); + BOOL (*HalI2sSetting)(VOID *Data); + BOOL (*HalI2sEn)(VOID *Data); + BOOL (*HalI2sIsrEnAndDis) (VOID *Data); + BOOL (*HalI2sDumpReg)(VOID *Data); + BOOL (*HalI2s)(VOID *Data); +*/ +}HAL_I2S_OP, *PHAL_I2S_OP; + + +/**********************************************************************/ + +/* I2S Pinmux Selection */ +typedef enum _I2S0_PINMUX_ { + I2S0_TO_S0 = 0x0, + I2S0_TO_S1 = 0x1, + I2S0_TO_S2 = 0x2, +}I2S0_PINMUX, *PI2S0_PINMUX; + +typedef enum _I2S1_PINMUX_ { + I2S1_TO_S0 = 0x0, + I2S1_TO_S1 = 0x1, +}I2S1_PINMUX, *PI2S1_PINMUX; + + +/* I2S Module Status */ +typedef enum _I2S_MODULE_STATUS_ { + I2S_DISABLE = 0x0, + I2S_ENABLE = 0x1, +}I2S_MODULE_STATUS, *PI2S_MODULE_STATUS; + + +/* I2S Device Status */ +typedef enum _I2S_Device_STATUS_ { + I2S_STS_UNINITIAL = 0x00, + I2S_STS_INITIALIZED = 0x01, + I2S_STS_IDLE = 0x02, + + I2S_STS_TX_READY = 0x03, + I2S_STS_TX_ING = 0x04, + + I2S_STS_RX_READY = 0x05, + I2S_STS_RX_ING = 0x06, + + I2S_STS_TRX_READY = 0x07, + I2S_STS_TRX_ING = 0x08, + + I2S_STS_ERROR = 0x09, +}I2S_Device_STATUS, *PI2S_Device_STATUS; + + +/* I2S Feature Status */ +typedef enum _I2S_FEATURE_STATUS_{ + I2S_FEATURE_DISABLED = 0, + I2S_FEATURE_ENABLED = 1, +}I2S_FEATURE_STATUS,*PI2S_FEATURE_STATUS; + +/* I2S Device Mode */ +typedef enum _I2S_DEV_MODE_ { + I2S_SLAVE_MODE = 0x0, + I2S_MASTER_MODE = 0x1 +}I2S_DEV_MODE, *PI2S_DEV_MODE; + +/* I2S Bus Transmit/Receive */ +typedef enum _I2S_DIRECTION_ { + I2S_ONLY_RX = 0x0, + I2S_ONLY_TX = 0x1, + I2S_TXRX = 0x2 +}I2S_DIRECTION, *PI2S_DIRECTION; + +/* I2S Channel number */ +typedef enum _I2S_CH_NUM_ { + I2S_CH_STEREO = 0x0, + I2S_CH_RSVD = 0x1, + I2S_CH_MONO = 0x2 +}I2S_CH_NUM, *PI2S_CH_NUM; + +/* I2S Page number */ +typedef enum _I2S_PAGE_NUM_ { + I2S_1PAGE = 0x0, + I2S_2PAGE = 0x1, + I2S_3PAGE = 0x2, + I2S_4PAGE = 0x3 +}I2S_PAGE_NUM, *PI2S_PAGE_NUM; + +/* I2S Sample rate*/ +typedef enum _I2S_SAMPLE_RATE_ { + I2S_SR_8KHZ = 0x00, + I2S_SR_16KHZ = 0x01, + I2S_SR_24KHZ = 0x02, + I2S_SR_48KHZ = 0x05 +}I2S_SAMPLE_RATE, *PI2S_SAMPLE_RATE; + +/* I2S User Callbacks */ +typedef struct _SAL_I2S_USER_CB_{ + VOID (*TXCB) (VOID *Data); + VOID (*TXCCB) (VOID *Data); + VOID (*RXCB) (VOID *Data); + VOID (*RXCCB) (VOID *Data); + VOID (*RDREQCB) (VOID *Data); + VOID (*ERRCB) (VOID *Data); + VOID (*GENCALLCB) (VOID *Data); +}SAL_I2S_USER_CB,*PSAL_I2S_USER_CB; + +/* I2S Transmit Buffer */ +typedef struct _SAL_I2S_TRANSFER_BUF_{ + u16 DataLen; + u16 TargetAddr; + u32 RegAddr; + u32 RSVD; + u8 *pDataBuf; +}SAL_I2S_TRANSFER_BUF,*PSAL_I2S_TRANSFER_BUF; + +/* RTK I2S OP */ +typedef struct _RTK_I2S_OP_ { + RTK_STATUS (*Init) (VOID *Data); + RTK_STATUS (*DeInit) (VOID *Data); + RTK_STATUS (*Send) (VOID *Data); + RTK_STATUS (*Receive) (VOID *Data); + RTK_STATUS (*IoCtrl) (VOID *Data); + RTK_STATUS (*PowerCtrl) (VOID *Data); +}RTK_I2S_OP, *PRTK_I2S_OP; + + +/* Software API Level I2S Handler */ +typedef struct _SAL_I2S_HND_{ + u8 DevNum; //I2S device number + u8 PinMux; //I2S pin mux seletion + u8 RSVD0; //Reserved + volatile u8 DevSts; //I2S device status + + u8 I2SChNum; //I2S Channel number mono or stereo + u8 I2SPageNum; //I2S Page number 2~4 + u16 I2SPageSize; //I2S Page size 1~4096 word + + u16 I2SRate; //I2S sample rate 8k ~ 96khz + u8 I2STRxAct; //I2S tx rx act, tx only or rx only or tx+rx + u8 I2SWordLen; //I2S Word length 16bit or 24bit + u8 RSVD1; //Reserved + + u32 RSVD2; //Reserved + u32 I2SExd; //I2S extended options: + //bit 0: I2C RESTART supported, + // 0 for NOT supported, + // 1 for supported + //bit 1: I2C General Call supported + // 0 for NOT supported, + // 1 for supported + //bit 2: I2C START Byte supported + // 0 for NOT supported, + // 1 for supported + //bit 3: I2C Slave-No-Ack + // supported + // 0 for NOT supported, + // 1 for supported + //bit 4: I2C bus loading, + // 0 for 100pf, + // 1 for 400pf + //bit 5: I2C slave ack to General + // Call + //bit 6: I2C User register address + //bit 7: I2C 2-Byte User register + // address + //bit 31~bit 8: Reserved + u32 ErrType; // + u32 TimeOut; //I2S IO Timeout count + + PHAL_I2S_INIT_DAT pInitDat; //Pointer to I2S initial data struct + u8 *pTXBuf; //Pointer to I2S TX buffer + u8 *pRXBuf; //Pointer to I2S RX buffer + PSAL_I2S_USER_CB pUserCB; //Pointer to I2S User Callback +}SAL_I2S_HND, *PSAL_I2S_HND; + + +/**********************************************************************/ +// Global Parameters +#if I2S0_USED +extern SAL_I2S_HND SalI2S0Hnd; +#endif + +#if I2S1_USED +extern SAL_I2S_HND SalI2S1Hnd; +#endif + +/**********************************************************************/ +// Function Prototypes +static inline RTK_STATUS +RtkI2SIdxChk( + IN u8 I2SIdx +) +{ +#if !I2S0_USED + if (I2SIdx == I2S0_SEL) + return _EXIT_FAILURE; +#endif + +#if !I2S1_USED + if (I2SIdx == I2S1_SEL) + return _EXIT_FAILURE; +#endif + + return _EXIT_SUCCESS; +} + + +/**********************************************************************/ +PSAL_I2S_HND +RtkI2SGetSalHnd(IN u8 I2SIdx); + +RTK_STATUS +RtkI2SLoadDefault(IN VOID *Data); + +RTK_STATUS +RtkI2SInit(IN VOID *Data); + +RTK_STATUS +RtkI2SDeInit(IN VOID *Data); + +RTK_STATUS +RtkI2SSend(IN VOID *Data); + +RTK_STATUS +RtkI2SReceive(IN VOID *Data); + +VOID SalI2SOpInit(IN VOID *Data); + +/**********************************************************************/ + + +VOID I2S0ISRHandle(VOID *Data); +VOID I2S1ISRHandle(VOID *Data); + + +/**********************************************************************/ + +VOID HalI2SOpInit( + IN VOID *Data +); + + +#endif + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_irqn.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_irqn.h new file mode 100644 index 0000000..b0ff564 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_irqn.h @@ -0,0 +1,122 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_IRQN_H_ +#define _HAL_IRQN_H_ + + +// C structure +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + + +#define PERIPHERAL_IRQ_BASE_NUM 64 + +typedef enum _IRQn_Type_ { +#if 0 +/****** Cortex-M3 Processor Exceptions Numbers ********/ + NON_MASKABLE_INT_IRQ = -14, + HARD_FAULT_IRQ = -13, + MEM_MANAGE_FAULT_IRQ = -12, + BUS_FAULT_IRQ = -11, + USAGE_FAULT_IRQ = -10, + SVCALL_IRQ = -5, + DEBUG_MONITOR_IRQ = -4, + PENDSVC_IRQ = -2, + SYSTICK_IRQ = -1, +#else +/****** Cortex-M3 Processor Exceptions Numbers ********/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Hard Fault, all classes of Fault */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ +#endif +/****** RTL8195A Specific Interrupt Numbers ************/ + SYSTEM_ON_IRQ = 0, + WDG_IRQ = 1, + TIMER0_IRQ = 2, + TIMER1_IRQ = 3, + I2C3_IRQ = 4, + TIMER2_7_IRQ = 5, + SPI0_IRQ = 6, + GPIO_IRQ = 7, + UART0_IRQ = 8, + SPI_FLASH_IRQ = 9, + USB_OTG_IRQ = 10, + SDIO_HOST_IRQ = 11, + SDIO_DEVICE_IRQ = 12, + I2S0_PCM0_IRQ = 13, + I2S1_PCM1_IRQ = 14, + WL_DMA_IRQ = 15, + WL_PROTOCOL_IRQ = 16, + CRYPTO_IRQ = 17, + GMAC_IRQ = 18, + PERIPHERAL_IRQ = 19, + GDMA0_CHANNEL0_IRQ = 20, + GDMA0_CHANNEL1_IRQ = 21, + GDMA0_CHANNEL2_IRQ = 22, + GDMA0_CHANNEL3_IRQ = 23, + GDMA0_CHANNEL4_IRQ = 24, + GDMA0_CHANNEL5_IRQ = 25, + GDMA1_CHANNEL0_IRQ = 26, + GDMA1_CHANNEL1_IRQ = 27, + GDMA1_CHANNEL2_IRQ = 28, + GDMA1_CHANNEL3_IRQ = 29, + GDMA1_CHANNEL4_IRQ = 30, + GDMA1_CHANNEL5_IRQ = 31, + +/****** RTL8195A Peripheral Interrupt Numbers ************/ + I2C0_IRQ = 64,// 0 + 64, + I2C1_IRQ = 65,// 1 + 64, + I2C2_IRQ = 66,// 2 + 64, + SPI1_IRQ = 72,// 8 + 64, + SPI2_IRQ = 73,// 9 + 64, + UART1_IRQ = 80,// 16 + 64, + UART2_IRQ = 81,// 17 + 64, + UART_LOG_IRQ = 88,// 24 + 64, + ADC_IRQ = 89,// 25 + 64, + DAC0_IRQ = 91,// 27 + 64, + DAC1_IRQ = 92,// 28 + 64, + //RXI300_IRQ = 93// 29 + 64 + LP_EXTENSION_IRQ = 93,// 29+64 + + RXI300_IRQ = 96,// 0+32 + 64 + NFC_IRQ = 97// 1+32+64 +} IRQn_Type, *PIRQn_Type; + + +typedef VOID (*HAL_VECTOR_FUN) (VOID); + +typedef enum _VECTOR_TABLE_TYPE_{ + DEDECATED_VECTRO_TABLE, + PERIPHERAL_VECTOR_TABLE +}VECTOR_TABLE_TYPE, *PVECTOR_TABLE_TYPE; + + +typedef u32 (*IRQ_FUN)(VOID *Data); + +typedef struct _IRQ_HANDLE_ { + IRQ_FUN IrqFun; + IRQn_Type IrqNum; + u32 Data; + u32 Priority; +}IRQ_HANDLE, *PIRQ_HANDLE; + +#ifdef __cplusplus +} +#endif // __cplusplus + + +#endif //_HAL_IRQN_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_misc.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_misc.h new file mode 100644 index 0000000..c48ebf2 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_misc.h @@ -0,0 +1,28 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _MISC_H_ +#define _MISC_H_ + +#include + +extern u32 HalDelayUs(u32 us); + +extern u32 HalGetCpuClk(VOID); +extern u8 HalGetRomInfo(VOID); + +extern _LONG_CALL_ void *_memset( void *s, int c, SIZE_T n ); +extern _LONG_CALL_ void *_memcpy( void *s1, const void *s2, SIZE_T n ); +extern _LONG_CALL_ int *_memcmp( const void *av, const void *bv, SIZE_T len ); + +extern _LONG_CALL_ SIZE_T _strlen(const char *s); +extern _LONG_CALL_ int _strcmp(const char *cs, const char *ct); + + +#endif //_MISC_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_peri_on.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_peri_on.h new file mode 100644 index 0000000..940c2d9 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_peri_on.h @@ -0,0 +1,449 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_PERI_ON_H_ +#define _HAL_PERI_ON_H_ + +#define MASK_ALLON 0xFFFFFFFF + +#define HAL_PERI_ON_READ32(addr) HAL_READ32(PERI_ON_BASE, addr) +#define HAL_PERI_ON_WRITE32(addr, value) HAL_WRITE32(PERI_ON_BASE, addr, value) +#define HAL_PERI_ON_READ16(addr) HAL_READ16(PERI_ON_BASE, addr) +#define HAL_PERI_ON_WRITE16(addr, value) HAL_WRITE16(PERI_ON_BASE, addr, value) +#define HAL_PERI_ON_READ8(addr) HAL_READ8(PERI_ON_BASE, addr) +#define HAL_PERI_ON_WRITE8(addr, value) HAL_WRITE8(PERI_ON_BASE, addr, value) +#define HAL_PERL_ON_FUNC_CTRL(addr,value,ctrl) \ + HAL_PERI_ON_WRITE32(addr, ((HAL_PERI_ON_READ32(addr) & (~value))|((MASK_ALLON - ctrl + 1) & value))) +#define HAL_PERL_ON_PIN_SEL(addr,mask,value) \ + HAL_PERI_ON_WRITE32(addr, ((HAL_PERI_ON_READ32(addr) & (~mask)) | value)) + +//A0 SYS_DEBUG_CTRL +#define DEBUG_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SYS_DEBUG_CTRL, BIT_SYS_DBG_PIN_EN, ctrl) + +//A4 SYS_PINMUX_CTRL +#define SIC_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SYS_PINMUX_CTRL, BIT_SIC_PIN_EN, ctrl) +#define EEPROM_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SYS_PINMUX_CTRL, BIT_EEPROM_PIN_EN, ctrl) + + +//210 SOV_FUNC_EN +#define LXBUS_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_LXBUS_EN, ctrl) +#define FLASH_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI_FLASH_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_FLASH_EN, ctrl);} + +#define MEM_CTRL_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDR_SDRAM_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_MEM_CTRL_EN, ctrl);} + +#define LOC_UART_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(LOG_UART_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_LOG_UART_EN, ctrl);} + +#define GDMA0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(GDMA0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_GDMA0_EN, ctrl);} + +#define GDMA1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(GDMA1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_GDMA1_EN, ctrl);} + +#define GTIMER_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(TIMER_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_GTIMER_EN, ctrl);} + +#define SECURITY_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(CRYPTO_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_SECURITY_ENGINE_EN, ctrl);} + +//214 SOC_HCI_COM_FUNC_EN +#define SDIOD_ON_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDIO_DEVICE_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOD_ON_EN, ctrl);} + +#define SDIOD_OFF_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDIO_DEVICE_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOD_OFF_EN, ctrl);} + +#define SDIOH_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDIO_HOST_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOH_EN, ctrl);} + +#define SDIO_ON_RST_MASK(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOD_ON_RST_MUX, ctrl) +#define OTG_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(USB_OTG_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_OTG_EN, ctrl);} + +#define OTG_RST_MASK(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_OTG_RST_MUX, ctrl) +#define MII_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(MII_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_MII_EN, ctrl);} + +#define MII_MUX_SEL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SM_SEL, ctrl) +#define WL_MACON_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(WIFI_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_WL_MACON_EN, ctrl);} + +//218 SOC_PERI_FUNC0_EN +#define UART0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_UART0_EN, ctrl);} + +#define UART1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_UART1_EN, ctrl);} + +#define UART2_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_UART2_EN, ctrl);} + +#define SPI0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_SPI0_EN, ctrl);} + +#define SPI1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_SPI1_EN, ctrl);} + +#define SPI2_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_SPI2_EN, ctrl);} + +#define I2C0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C0_EN, ctrl);} + +#define I2C1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C1_EN, ctrl);} + +#define I2C2_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C2_EN, ctrl);} + +#define I2C3_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C3_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C3_EN, ctrl);} + +#define I2S0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2S0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2S0_EN, ctrl);} + +#define I2S1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2S1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2S1_EN, ctrl);} + +#define PCM0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(PCM0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_PCM0_EN, ctrl);} + +#define PCM1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(PCM1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_PCM1_EN, ctrl);} + +//21C SOC_PERI_FUNC1_EN +#define ADC0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(ADC_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_ADC0_EN, ctrl);} + +#define DAC0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(DAC_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_DAC0_EN, ctrl);} + +#define DAC1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(DAC_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_DAC1_EN, ctrl);} + +#define GPIO_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(GPIO_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_GPIO_EN, ctrl);} + +//220 SOC_PERI_BD_FUNC0_EN +#define UART0_BD_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_BD_FUNC0_EN, BIT_PERI_UART0_BD_EN, ctrl);} + +#define UART1_BD_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_BD_FUNC0_EN, BIT_PERI_UART1_BD_EN, ctrl);} + +#define UART2_BD_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_BD_FUNC0_EN, BIT_PERI_UART2_BD_EN, ctrl);} + +//230 PESOC_CLK_CTRL +#define ACTCK_CPU_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_CKE_PLFM, ctrl) +#define ACTCK_TRACE_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_TRACE_EN, ctrl) +#define SLPCK_TRACE_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_TRACE_EN, ctrl) +#define ACTCK_VENDOR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_VENDOR_REG_EN, ctrl) +#define SLPCK_VENDOR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_VENDOR_REG_EN, ctrl) +#define ACTCK_FLASH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_FLASH_EN, ctrl) +#define SLPCK_FLASH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_FLASH_EN, ctrl) +#define ACTCK_SDR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_SDR_EN, ctrl) +#define SLPCK_SDR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_SDR_EN, ctrl) +#define ACTCK_LOG_UART_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_LOG_UART_EN, ctrl) +#define SLPCK_LOG_UART_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_LOG_UART_EN, ctrl) +#define ACTCK_TIMER_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_TIMER_EN, ctrl) +#define SLPCK_TIMER_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_TIMER_EN, ctrl) +#define ACTCK_GDMA0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_GDMA0_EN, ctrl) +#define SLPCK_GDMA0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_GDMA0_EN, ctrl) +#define ACTCK_GDMA1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_GDMA1_EN, ctrl) +#define SLPCK_GDMA1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_GDMA1_EN, ctrl) +#define ACTCK_GPIO_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_GPIO_EN, ctrl) +#define SLPCK_GPIO_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_GPIO_EN, ctrl) +#define ACTCK_BTCMD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_BTCMD_EN, ctrl) +#define SLPCK_BTCMD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_BTCMD_EN, ctrl) + +//234 PESOC_PERI_CLK_CTRL0 +#define ACTCK_UART0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_UART0_EN, ctrl) +#define SLPCK_UART0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_UART0_EN, ctrl) +#define ACTCK_UART1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_UART1_EN, ctrl) +#define SLPCK_UART1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_UART1_EN, ctrl) +#define ACTCK_UART2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_UART2_EN, ctrl) +#define SLPCK_UART2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_UART2_EN, ctrl) +#define ACTCK_SPI0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_SPI0_EN, ctrl) +#define SLPCK_SPI0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_SPI0_EN, ctrl) +#define ACTCK_SPI1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_SPI1_EN, ctrl) +#define SLPCK_SPI1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_SPI1_EN, ctrl) +#define ACTCK_SPI2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_SPI2_EN, ctrl) +#define SLPCK_SPI2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_SPI2_EN, ctrl) + +//238 PESOC_PERI_CLK_CTRL1 +#define ACTCK_I2C0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C0_EN, ctrl) +#define SLPCK_I2C0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C0_EN, ctrl) +#define ACTCK_I2C1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C1_EN, ctrl) +#define SLPCK_I2C1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C1_EN, ctrl) +#define ACTCK_I2C2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C2_EN, ctrl) +#define SLPCK_I2C2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C2_EN, ctrl) +#define ACTCK_I2C3_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C3_EN, ctrl) +#define SLPCK_I2C3_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C3_EN, ctrl) +#define ACTCK_I2S_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2S_EN, ctrl) +#define SLPCK_I2S_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2S_EN, ctrl) +#define ACTCK_PCM_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_PCM_EN, ctrl) +#define SLPCK_PCM_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_PCM_EN, ctrl) +#define ACTCK_ADC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_ADC_EN, ctrl) +#define SLPCK_ADC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_ADC_EN, ctrl) +#define ACTCK_DAC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_DAC_EN, ctrl) +#define SLPCK_DAC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_DAC_EN, ctrl) + +//240 PESOC_HCI_CLK_CTRL0 +#define ACTCK_SDIOD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_SDIO_DEV_EN, ctrl) +#define SLPCK_SDIOD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_SDIO_DEV_EN, ctrl) +#define ACTCK_SDIOH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_SDIO_HST_EN, ctrl) +#define SLPCK_SDIOH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_SDIO_HST_EN, ctrl) +#define ACTCK_OTG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_OTG_EN, ctrl) +#define SLPCK_OTG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_OTG_EN, ctrl) +#define ACTCK_MII_MPHY_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_MII_MPHY_EN, ctrl) +#define SLPCK_MII_MPHY_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_MII_MPHY_EN, ctrl) + +//244 PESOC_COM_CLK_CTRL1 +#define ACTCK_WL_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_ACTCK_WL_EN, ctrl) +#define SLPCK_WL_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_SLPCK_WL_EN, ctrl) +#define ACTCK_SEC_ENG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_ACTCK_SECURITY_ENG_EN, ctrl) +#define SLPCK_SEC_ENG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_SLPCK_SECURITY_ENG_EN, ctrl) +#define ACTCK_NFC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_ACTCK_NFC_EN, ctrl) +#define SLPCK_NFC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_SLPCK_NFC_EN, ctrl) +#define NFC_CAL_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_NFC_CAL_EN, ctrl) + +//250 REG_PERI_CLK_SEL +#define TRACE_CLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_TRACE_CK_SEL << BIT_SHIFT_PESOC_TRACE_CK_SEL), BIT_PESOC_TRACE_CK_SEL(num)) +#define FLASH_CLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_FLASH_CK_SEL << BIT_SHIFT_PESOC_FLASH_CK_SEL), BIT_PESOC_FLASH_CK_SEL(num)) +#define SDR_CLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_SDR_CK_SEL << BIT_SHIFT_PESOC_SDR_CK_SEL), BIT_PESOC_SDR_CK_SEL(num)) +#define I2C_SCLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_PERI_SCLK_SEL << BIT_SHIFT_PESOC_PERI_SCLK_SEL), BIT_PESOC_PERI_SCLK_SEL(num)) + +//270 REG_OSC32K_CTRL +#define OSC32K_CKGEN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_OSC32K_CTRL, BIT_32K_POW_CKGEN_EN, ctrl) + +//280 REG_UART_MUX_CTRL +#define UART0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_UART_MUX_CTRL, BIT_UART0_PIN_EN, ctrl) +#define UART0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_UART_MUX_CTRL, (BIT_MASK_UART0_PIN_SEL << BIT_SHIFT_UART0_PIN_SEL), BIT_UART0_PIN_SEL(num)) +#define UART1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_UART_MUX_CTRL, BIT_UART1_PIN_EN, ctrl) +#define UART1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_UART_MUX_CTRL, (BIT_MASK_UART1_PIN_SEL << BIT_SHIFT_UART1_PIN_SEL), BIT_UART1_PIN_SEL(num)) +#define UART2_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_UART_MUX_CTRL, BIT_UART2_PIN_EN, ctrl) +#define UART2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_UART_MUX_CTRL, (BIT_MASK_UART2_PIN_SEL << BIT_SHIFT_UART2_PIN_SEL), BIT_UART2_PIN_SEL(num)) + +//284 REG_SPI_MUX_CTRL +#define SPI0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI0_PIN_EN, ctrl) +#define SPI0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_SPI_MUX_CTRL, (BIT_MASK_SPI0_PIN_SEL << BIT_SHIFT_SPI0_PIN_SEL), BIT_SPI0_PIN_SEL(num)) +#define SPI1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI1_PIN_EN, ctrl) +#define SPI1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_SPI_MUX_CTRL, (BIT_MASK_SPI1_PIN_SEL << BIT_SHIFT_SPI1_PIN_SEL), BIT_SPI1_PIN_SEL(num)) +#define SPI2_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI2_PIN_EN, ctrl) +#define SPI2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_SPI_MUX_CTRL, (BIT_MASK_SPI2_PIN_SEL << BIT_SHIFT_SPI2_PIN_SEL), BIT_SPI2_PIN_SEL(num)) +#define SPI0_MULTI_CS_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI0_MULTI_CS_EN, ctrl) + +//288 REG_I2C_MUX_CTRL +#define I2C0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C0_PIN_EN, ctrl) +#define I2C0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C0_PIN_SEL << BIT_SHIFT_I2C0_PIN_SEL), BIT_I2C0_PIN_SEL(num)) +#define I2C1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C1_PIN_EN, ctrl) +#define I2C1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C1_PIN_SEL << BIT_SHIFT_I2C1_PIN_SEL), BIT_I2C1_PIN_SEL(num)) +#define I2C2_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C2_PIN_EN, ctrl) +#define I2C2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C2_PIN_SEL << BIT_SHIFT_I2C2_PIN_SEL), BIT_I2C2_PIN_SEL(num)) +#define I2C3_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C3_PIN_EN, ctrl) +#define I2C3_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C3_PIN_SEL << BIT_SHIFT_I2C3_PIN_SEL), BIT_I2C3_PIN_SEL(num)) + +//28C REG_I2S_MUX_CTRL +#define I2S0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S0_PIN_EN, ctrl) +#define I2S0_MCK_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S0_MCK_EN, ctrl) +#define I2S0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_I2S0_PIN_SEL << BIT_SHIFT_I2S0_PIN_SEL), BIT_I2S0_PIN_SEL(num)) +#define I2S1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S1_PIN_EN, ctrl) +#define I2S1_MCK_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S1_MCK_EN, ctrl) +#define I2S1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_I2S1_PIN_SEL << BIT_SHIFT_I2S1_PIN_SEL), BIT_I2S1_PIN_SEL(num)) +#define PCM0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_PCM0_PIN_EN, ctrl) +#define PCM0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_PCM0_PIN_SEL << BIT_SHIFT_PCM0_PIN_SEL), BIT_PCM0_PIN_SEL(num)) +#define PCM1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_PCM1_PIN_EN, ctrl) +#define PCM1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_PCM1_PIN_SEL << BIT_SHIFT_PCM1_PIN_SEL), BIT_PCM1_PIN_SEL(num)) + +//2A0 HCI_PINMUX_CTRL +#define SDIOD_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_HCI_PINMUX_CTRL, BIT_HCI_SDIOD_PIN_EN, ctrl) +#define SDIOH_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_HCI_PINMUX_CTRL, BIT_HCI_SDIOH_PIN_EN, ctrl) +#define MII_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_HCI_PINMUX_CTRL, BIT_HCI_MII_PIN_EN, ctrl) + +//2A4 WL_PINMUX_CTRL +#define LED_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_LED_PIN_EN, ctrl) +#define LED_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_WL_PINMUX_CTRL, (BIT_MASK_WL_LED_PIN_SEL << BIT_SHIFT_WL_LED_PIN_SEL), BIT_WL_LED_PIN_SEL(num)) +#define ANT0_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_ANT0_PIN_EN, ctrl) +#define ANT1_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_ANT1_PIN_EN, ctrl) +#define BTCOEX_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_BTCOEX_PIN_EN, ctrl) +#define BTCMD_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_BTCMD_PIN_EN, ctrl) +#define NFC_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_NFC_PIN_EN, ctrl) + +//2AC PWM_PINMUX_CTRL +#define PWM0_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM0_PIN_EN, ctrl) +#define PWM0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM0_PIN_SEL << BIT_SHIFT_PWM0_PIN_SEL), BIT_PWM0_PIN_SEL(num)) +#define PWM1_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM1_PIN_EN, ctrl) +#define PWM1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM1_PIN_SEL << BIT_SHIFT_PWM1_PIN_SEL), BIT_PWM1_PIN_SEL(num)) +#define PWM2_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM2_PIN_EN, ctrl) +#define PWM2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM2_PIN_SEL << BIT_SHIFT_PWM2_PIN_SEL), BIT_PWM2_PIN_SEL(num)) +#define PWM3_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM3_PIN_EN, ctrl) +#define PWM3_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM3_PIN_SEL << BIT_SHIFT_PWM3_PIN_SEL), BIT_PWM3_PIN_SEL(num)) +#define ETE0_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE0_PIN_EN, ctrl) +#define ETE0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE0_PIN_SEL << BIT_SHIFT_ETE0_PIN_SEL), BIT_ETE0_PIN_SEL(num)) +#define ETE1_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE1_PIN_EN, ctrl) +#define ETE1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE1_PIN_SEL << BIT_SHIFT_ETE1_PIN_SEL), BIT_ETE1_PIN_SEL(num)) +#define ETE2_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE2_PIN_EN, ctrl) +#define ETE2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE2_PIN_SEL << BIT_SHIFT_ETE2_PIN_SEL), BIT_ETE2_PIN_SEL(num)) +#define ETE3_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE3_PIN_EN, ctrl) +#define ETE3_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE3_PIN_SEL << BIT_SHIFT_ETE3_PIN_SEL), BIT_ETE3_PIN_SEL(num)) + +//2C0 CPU_PERIPHERAL_CTRL +#define SPI_FLASH_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_SPI_FLSH_PIN_EN, ctrl) +#define SPI_FLASH_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_CPU_PERIPHERAL_CTRL, (BIT_MASK_SPI_FLSH_PIN_SEL << BIT_SHIFT_SPI_FLSH_PIN_SEL), BIT_SPI_FLSH_PIN_SEL(num)) +#define SDR_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_SDR_PIN_EN, ctrl) +#define JTAG_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_JTAG_PIN_EN, ctrl) +#define TRACE_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_TRACE_PIN_EN, ctrl) +#define LOG_UART_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_LOG_UART_PIN_EN, ctrl) +#define LOG_UART_IR_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_LOG_UART_IR_EN, ctrl) + +//300 REG_PESOC_MEM_CTRL +#define SDR_DDL_FCTRL(ctrl) HAL_PERL_ON_PIN_SEL(REG_PESOC_MEM_CTRL, (BIT_MASK_PESOC_SDR_DDL_CTRL << BIT_SHIFT_PESOC_SDR_DDL_CTRL), BIT_PESOC_SDR_DDL_CTRL(ctrl)) +#define FLASH_DDL_FCTRL(ctrl) HAL_PERL_ON_PIN_SEL(REG_PESOC_MEM_CTRL, (BIT_MASK_PESOC_FLASH_DDL_CTRL << BIT_SHIFT_PESOC_FLASH_DDL_CTRL), BIT_PESOC_FLASH_DDL_CTRL(ctrl)) + +//304 REG_PESOC_SOC_CTRL +#define SRAM_MUX_CFG(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_SOC_CTRL, (BIT_MASK_PESOC_SRAM_MUX_CFG << BIT_SHIFT_PESOC_SRAM_MUX_CFG), BIT_PESOC_SRAM_MUX_CFG(num)) +#define LX_WL_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_LX_WL_SWAP_SEL, ctrl) +#define LX_MST_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_LX_MST_SWAP_SEL, ctrl) +#define LX_SLV_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_LX_SLV_SWAP_SEL, ctrl) +#define MII_LX_WRAPPER_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_MII_LX_WRAPPER_EN, ctrl) +#define MII_LX_MST_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_MII_LX_MST_SWAP_SEL, ctrl) +#define MII_LX_SLV_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_MII_LX_SLV_SWAP_SEL, ctrl) +#define GDMA_CFG(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_SOC_CTRL, (BIT_MASK_PESOC_GDMA_CFG << BIT_SHIFT_PESOC_GDMA_CFG), BIT_PESOC_GDMA_CFG(num)) + +//308 PESOC_PERI_CTRL +#define SPI_RN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CTRL, BIT_SOC_FUNC_SPI_RN, ctrl) + +//320 GPIO_SHTDN_CTRL +#define GPIO_GPA_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPA_SHTDN_N, ctrl) +#define GPIO_GPB_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPB_SHTDN_N, ctrl) +#define GPIO_GPC_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPC_SHTDN_N, ctrl) +#define GPIO_GPD_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPD_SHTDN_N, ctrl) +#define GPIO_GPE_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPE_SHTDN_N, ctrl) +#define GPIO_GPF_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPF_SHTDN_N, ctrl) +#define GPIO_GPG_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPG_SHTDN_N, ctrl) +#define GPIO_GPH_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPH_SHTDN_N, ctrl) +#define GPIO_GPI_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPI_SHTDN_N, ctrl) +#define GPIO_GPJ_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPJ_SHTDN_N, ctrl) +#define GPIO_GPK_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPK_SHTDN_N, ctrl) + +//374 +#define EGTIM_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PERI_EGTIM_CTRL, BIT_PERI_EGTIM_EN, ctrl) +#define EGTIM_RSIG_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_REF_SIG_SEL << BIT_SHIFT_PERI_EGTIM_REF_SIG_SEL), BIT_PERI_EGTIM_REF_SIG_SEL(num)) +#define EGTIME_PIN_G0_OPT_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_PIN_GROUP0_OPT_SEL << BIT_SHIFT_PERI_EGTIM_PIN_GROUP0_OPT_SEL), BIT_PERI_EGTIM_PIN_GROUP0_OPT_SEL(num)) +#define EGTIME_PIN_G1_OPT_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_PIN_GROUP1_OPT_SEL << BIT_SHIFT_PERI_EGTIM_PIN_GROUP1_OPT_SEL), BIT_PERI_EGTIM_PIN_GROUP1_OPT_SEL(num)) +#define EGTIME_PIN_G2_OPT_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_PIN_GROUP2_OPT_SEL << BIT_SHIFT_PERI_EGTIM_PIN_GROUP2_OPT_SEL), BIT_PERI_EGTIM_PIN_GROUP2_OPT_SEL(num)) + + +#endif //_HAL_PERI_ON_H_ + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_pinmux.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_pinmux.h new file mode 100644 index 0000000..faf3d2a --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_pinmux.h @@ -0,0 +1,75 @@ +#ifndef _HAL_PINMUX_ +#define _HAL_PINMUX_ + + +//Function Index +#define UART0 0 +#define UART1 1 +#define UART2 2 +#define SPI0 8 +#define SPI1 9 +#define SPI2 10 +#define SPI0_MCS 15 +#define I2C0 16 +#define I2C1 17 +#define I2C2 18 +#define I2C3 19 +#define I2S0 24 +#define I2S1 25 +#define PCM0 28 +#define PCM1 29 +#define SDIOD 64 +#define SDIOH 65 +#define MII 88 +#define WL_LED 96 +#define WL_ANT0 104 +#define WL_ANT1 105 +#define WL_BTCOEX 108 +#define WL_BTCMD 109 +#define NFC 112 +#define PWM0 160 +#define PWM1 161 +#define PWM2 162 +#define PWM3 163 +#define ETE0 164 +#define ETE1 165 +#define ETE2 166 +#define ETE3 167 +#define EGTIM 168 +#define SPI_FLASH 196 +#define SDR 200 +#define JTAG 216 +#define TRACE 217 +#define LOG_UART 220 +#define LOG_UART_IR 221 +#define SIC 224 +#define EEPROM 225 +#define DEBUG 226 + +//Location Index(Pin Mux Selection) +#define S0 0 +#define S1 1 +#define S2 2 +#define S3 3 + +//#ifndef _TRUE +//#define _TRUE 1 +//#endif + +//#ifndef _FALSE +//#define _FALSE 0 +//#endif + +#ifndef ON +#define ON 1 +#endif + +#ifndef OFF +#define OFF 0 +#endif +u8 +HalPinCtrlRtl8195A( + IN u32 Function, + IN u32 PinLocation, + IN BOOL Operation); +#endif //_HAL_PINMUX_ \ No newline at end of file diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_platform.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_platform.h new file mode 100644 index 0000000..d01ec1e --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_platform.h @@ -0,0 +1,92 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _HAL_PLATFORM_ +#define _HAL_PLATFORM_ + +#define ROMVERSION 0x02 +#define ROMINFORMATION (ROMVERSION) + + +#define SDR_SDRAM_BASE 0x30000000 +#define SYSTEM_CTRL_BASE 0x40000000 +#define PERI_ON_BASE 0x40000000 +#define VENDOR_REG_BASE 0x40002800 +#define SPI_FLASH_BASE 0x98000000 +#define SDR_CTRL_BASE 0x40005000 + +#define PERIPHERAL_IRQ_STATUS 0x04 +#define PERIPHERAL_IRQ_MODE 0x08 +#define PERIPHERAL_IRQ_EN 0x0C +#define LP_PERI_EXT_IRQ_STATUS 0x24 +#define LP_PERI_EXT_IRQ_MODE 0x28 +#define LP_PERI_EXT_IRQ_EN 0x2C + +#define PERIPHERAL_IRQ_ALL_LEVEL 0 + +#define TIMER_CLK 32*1000 + +//3 Peripheral IP Base Address +#define GPIO_REG_BASE 0x40001000 +#define TIMER_REG_BASE 0x40002000 +#define NFC_INTERFACE_BASE 0x40002400 +#define LOG_UART_REG_BASE 0x40003000 +#define I2C2_REG_BASE 0x40003400 +#define I2C3_REG_BASE 0x40003800 +#define SPI_FLASH_CTRL_BASE 0x40006000 +#define ADC_REG_BASE 0x40010000 +#define DAC_REG_BASE 0x40011000 +#define UART0_REG_BASE 0x40040000 +#define UART1_REG_BASE 0x40040400 +#define UART2_REG_BASE 0x40040800 +#define SPI0_REG_BASE 0x40042000 +#define SPI1_REG_BASE 0x40042400 +#define SPI2_REG_BASE 0x40042800 +#define I2C0_REG_BASE 0x40044000 +#define I2C1_REG_BASE 0x40044400 +#define SDIO_DEVICE_REG_BASE 0x40050000 +#define MII_REG_BASE 0x40050000 +#define SDIO_HOST_REG_BASE 0x40058000 +#define GDMA0_REG_BASE 0x40060000 +#define GDMA1_REG_BASE 0x40061000 +#define I2S0_REG_BASE 0x40062000 +#define I2S1_REG_BASE 0x40063000 +#define PCM0_REG_BASE 0x40064000 +#define PCM1_REG_BASE 0x40065000 +#define CRYPTO_REG_BASE 0x40070000 +#define WIFI_REG_BASE 0x40080000 +#define USB_OTG_REG_BASE 0x400C0000 + +#define GDMA1_REG_OFF 0x1000 +#define I2S1_REG_OFF 0x1000 +#define PCM1_REG_OFF 0x1000 +#define SSI_REG_OFF 0x400 +#define RUART_REG_OFF 0x400 + +#define CPU_CLK_TYPE_NO 6 + +enum _BOOT_TYPE_ { + BOOT_FROM_FLASH = 0, + BOOT_FROM_SDIO = 1, + BOOT_FROM_USB = 2, + BOOT_FROM_RSVD = 3, +}; + +enum _EFUSE_CPU_CLK_ { + CLK_200M = 0, + CLK_100M = 1, + CLK_50M = 2, + CLK_25M = 3, + CLK_12_5M = 4, + CLK_4M = 5, +}; + + +#endif //_HAL_PLATFORM_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_pwm.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_pwm.h new file mode 100644 index 0000000..9863782 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_pwm.h @@ -0,0 +1,57 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_PWM_H_ +#define _HAL_PWM_H_ + +#define MAX_PWM_CTRL_PIN 4 +// the minimum tick time for G-timer is 61 us (clock source = 32768Hz, reload value=1 and reload takes extra 1T) +#define GTIMER_TICK_US 31 // micro-second, 1000000/32768 ~= 30.5 +#define MIN_GTIMER_TIMEOUT 61 // in micro-sec, use this value to set the g-timer to generate tick for PWM. 61=(1000000/32768)*2 +#define PWM_GTIMER_TICK_TIME 61 // in micro-sec, use this value to set the g-timer to generate tick for PWM. 61=(1000000/32768)*2 + +typedef struct _HAL_PWM_ADAPTER_ { + u8 pwm_id; // the PWM ID, 0~3 + u8 sel; // PWM Pin selection, 0~3 + u8 gtimer_id; // using G-Timer ID, there are 7 G-timer, but we prefer to use timer 3~6 + u8 enable; // is enabled +// u32 timer_value; // the G-Timer auto-reload value, source clock is 32768Hz, reload will takes extra 1 tick. To set the time of a tick of PWM + u32 tick_time; // the tick time for the G-timer + u32 period; // the period of a PWM control cycle, in PWM tick + u32 pulsewidth; // the pulse width in a period of a PWM control cycle, in PWM tick. To control the ratio +// float duty_ratio; // the dyty ratio = pulswidth/period +}HAL_PWM_ADAPTER, *PHAL_PWM_ADAPTER; + + +extern HAL_Status +HAL_Pwm_Init( + u32 pwm_id, + u32 sel +); + +extern void +HAL_Pwm_Enable( + u32 pwm_id +); + +extern void +HAL_Pwm_Disable( + u32 pwm_id +); + +extern void +HAL_Pwm_SetDuty( + u32 pwm_id, + u32 period, + u32 pulse_width +); + + +#endif + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_spi_flash.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_spi_flash.h new file mode 100644 index 0000000..b39296a --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_spi_flash.h @@ -0,0 +1,210 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _HAL_SPIFLASH__ +#define _HAL_SPIFLASH__ +//====================================================== +// Header files +#include "rtl8195a_spi_flash.h" + +//====================================================== +// Definition +#define HAL_SPI_WRITE32(addr, value32) HAL_WRITE32(SPI_FLASH_CTRL_BASE, addr, value32) +#define HAL_SPI_WRITE16(addr, value16) HAL_WRITE16(SPI_FLASH_CTRL_BASE, addr, value16) +#define HAL_SPI_WRITE8(addr, value8) HAL_WRITE8(SPI_FLASH_CTRL_BASE, addr, value8) +#define HAL_SPI_READ32(addr) HAL_READ32(SPI_FLASH_CTRL_BASE, addr) +#define HAL_SPI_READ16(addr) HAL_READ16(SPI_FLASH_CTRL_BASE, addr) +#define HAL_SPI_READ8(addr) HAL_READ8(SPI_FLASH_CTRL_BASE, addr) + +typedef struct _SPIC_INIT_PARA_ { + u8 BaudRate; + u8 RdDummyCyle; + u8 DelayLine; + union { + u8 Rsvd; + u8 Valid; + }; +}SPIC_INIT_PARA, *PSPIC_INIT_PARA; + + +enum _SPIC_BIT_MODE_ { + SpicOneBitMode = 0, + SpicDualBitMode = 1, + SpicQuadBitMode = 2, +}; + +//====================================================== +// Flash type used +#define FLASH_MXIC_MX25L4006E 1 +#define FLASH_MXIC_MX25L8073E 0 + +// The below parts are based on the flash characteristics +//====== Flash Command Definition ====== +#if FLASH_MXIC_MX25L4006E + #define FLASH_CMD_WREN 0x06 //write enable + #define FLASH_CMD_WRDI 0x04 //write disable + #define FLASH_CMD_WRSR 0x01 //write status register + #define FLASH_CMD_RDID 0x9F //read idenfication + #define FLASH_CMD_RDSR 0x05 //read status register + #define FLASH_CMD_READ 0x03 //read data + #define FLASH_CMD_FREAD 0x0B //fast read data + #define FLASH_CMD_RDSFDP 0x5A //Read SFDP + #define FLASH_CMD_RES 0xAB //Read Electronic ID + #define FLASH_CMD_REMS 0x90 //Read Electronic Manufacturer & Device ID + #define FLASH_CMD_DREAD 0x3B //Double Output Mode command + #define FLASH_CMD_SE 0x20 //Sector Erase + #define FLASH_CMD_BE 0xD8 //Block Erase(or 0x52) + #define FLASH_CMD_CE 0x60 //Chip Erase(or 0xC7) + #define FLASH_CMD_PP 0x02 //Page Program + #define FLASH_CMD_DP 0xB9 //Deep Power Down + #define FLASH_CMD_RDP 0xAB //Release from Deep Power-Down +#elif FLASH_MXIC_MX25L8073E + #define FLASH_CMD_WREN 0x06 //write enable + #define FLASH_CMD_WRDI 0x04 //write disable + #define FLASH_CMD_WRSR 0x01 //write status register + #define FLASH_CMD_RDID 0x9F //read idenfication + #define FLASH_CMD_RDSR 0x05 //read status register + #define FLASH_CMD_READ 0x03 //read data + #define FLASH_CMD_FREAD 0x0B //fast read data + #define FLASH_CMD_RDSFDP 0x5A //Read SFDP + #define FLASH_CMD_RES 0xAB //Read Electronic ID + #define FLASH_CMD_REMS 0x90 //Read Electronic Manufacturer & Device ID + #define FLASH_CMD_DREAD 0x3B //Double Output Mode command + #define FLASH_CMD_SE 0x20 //Sector Erase + #define FLASH_CMD_BE 0x52 //Block Erase + #define FLASH_CMD_CE 0x60 //Chip Erase(or 0xC7) + #define FLASH_CMD_PP 0x02 //Page Program + #define FLASH_CMD_DP 0xB9 //Deep Power Down + #define FLASH_CMD_RDP 0xAB //Release from Deep Power-Down + #define FLASH_CMD_2READ 0xBB // 2 x I/O read command + #define FLASH_CMD_4READ 0xEB // 4 x I/O read command + #define FLASH_CMD_QREAD 0x6B // 1I / 4O read command + #define FLASH_CMD_4PP 0x38 //quad page program + #define FLASH_CMD_FF 0xFF //Release Read Enhanced + #define FLASH_CMD_REMS2 0xEF // read ID for 2x I/O mode + #define FLASH_CMD_REMS4 0xDF // read ID for 4x I/O mode + #define FLASH_CMD_ENSO 0xB1 // enter secured OTP + #define FLASH_CMD_EXSO 0xC1 // exit secured OTP + #define FLASH_CMD_RDSCUR 0x2B // read security register + #define FLASH_CMD_WRSCUR 0x2F // write security register +#else + #define FLASH_CMD_WREN 0x06 //write enable + #define FLASH_CMD_WRDI 0x04 //write disable + #define FLASH_CMD_WRSR 0x01 //write status register + #define FLASH_CMD_RDID 0x9F //read idenfication + #define FLASH_CMD_RDSR 0x05 //read status register + #define FLASH_CMD_READ 0x03 //read data + #define FLASH_CMD_FREAD 0x0B //fast read data + #define FLASH_CMD_RDSFDP 0x5A //Read SFDP + #define FLASH_CMD_RES 0xAB //Read Electronic ID + #define FLASH_CMD_REMS 0x90 //Read Electronic Manufacturer & Device ID + #define FLASH_CMD_DREAD 0x3B //Double Output Mode command + #define FLASH_CMD_SE 0x20 //Sector Erase + #define FLASH_CMD_BE 0x52 //Block Erase + #define FLASH_CMD_CE 0x60 //Chip Erase(or 0xC7) + #define FLASH_CMD_PP 0x02 //Page Program + #define FLASH_CMD_DP 0xB9 //Deep Power Down + #define FLASH_CMD_RDP 0xAB //Release from Deep Power-Down + #define FLASH_CMD_2READ 0xBB // 2 x I/O read command + #define FLASH_CMD_4READ 0xEB // 4 x I/O read command + #define FLASH_CMD_QREAD 0x6B // 1I / 4O read command + #define FLASH_CMD_4PP 0x38 //quad page program + #define FLASH_CMD_FF 0xFF //Release Read Enhanced + #define FLASH_CMD_REMS2 0xEF // read ID for 2x I/O mode + #define FLASH_CMD_REMS4 0xDF // read ID for 4x I/O mode + #define FLASH_CMD_ENSO 0xB1 // enter secured OTP + #define FLASH_CMD_EXSO 0xC1 // exit secured OTP + #define FLASH_CMD_RDSCUR 0x2B // read security register + #define FLASH_CMD_WRSCUR 0x2F // write security register +#endif //#if FLASH_MXIC_MX25L4006E +// ============================ + +// ===== Flash Parameter Definition ===== +#if FLASH_MXIC_MX25L4006E + #define FLASH_RD_2IO_EN 0 + #define FLASH_RD_2O_EN 1 + #define FLASH_RD_4IO_EN 0 + #define FLASH_RD_4O_EN 0 + #define FLASH_WR_2IO_EN 0 + #define FLASH_WR_2O_EN 0 + #define FLASH_WR_4IO_EN 0 + #define FLASH_WR_4O_EN 0 + + #define FLASH_DM_CYCLE_2O 0x08 + #define FLASH_VLD_DUAL_CMDS (BIT_WR_BLOCKING | BIT_RD_DUAL_I) + #define FLASH_VLD_QUAD_CMDS (0) + +#elif FLASH_MXIC_MX25L8073E //This flash model is just for prototype, if you want to use it, + //the code MUST be rechecked according to the flash spec. + #define FLASH_RD_2IO_EN 1 + #define FLASH_RD_2O_EN 0 + #define FLASH_RD_4IO_EN 1 + #define FLASH_RD_4O_EN 0 + #define FLASH_WR_2IO_EN 1 + #define FLASH_WR_2O_EN 0 + #define FLASH_WR_4IO_EN 1 + #define FLASH_WR_4O_EN 0 + + #define FLASH_DM_CYCLE_2O 0x08 + #define FLASH_DM_CYCLE_2IO 0x04 + #define FLASH_DM_CYCLE_4O 0x08 + #define FLASH_DM_CYCLE_4IO 0x04 + + #define FLASH_VLD_DUAL_CMDS (BIT_WR_BLOCKING | BIT_RD_DUAL_IO) + #define FLASH_VLD_QUAD_CMDS (BIT_WR_BLOCKING | BIT_WR_QUAD_II | BIT_RD_QUAD_IO) +#else + #define FLASH_RD_2IO_EN 1 + #define FLASH_RD_2O_EN 0 + #define FLASH_RD_4IO_EN 1 + #define FLASH_RD_4O_EN 0 + #define FLASH_WR_2IO_EN 1 + #define FLASH_WR_2O_EN 0 + #define FLASH_WR_4IO_EN 1 + #define FLASH_WR_4O_EN 0 + + #define FLASH_DM_CYCLE_2O 0x08 + #define FLASH_DM_CYCLE_2IO 0x04 + #define FLASH_DM_CYCLE_4O 0x08 + #define FLASH_DM_CYCLE_4IO 0x04 + + #define FLASH_VLD_DUAL_CMDS (BIT_WR_BLOCKING | BIT_RD_DUAL_IO) + #define FLASH_VLD_QUAD_CMDS (BIT_WR_BLOCKING | BIT_WR_QUAD_II | BIT_RD_QUAD_IO) +#endif + +//====================================================== +// Function prototype +BOOLEAN SpicFlashInitRtl8195A(u8 SpicBitMode); + +_LONG_CALL_ +extern VOID SpicLoadInitParaFromClockRtl8195A(u8 CpuClkMode, u8 BaudRate, PSPIC_INIT_PARA pSpicInitPara); + +// spi-flash controller initialization +_LONG_CALL_ +extern VOID SpicInitRtl8195A(u8 InitBaudRate, u8 SpicBitMode); + +// wait sr[0] = 0, wait transmission done +_LONG_CALL_ +extern VOID SpicWaitBusyDoneRtl8195A(VOID); + +// wait spi-flash status register[0] = 0 +//_LONG_CALL_ +//extern VOID SpicWaitWipDoneRtl8195A(SPIC_INIT_PARA SpicInitPara); + +VOID SpicBlockEraseFlashRtl8195A(IN u32 Address); +VOID SpicSectorEraseFlashRtl8195A(IN u32 Address); +VOID SpicWriteProtectFlashRtl8195A(IN u32 Protect); +VOID SpicWaitWipDoneRefinedRtl8195A(IN SPIC_INIT_PARA SpicInitPara); +VOID SpicRxCmdRefinedRtl8195A(IN u8 cmd,IN SPIC_INIT_PARA SpicInitPara); +u8 SpicGetFlashStatusRefinedRtl8195A(IN SPIC_INIT_PARA SpicInitPara); +VOID SpicInitRefinedRtl8195A(IN u8 InitBaudRate,IN u8 SpicBitMode); +u32 SpicOneBitCalibrationRtl8195A(IN u8 SysCpuClk); +VOID SpicDisableRtl8195A(VOID); + +#endif //_HAL_SPIFLASH__ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_ssi.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_ssi.h new file mode 100644 index 0000000..e834230 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_ssi.h @@ -0,0 +1,256 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_SSI_H_ +#define _HAL_SSI_H_ + +#include "rtl8195a_ssi.h" + +/** + * LOG Configurations + */ + +extern u32 SSI_DBG_CONFIG; +extern uint8_t SPI0_IS_AS_SLAVE; + + +#define SSI_DBG_ENTRANCE(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_ENTRANCE)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE ANSI_COLOR_GREEN __VA_ARGS__ ANSI_COLOR_RESET); \ +}while(0) + +#define SSI_DBG_INIT(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INIT)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INIT_V(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INIT_V)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INIT_VV(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INIT_VV)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_PINMUX(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_PINMUX)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_ENDIS(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_ENDIS)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_V(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_V)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_HNDLR(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_HNDLR)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_READ(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_READ)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_WRITE(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_WRITE)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_STATUS(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_STATUS)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_FIFO(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_FIFO)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_READ(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_READ)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_WRITE(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_WRITE)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_SLV_CTRL(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_SLV_CTRL)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +typedef enum _SSI_DBG_TYPE_LIST_ { + DBG_TYPE_ENTRANCE = 1 << 0, + DBG_TYPE_INIT = 1 << 1, + DBG_TYPE_INIT_V = 1 << 2, + DBG_TYPE_INIT_VV = 1 << 3, + DBG_TYPE_PINMUX = 1 << 4, + DBG_TYPE_ENDIS = 1 << 5, + DBG_TYPE_INT = 1 << 6, + DBG_TYPE_INT_V = 1 << 7, + DBG_TYPE_INT_HNDLR = 1 << 8, + DBG_TYPE_INT_READ = 1 << 9, + DBG_TYPE_INT_WRITE = 1 << 10, + DBG_TYPE_STATUS = 1 << 11, + DBG_TYPE_FIFO = 1 << 12, + DBG_TYPE_READ = 1 << 13, + DBG_TYPE_WRITE = 1 << 14, + DBG_TYPE_SLV_CTRL = 1 << 15 +} SSI_DBG_TYPE_LIST, *PSSI_DBG_TYPE_LIST; + + typedef struct _SSI_DMA_CONFIG_ { + VOID *pHalGdmaOp; + VOID *pTxHalGdmaAdapter; + VOID *pRxHalGdmaAdapter; + u8 RxDmaBurstSize; + u8 TxDmaBurstSize; + u8 RxDmaEnable; + u8 TxDmaEnable; + IRQ_HANDLE RxGdmaIrqHandle; + IRQ_HANDLE TxGdmaIrqHandle; +}SSI_DMA_CONFIG, *PSSI_DMA_CONFIG; + +/** + * DesignWare SSI Configurations + */ +typedef struct _HAL_SSI_ADAPTOR_ { + SSI_DMA_CONFIG DmaConfig; + IRQ_HANDLE IrqHandle; + // + VOID (*RxCompCallback)(VOID *Para); + VOID *RxCompCbPara; + VOID *RxData; + VOID (*TxCompCallback)(VOID *Para); + VOID *TxCompCbPara; + VOID *TxData; + u32 DmaRxDataLevel; + u32 DmaTxDataLevel; + u32 InterruptPriority; + u32 RxLength; + u32 RxLengthRemainder; + u32 RxThresholdLevel; + u32 TxLength; + u32 TxThresholdLevel; + u32 SlaveSelectEnable; + // + u16 ClockDivider; + u16 DataFrameNumber; + // + u8 ControlFrameSize; + u8 DataFrameFormat; + u8 DataFrameSize; + u8 DmaControl; + u8 Index; + u8 InterruptMask; + u8 MicrowireDirection; + u8 MicrowireHandshaking; + u8 MicrowireTransferMode; + u8 PinmuxSelect; + u8 Role; + u8 SclkPhase; + u8 SclkPolarity; + u8 SlaveOutputEnable; + u8 TransferMode; + u8 TransferMechanism; +}HAL_SSI_ADAPTOR, *PHAL_SSI_ADAPTOR; + +typedef struct _HAL_SSI_OP_{ + HAL_Status (*HalSsiPinmuxEnable)(VOID *Adaptor); + HAL_Status (*HalSsiEnable)(VOID *Adaptor); + HAL_Status (*HalSsiDisable)(VOID *Adaptor); + HAL_Status (*HalSsiInit)(VOID *Adaptor); + HAL_Status (*HalSsiSetSclkPolarity)(VOID *Adaptor); + HAL_Status (*HalSsiSetSclkPhase)(VOID *Adaptor); + HAL_Status (*HalSsiWrite)(VOID *Adaptor, u32 value); + HAL_Status (*HalSsiLoadSetting)(VOID *Adaptor, VOID *Setting); + HAL_Status (*HalSsiSetInterruptMask)(VOID *Adaptor); + HAL_Status (*HalSsiSetDeviceRole)(VOID *Adaptor, u32 Role); + HAL_Status (*HalSsiInterruptEnable)(VOID *Adaptor); + HAL_Status (*HalSsiInterruptDisable)(VOID *Adaptor); + HAL_Status (*HalSsiReadInterrupt)(VOID *Adaptor, VOID *RxData, u32 Length); + HAL_Status (*HalSsiSetRxFifoThresholdLevel)(VOID *Adaptor); + HAL_Status (*HalSsiSetTxFifoThresholdLevel)(VOID *Adaptor); + HAL_Status (*HalSsiWriteInterrupt)(VOID *Adaptor, VOID *TxData, u32 Length); + HAL_Status (*HalSsiSetSlaveEnableRegister)(VOID *Adaptor, u32 SlaveIndex); + u32 (*HalSsiBusy)(VOID *Adaptor); + u32 (*HalSsiReadable)(VOID *Adaptor); + u32 (*HalSsiWriteable)(VOID *Adaptor); + u32 (*HalSsiGetInterruptMask)(VOID *Adaptor); + u32 (*HalSsiGetRxFifoLevel)(VOID *Adaptor); + u32 (*HalSsiGetTxFifoLevel)(VOID *Adaptor); + u32 (*HalSsiGetStatus)(VOID *Adaptor); + u32 (*HalSsiGetInterruptStatus)(VOID *Adaptor); + u32 (*HalSsiRead)(VOID *Adaptor); + u32 (*HalSsiGetRawInterruptStatus)(VOID *Adaptor); + u32 (*HalSsiGetSlaveEnableRegister)(VOID *Adaptor); +}HAL_SSI_OP, *PHAL_SSI_OP; + +typedef struct _DW_SSI_DEFAULT_SETTING_ { + VOID (*RxCompCallback)(VOID *Para); + VOID *RxCompCbPara; + VOID *RxData; + VOID (*TxCompCallback)(VOID *Para); + VOID *TxCompCbPara; + VOID *TxData; + u32 DmaRxDataLevel; + u32 DmaTxDataLevel; + u32 InterruptPriority; + u32 RxLength; + u32 RxLengthRemainder; + u32 RxThresholdLevel; + u32 TxLength; + u32 TxThresholdLevel; + u32 SlaveSelectEnable; + // + u16 ClockDivider; + u16 DataFrameNumber; + // + u8 ControlFrameSize; + u8 DataFrameFormat; + u8 DataFrameSize; + u8 DmaControl; + //u8 Index; + u8 InterruptMask; + u8 MicrowireDirection; + u8 MicrowireHandshaking; + u8 MicrowireTransferMode; + //u8 PinmuxSelect; + //u8 Role; + u8 SclkPhase; + u8 SclkPolarity; + u8 SlaveOutputEnable; + u8 TransferMode; + u8 TransferMechanism; +} DW_SSI_DEFAULT_SETTING, *PDW_SSI_DEFAULT_SETTING; + + +struct spi_s { + HAL_SSI_ADAPTOR spi_adp; + HAL_SSI_OP spi_op; +}; + +VOID HalSsiOpInit(VOID *Adaptor); + +#endif + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_timer.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_timer.h new file mode 100644 index 0000000..6d1a257 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_timer.h @@ -0,0 +1,50 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_TIMER_H_ +#define _HAL_TIMER_H_ +#include "basic_types.h" +#include "hal_platform.h" +#include "rtl8195a_timer.h" + +typedef enum _TIMER_MODE_ { + FREE_RUN_MODE = 0, + USER_DEFINED = 1 +}TIMER_MODE, *PTIMER_MODE; + + +typedef struct _TIMER_ADAPTER_ { + + u32 TimerLoadValueUs; + u32 TimerIrqPriority; + TIMER_MODE TimerMode; + IRQ_HANDLE IrqHandle; + u8 TimerId; + u8 IrqDis; + +}TIMER_ADAPTER, *PTIMER_ADAPTER; + + +typedef struct _HAL_TIMER_OP_ { + u32 (*HalGetTimerId)(u32 *TimerId); + BOOL (*HalTimerInit)(VOID *Data); + u32 (*HalTimerReadCount)(u32 TimerId); + VOID (*HalTimerIrqClear)(u32 TimerId); + VOID (*HalTimerDis)(u32 TimerId); + VOID (*HalTimerEn)(u32 TimerId); + VOID (*HalTimerDumpReg)(u32 TimerId); +}HAL_TIMER_OP, *PHAL_TIMER_OP; + + +VOID HalTimerOpInit( + IN VOID *Data +); + + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_uart.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_uart.h new file mode 100644 index 0000000..d0cefed --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_uart.h @@ -0,0 +1,119 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_UART_H_ +#define _HAL_UART_H_ + +#include "rtl8195a_uart.h" + +/** + * RUART Configurations + */ +#define UART_WAIT_FOREVER 0xffffffff + +typedef struct _UART_DMA_CONFIG_ { + u8 TxDmaEnable; + u8 RxDmaEnable; + u8 TxDmaBurstSize; + u8 RxDmaBurstSize; + VOID *pHalGdmaOp; + VOID *pTxHalGdmaAdapter; + VOID *pRxHalGdmaAdapter; + IRQ_HANDLE TxGdmaIrqHandle; + IRQ_HANDLE RxGdmaIrqHandle; +}UART_DMA_CONFIG, *PUART_DMA_CONFIG; + +typedef struct _HAL_RUART_ADAPTER_ { + u32 BaudRate; + u32 FlowControl; + u32 FifoControl; + u32 Interrupts; + u32 TxCount; // how many byte to TX + u32 RxCount; // how many bytes to RX + u8 *pTxBuf; + u8 *pRxBuf; + HAL_UART_State State; // UART state + u8 Status; // Transfer Status + u8 Locked; // is UART locked for operation + u8 UartIndex; + u8 WordLen; // word length select: 0 -> 7 bits, 1 -> 8 bits + u8 StopBit; // word length select: 0 -> no stop bit, 1 -> 1 stop bit + u8 Parity; // parity check enable + u8 ParityType; // parity check type + u8 StickParity; + u8 ModemStatus; // the modem status + u8 DmaEnable; + u8 TestCaseNumber; + u8 PinmuxSelect; + BOOL PullMode; + IRQ_HANDLE IrqHandle; + PUART_DMA_CONFIG DmaConfig; + VOID (*ModemStatusInd)(VOID *pAdapter); // modem status indication interrupt handler + VOID (*TxTDCallback)(VOID *pAdapter); // User Tx Done callback function + VOID (*RxDRCallback)(VOID *pAdapter); // User Rx Data ready callback function + VOID (*TxCompCallback)(VOID *para); // User Tx complete callback function + VOID (*RxCompCallback)(VOID *para); // User Rx complete callback function + VOID *TxTDCbPara; // the pointer agrument for TxTDCallback + VOID *RxDRCbPara; // the pointer agrument for RxDRCallback + VOID *TxCompCbPara; // the pointer argument for TxCompCbPara + VOID *RxCompCbPara; // the pointer argument for RxCompCallback + VOID (*EnterCritical)(void); + VOID (*ExitCritical)(void); +}HAL_RUART_ADAPTER, *PHAL_RUART_ADAPTER; + +typedef struct _HAL_RUART_OP_ { + VOID (*HalRuartAdapterLoadDef)(VOID *pAdp, u8 UartIdx); // Load UART adapter default setting + VOID (*HalRuartTxGdmaLoadDef)(VOID *pAdp, VOID *pCfg); // Load TX GDMA default setting + VOID (*HalRuartRxGdmaLoadDef)(VOID *pAdp, VOID *pCfg); // Load RX GDMA default setting + HAL_Status (*HalRuartResetRxFifo)(VOID *Data); + HAL_Status (*HalRuartInit)(VOID *Data); + VOID (*HalRuartDeInit)(VOID *Data); + HAL_Status (*HalRuartPutC)(VOID *Data, u8 TxData); + u32 (*HalRuartSend)(VOID *Data, u8 *pTxData, u32 Length, u32 Timeout); + HAL_Status (*HalRuartIntSend)(VOID *Data, u8 *pTxData, u32 Length); + HAL_Status (*HalRuartDmaSend)(VOID *Data, u8 *pTxData, u32 Length); + HAL_Status (*HalRuartStopSend)(VOID *Data); + HAL_Status (*HalRuartGetC)(VOID *Data, u8 *pRxByte); + u32 (*HalRuartRecv)(VOID *Data, u8 *pRxData, u32 Length, u32 Timeout); + HAL_Status (*HalRuartIntRecv)(VOID *Data, u8 *pRxData, u32 Length); + HAL_Status (*HalRuartDmaRecv)(VOID *Data, u8 *pRxData, u32 Length); + HAL_Status (*HalRuartStopRecv)(VOID *Data); + u8 (*HalRuartGetIMR)(VOID *Data); + VOID (*HalRuartSetIMR)(VOID *Data); + u32 (*HalRuartGetDebugValue)(VOID *Data, u32 DbgSel); + VOID (*HalRuartDmaInit)(VOID *Data); + VOID (*HalRuartRTSCtrl)(VOID *Data, BOOLEAN RtsCtrl); + VOID (*HalRuartRegIrq)(VOID *Data); + VOID (*HalRuartIntEnable)(VOID *Data); + VOID (*HalRuartIntDisable)(VOID *Data); +}HAL_RUART_OP, *PHAL_RUART_OP; + +typedef struct _RUART_DATA_ { + PHAL_RUART_ADAPTER pHalRuartAdapter; + BOOL PullMode; + u8 BinaryData; + u8 SendBuffer; + u8 RecvBuffer; +}RUART_DATA, *PRUART_DATA; + +typedef struct _RUART_ADAPTER_ { + PHAL_RUART_OP pHalRuartOp; + PHAL_RUART_ADAPTER pHalRuartAdapter; + PUART_DMA_CONFIG pHalRuartDmaCfg; +}RUART_ADAPTER, *PRUART_ADAPTER; + +VOID +HalRuartOpInit( + IN VOID *Data +); + +extern const HAL_RUART_OP _HalRuartOp; + +#endif + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_util.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_util.h new file mode 100644 index 0000000..aac573b --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_util.h @@ -0,0 +1,252 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#ifndef _HAL_UTIL_H_ +#define _HAL_UTIL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ +struct LIST_HEADER { + struct LIST_HEADER *Next, *Prev; +}; + +typedef struct LIST_HEADER _LIST; + +//#define RTL_LIST_HEAD_INIT(name) { &(name), &(name) } + +#define RTL_INIT_LIST_HEAD(ptr) do { \ + (ptr)->Next = (ptr); (ptr)->Prev = (ptr); \ +} while (0) + + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ + static __inline__ VOID + __List_Add( + IN struct LIST_HEADER * New, + IN struct LIST_HEADER * Prev, + IN struct LIST_HEADER * Next +) +{ + Next->Prev = New; + New->Next = Next; + New->Prev = Prev; + Prev->Next = New; +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ + static __inline__ VOID + __List_Del( + IN struct LIST_HEADER * Prev, + IN struct LIST_HEADER * Next + ) +{ + Next->Prev = Prev; + Prev->Next = Next; +} + +/** + * ListDel - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is in an undefined state. + */ +static __inline__ VOID +ListDel( + IN struct LIST_HEADER *Entry +) +{ + __List_Del(Entry->Prev, Entry->Next); +} + +/** + * ListDelInit - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static __inline__ VOID +ListDelInit( + IN struct LIST_HEADER *Entry +) +{ + __List_Del(Entry->Prev, Entry->Next); + RTL_INIT_LIST_HEAD(Entry); + +} + +/** + * ListEmpty - tests whether a list is empty + * @head: the list to test. + */ +static __inline__ u32 +ListEmpty( + IN struct LIST_HEADER *Head +) +{ + return Head->Next == Head; +} + +/** + * ListSplice - join two lists + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static __inline__ VOID +ListSplice( + IN struct LIST_HEADER *List, + IN struct LIST_HEADER *Head +) +{ + struct LIST_HEADER *First = List->Next; + + if (First != List) { + struct LIST_HEADER *Last = List->Prev; + struct LIST_HEADER *At = Head->Next; + + First->Prev = Head; + Head->Next = First; + + Last->Next = At; + At->Prev = Last; + } +} + +static __inline__ VOID +ListAdd( + IN struct LIST_HEADER *New, + IN struct LIST_HEADER *head +) +{ + __List_Add(New, head, head->Next); +} + + +static __inline__ VOID +ListAddTail( + IN struct LIST_HEADER *New, + IN struct LIST_HEADER *head +) +{ + __List_Add(New, head->Prev, head); +} + +static __inline VOID +RtlInitListhead( + IN _LIST *list +) +{ + RTL_INIT_LIST_HEAD(list); +} + + +/* +For the following list_xxx operations, +caller must guarantee the atomic context. +Otherwise, there will be racing condition. +*/ +static __inline u32 +RtlIsListEmpty( + IN _LIST *phead +) +{ + + if (ListEmpty(phead)) + return _TRUE; + else + return _FALSE; + +} + +static __inline VOID +RtlListInsertHead( + IN _LIST *plist, + IN _LIST *phead +) +{ + ListAdd(plist, phead); +} + +static __inline VOID +RtlListInsertTail( + IN _LIST *plist, + IN _LIST *phead +) +{ + ListAddTail(plist, phead); +} + + +static __inline _LIST +*RtlListGetNext( + IN _LIST *plist +) +{ + return plist->Next; +} + +static __inline VOID +RtlListDelete( + IN _LIST *plist +) +{ + ListDelInit(plist); +} + +#define RTL_LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) + +#ifndef CONTAINER_OF +#define CONTAINER_OF(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) +#endif + +#define list_entry(ptr, type, member) \ + CONTAINER_OF(ptr, type, member) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->Next, type, member) + +#define list_next_entry(pos, member, type) \ + list_entry((pos)->member.Next, type, member) + +#define list_for_each_entry(pos, head, member, type) \ + for (pos = list_first_entry(head, type, member); \ + &pos->member != (head); \ + pos = list_next_entry(pos, member, type)) +#define list_for_each(pos, head) \ + for (pos = (head)->Next; pos != (head); pos = pos->Next) + + +#ifndef BIT + #define BIT(x) ( 1 << (x)) +#endif + +#ifdef __cplusplus +} +#endif + +#endif //_HAL_UTIL_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/hal_vector_table.h b/sdk/src/targets/hal/target_rtk/target_8195a/hal_vector_table.h new file mode 100644 index 0000000..3a6d701 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/hal_vector_table.h @@ -0,0 +1,53 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _HAL_VECTOR_TABLE_H_ +#define _HAL_VECTOR_TABLE_H_ + + + + +extern _LONG_CALL_ VOID +VectorTableInitRtl8195A( + IN u32 StackP +); + +extern _LONG_CALL_ VOID +VectorTableInitForOSRtl8195A( + IN VOID *PortSVC, + IN VOID *PortPendSVH, + IN VOID *PortSysTick +); + +extern _LONG_CALL_ BOOL +VectorIrqRegisterRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + +extern _LONG_CALL_ BOOL +VectorIrqUnRegisterRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + + +extern _LONG_CALL_ VOID +VectorIrqEnRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + +extern _LONG_CALL_ VOID +VectorIrqDisRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + + +extern _LONG_CALL_ VOID +HalPeripheralIntrHandle(VOID); +#endif //_HAL_VECTOR_TABLE_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a.h new file mode 100644 index 0000000..bc83450 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a.h @@ -0,0 +1,111 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#ifndef _HAL_8195A_H_ +#define _HAL_8195A_H_ + +#include "platform_options.h" +#include "basic_types.h" +#include "section_config.h" +#include "rtl8195a_sys_on.h" +#include "rtl8195a_peri_on.h" +#include "hal_platform.h" +#include "hal_pinmux.h" +#include "hal_api.h" +#include "hal_peri_on.h" +#include "hal_misc.h" +#include "hal_irqn.h" +#include "hal_vector_table.h" +#include "hal_diag.h" +#include "hal_spi_flash.h" +#include "hal_timer.h" +#include "hal_util.h" +#include "hal_efuse.h" +#include "diag.h" + +/* ---------------------------------------------------------------------------- + -- Cortex M3 Core Configuration + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Cortex_Core_Configuration Cortex M0 Core Configuration + * @{ + */ + +#define __CM3_REV 0x0200 /**< Core revision r0p0 */ +#define __MPU_PRESENT 1 /**< Defines if an MPU is present or not */ +#define __NVIC_PRIO_BITS 4 /**< Number of priority bits implemented in the NVIC */ +#define __Vendor_SysTickConfig 1 /**< Vendor specific implementation of SysTickConfig is defined */ + +#include "core_cm3.h" + +#include "hal_timer.h" + +#ifdef CONFIG_GDMA_EN +#include "hal_gdma.h" +#include "rtl8195a_gdma.h" +#endif + +#ifdef CONFIG_GPIO_EN +#include "hal_gpio.h" +#include "rtl8195a_gpio.h" +#endif + +#ifdef CONFIG_SPI_COM_EN +#include "hal_ssi.h" +#include "rtl8195a_ssi.h" +#endif + +#ifdef CONFIG_UART_EN +#include "hal_uart.h" +#include "rtl8195a_uart.h" +#endif + +#ifdef CONFIG_I2C_EN +#include "hal_i2c.h" +#include "rtl8195a_i2c.h" +#endif + +#ifdef CONFIG_PCM_EN +#include "hal_pcm.h" +#include "rtl8195a_pcm.h" +#endif + +#ifdef CONFIG_PWM_EN +#include "hal_pwm.h" +#include "rtl8195a_pwm.h" +#endif + +#ifdef CONFIG_I2S_EN +#include "hal_i2s.h" +#include "rtl8195a_i2s.h" +#endif + +#ifdef CONFIG_DAC_EN +#include "hal_dac.h" +#include "rtl8195a_dac.h" +#endif + +#ifdef CONFIG_ADC_EN +#include "hal_adc.h" +#include "rtl8195a_adc.h" +#endif + + + +#ifdef CONFIG_SDIO_DEVICE_EN +#include "hal_sdio.h" +#endif + +#ifdef CONFIG_NFC_EN +#include "hal_nfc.h" +#include "rtl8195a_nfc.h" +#endif + + +#endif //_HAL_8195A_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_adc.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_adc.h new file mode 100644 index 0000000..f0549a3 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_adc.h @@ -0,0 +1,350 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_ADC_H_ +#define _RTL8195A_ADC_H_ + + +//================ Register Bit Field ========================== +//2 REG_ADC_FIFO_READ + +#define BIT_SHIFT_ADC_FIFO_RO 0 +#define BIT_MASK_ADC_FIFO_RO 0xffffffffL +#define BIT_ADC_FIFO_RO(x) (((x) & BIT_MASK_ADC_FIFO_RO) << BIT_SHIFT_ADC_FIFO_RO) +#define BIT_CTRL_ADC_FIFO_RO(x) (((x) & BIT_MASK_ADC_FIFO_RO) << BIT_SHIFT_ADC_FIFO_RO) +#define BIT_GET_ADC_FIFO_RO(x) (((x) >> BIT_SHIFT_ADC_FIFO_RO) & BIT_MASK_ADC_FIFO_RO) + + +//2 REG_ADC_CONTROL + +#define BIT_SHIFT_ADC_DBG_SEL 24 +#define BIT_MASK_ADC_DBG_SEL 0x7 +#define BIT_ADC_DBG_SEL(x) (((x) & BIT_MASK_ADC_DBG_SEL) << BIT_SHIFT_ADC_DBG_SEL) +#define BIT_CTRL_ADC_DBG_SEL(x) (((x) & BIT_MASK_ADC_DBG_SEL) << BIT_SHIFT_ADC_DBG_SEL) +#define BIT_GET_ADC_DBG_SEL(x) (((x) >> BIT_SHIFT_ADC_DBG_SEL) & BIT_MASK_ADC_DBG_SEL) + + +#define BIT_SHIFT_ADC_THRESHOLD 16 +#define BIT_MASK_ADC_THRESHOLD 0x3f +#define BIT_ADC_THRESHOLD(x) (((x) & BIT_MASK_ADC_THRESHOLD) << BIT_SHIFT_ADC_THRESHOLD) +#define BIT_CTRL_ADC_THRESHOLD(x) (((x) & BIT_MASK_ADC_THRESHOLD) << BIT_SHIFT_ADC_THRESHOLD) +#define BIT_GET_ADC_THRESHOLD(x) (((x) >> BIT_SHIFT_ADC_THRESHOLD) & BIT_MASK_ADC_THRESHOLD) + + +#define BIT_SHIFT_ADC_BURST_SIZE 8 +#define BIT_MASK_ADC_BURST_SIZE 0x1f +#define BIT_ADC_BURST_SIZE(x) (((x) & BIT_MASK_ADC_BURST_SIZE) << BIT_SHIFT_ADC_BURST_SIZE) +#define BIT_CTRL_ADC_BURST_SIZE(x) (((x) & BIT_MASK_ADC_BURST_SIZE) << BIT_SHIFT_ADC_BURST_SIZE) +#define BIT_GET_ADC_BURST_SIZE(x) (((x) >> BIT_SHIFT_ADC_BURST_SIZE) & BIT_MASK_ADC_BURST_SIZE) + +#define BIT_ADC_ENDIAN BIT(3) +#define BIT_SHIFT_ADC_ENDIAN 3 +#define BIT_MASK_ADC_ENDIAN 0x1 +#define BIT_CTRL_ADC_ENDIAN(x) (((x) & BIT_MASK_ADC_ENDIAN) << BIT_SHIFT_ADC_ENDIAN) + +#define BIT_ADC_OVERWRITE BIT(2) +#define BIT_SHIFT_ADC_OVERWRITE 2 +#define BIT_MASK_ADC_OVERWRITE 0x1 +#define BIT_CTRL_ADC_OVERWRITE(x) (((x) & BIT_MASK_ADC_OVERWRITE) << BIT_SHIFT_ADC_OVERWRITE) + +#define BIT_ADC_ONESHOT BIT(1) +#define BIT_SHIFT_ADC_ONESHOT 1 +#define BIT_MASK_ADC_ONESHOT 0x1 +#define BIT_CTRL_ADC_ONESHOT(x) (((x) & BIT_MASK_ADC_ONESHOT) << BIT_SHIFT_ADC_ONESHOT) + +#define BIT_ADC_COMP_ONLY BIT(0) +#define BIT_SHIFT_ADC_COMP_ONLY 0 +#define BIT_MASK_ADC_COMP_ONLY 0x1 +#define BIT_CTRL_ADC_COMP_ONLY(x) (((x) & BIT_MASK_ADC_COMP_ONLY) << BIT_SHIFT_ADC_COMP_ONLY) + + +//2 REG_ADC_INTR_EN +#define BIT_ADC_AWAKE_CPU_EN BIT(7) +#define BIT_SHIFT_ADC_AWAKE_CPU_EN 7 +#define BIT_MASK_ADC_AWAKE_CPU_EN 0x1 +#define BIT_CTRL_ADC_AWAKE_CPU_EN(x) (((x) & BIT_MASK_ADC_AWAKE_CPU_EN) << BIT_SHIFT_ADC_AWAKE_CPU_EN) + +#define BIT_ADC_FIFO_RD_ERROR_EN BIT(6) +#define BIT_SHIFT_ADC_FIFO_RD_ERROR_EN 6 +#define BIT_MASK_ADC_FIFO_RD_ERROR_EN 0x1 +#define BIT_CTRL_ADC_FIFO_RD_ERROR_EN(x) (((x) & BIT_MASK_ADC_FIFO_RD_ERROR_EN) << BIT_SHIFT_ADC_FIFO_RD_ERROR_EN) + +#define BIT_ADC_FIFO_RD_REQ_EN BIT(5) +#define BIT_SHIFT_ADC_FIFO_RD_REQ_EN 5 +#define BIT_MASK_ADC_FIFO_RD_REQ_EN 0x1 +#define BIT_CTRL_ADC_FIFO_RD_REQ_EN(x) (((x) & BIT_MASK_ADC_FIFO_RD_REQ_EN) << BIT_SHIFT_ADC_FIFO_RD_REQ_EN) + +#define BIT_ADC_FIFO_FULL_EN BIT(4) +#define BIT_SHIFT_ADC_FIFO_FULL_EN 4 +#define BIT_MASK_ADC_FIFO_FULL_EN 0x1 +#define BIT_CTRL_ADC_FIFO_FULL_EN(x) (((x) & BIT_MASK_ADC_FIFO_FULL_EN) << BIT_SHIFT_ADC_FIFO_FULL_EN) + +#define BIT_ADC_COMP_3_EN BIT(3) +#define BIT_SHIFT_ADC_COMP_3_EN 3 +#define BIT_MASK_ADC_COMP_3_EN 0x1 +#define BIT_CTRL_ADC_COMP_3_EN(x) (((x) & BIT_MASK_ADC_COMP_3_EN) << BIT_SHIFT_ADC_COMP_3_EN) + +#define BIT_ADC_COMP_2_EN BIT(2) +#define BIT_SHIFT_ADC_COMP_2_EN 2 +#define BIT_MASK_ADC_COMP_2_EN 0x1 +#define BIT_CTRL_ADC_COMP_2_EN(x) (((x) & BIT_MASK_ADC_COMP_2_EN) << BIT_SHIFT_ADC_COMP_2_EN) + +#define BIT_ADC_COMP_1_EN BIT(1) +#define BIT_SHIFT_ADC_COMP_1_EN 1 +#define BIT_MASK_ADC_COMP_1_EN 0x1 +#define BIT_CTRL_ADC_COMP_1_EN(x) (((x) & BIT_MASK_ADC_COMP_1_EN) << BIT_SHIFT_ADC_COMP_1_EN) + +#define BIT_ADC_COMP_0_EN BIT(0) +#define BIT_SHIFT_ADC_COMP_0_EN 0 +#define BIT_MASK_ADC_COMP_0_EN 0x1 +#define BIT_CTRL_ADC_COMP_0_EN(x) (((x) & BIT_MASK_ADC_COMP_0_EN) << BIT_SHIFT_ADC_COMP_0_EN) + + +//2 REG_ADC_INTR_STS +#define BIT_ADC_FIFO_THRESHOLD BIT(7) +#define BIT_SHIFT_ADC_FIFO_THRESHOLD 7 +#define BIT_MASK_ADC_FIFO_THRESHOLD 0x1 +#define BIT_CTRL_ADC_FIFO_THRESHOLD(x) (((x) & BIT_MASK_ADC_FIFO_THRESHOLD) << BIT_SHIFT_ADC_FIFO_THRESHOLD) + +#define BIT_ADC_FIFO_RD_ERROR_ST BIT(6) +#define BIT_SHIFT_ADC_FIFO_RD_ERROR_ST 6 +#define BIT_MASK_ADC_FIFO_RD_ERROR_ST 0x1 +#define BIT_CTRL_ADC_FIFO_RD_ERROR_ST(x) (((x) & BIT_MASK_ADC_FIFO_RD_ERROR_ST) << BIT_SHIFT_ADC_FIFO_RD_ERROR_ST) + +#define BIT_ADC_FIFO_RD_REQ_ST BIT(5) +#define BIT_SHIFT_ADC_FIFO_RD_REQ_ST 5 +#define BIT_MASK_ADC_FIFO_RD_REQ_ST 0x1 +#define BIT_CTRL_ADC_FIFO_RD_REQ_ST(x) (((x) & BIT_MASK_ADC_FIFO_RD_REQ_ST) << BIT_SHIFT_ADC_FIFO_RD_REQ_ST) + +#define BIT_ADC_FIFO_FULL_ST BIT(4) +#define BIT_SHIFT_ADC_FIFO_FULL_ST 4 +#define BIT_MASK_ADC_FIFO_FULL_ST 0x1 +#define BIT_CTRL_ADC_FIFO_FULL_ST(x) (((x) & BIT_MASK_ADC_FIFO_FULL_ST) << BIT_SHIFT_ADC_FIFO_FULL_ST) + +#define BIT_ADC_COMP_3_ST BIT(3) +#define BIT_SHIFT_ADC_COMP_3_ST 3 +#define BIT_MASK_ADC_COMP_3_ST 0x1 +#define BIT_CTRL_ADC_COMP_3_ST(x) (((x) & BIT_MASK_ADC_COMP_3_ST) << BIT_SHIFT_ADC_COMP_3_ST) + +#define BIT_ADC_COMP_2_ST BIT(2) +#define BIT_SHIFT_ADC_COMP_2_ST 2 +#define BIT_MASK_ADC_COMP_2_ST 0x1 +#define BIT_CTRL_ADC_COMP_2_ST(x) (((x) & BIT_MASK_ADC_COMP_2_ST) << BIT_SHIFT_ADC_COMP_2_ST) + +#define BIT_ADC_COMP_1_ST BIT(1) +#define BIT_SHIFT_ADC_COMP_1_ST 1 +#define BIT_MASK_ADC_COMP_1_ST 0x1 +#define BIT_CTRL_ADC_COMP_1_ST(x) (((x) & BIT_MASK_ADC_COMP_1_ST) << BIT_SHIFT_ADC_COMP_1_ST) + +#define BIT_ADC_COMP_0_ST BIT(0) +#define BIT_SHIFT_ADC_COMP_0_ST 0 +#define BIT_MASK_ADC_COMP_0_ST 0x1 +#define BIT_CTRL_ADC_COMP_0_ST(x) (((x) & BIT_MASK_ADC_COMP_0_ST) << BIT_SHIFT_ADC_COMP_0_ST) + + +//2 REG_ADC_COMP_VALUE_L + +#define BIT_SHIFT_ADC_COMP_TH_1 16 +#define BIT_MASK_ADC_COMP_TH_1 0xffff +#define BIT_ADC_COMP_TH_1(x) (((x) & BIT_MASK_ADC_COMP_TH_1) << BIT_SHIFT_ADC_COMP_TH_1) +#define BIT_CTRL_ADC_COMP_TH_1(x) (((x) & BIT_MASK_ADC_COMP_TH_1) << BIT_SHIFT_ADC_COMP_TH_1) +#define BIT_GET_ADC_COMP_TH_1(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_1) & BIT_MASK_ADC_COMP_TH_1) + + +#define BIT_SHIFT_ADC_COMP_TH_0 0 +#define BIT_MASK_ADC_COMP_TH_0 0xffff +#define BIT_ADC_COMP_TH_0(x) (((x) & BIT_MASK_ADC_COMP_TH_0) << BIT_SHIFT_ADC_COMP_TH_0) +#define BIT_CTRL_ADC_COMP_TH_0(x) (((x) & BIT_MASK_ADC_COMP_TH_0) << BIT_SHIFT_ADC_COMP_TH_0) +#define BIT_GET_ADC_COMP_TH_0(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_0) & BIT_MASK_ADC_COMP_TH_0) + + +//2 REG_ADC_COMP_VALUE_H + +#define BIT_SHIFT_ADC_COMP_TH_3 16 +#define BIT_MASK_ADC_COMP_TH_3 0xffff +#define BIT_ADC_COMP_TH_3(x) (((x) & BIT_MASK_ADC_COMP_TH_3) << BIT_SHIFT_ADC_COMP_TH_3) +#define BIT_CTRL_ADC_COMP_TH_3(x) (((x) & BIT_MASK_ADC_COMP_TH_3) << BIT_SHIFT_ADC_COMP_TH_3) +#define BIT_GET_ADC_COMP_TH_3(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_3) & BIT_MASK_ADC_COMP_TH_3) + + +#define BIT_SHIFT_ADC_COMP_TH_2 0 +#define BIT_MASK_ADC_COMP_TH_2 0xffff +#define BIT_ADC_COMP_TH_2(x) (((x) & BIT_MASK_ADC_COMP_TH_2) << BIT_SHIFT_ADC_COMP_TH_2) +#define BIT_CTRL_ADC_COMP_TH_2(x) (((x) & BIT_MASK_ADC_COMP_TH_2) << BIT_SHIFT_ADC_COMP_TH_2) +#define BIT_GET_ADC_COMP_TH_2(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_2) & BIT_MASK_ADC_COMP_TH_2) + + +//2 REG_ADC_COMP_SET + +#define BIT_SHIFT_ADC_GREATER_THAN 0 +#define BIT_MASK_ADC_GREATER_THAN 0xf +#define BIT_ADC_GREATER_THAN(x) (((x) & BIT_MASK_ADC_GREATER_THAN) << BIT_SHIFT_ADC_GREATER_THAN) +#define BIT_CTRL_ADC_GREATER_THAN(x) (((x) & BIT_MASK_ADC_GREATER_THAN) << BIT_SHIFT_ADC_GREATER_THAN) +#define BIT_GET_ADC_GREATER_THAN(x) (((x) >> BIT_SHIFT_ADC_GREATER_THAN) & BIT_MASK_ADC_GREATER_THAN) + + +//2 REG_ADC_POWER + +#define BIT_SHIFT_ADC_PWR_CUT_CNTR 16 +#define BIT_MASK_ADC_PWR_CUT_CNTR 0xff +#define BIT_ADC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_ADC_PWR_CUT_CNTR) << BIT_SHIFT_ADC_PWR_CUT_CNTR) +#define BIT_CTRL_ADC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_ADC_PWR_CUT_CNTR) << BIT_SHIFT_ADC_PWR_CUT_CNTR) +#define BIT_GET_ADC_PWR_CUT_CNTR(x) (((x) >> BIT_SHIFT_ADC_PWR_CUT_CNTR) & BIT_MASK_ADC_PWR_CUT_CNTR) + +#define BIT_ADC_FIFO_ON_ST BIT(11) +#define BIT_SHIFT_ADC_FIFO_ON_ST 11 +#define BIT_MASK_ADC_FIFO_ON_ST 0x1 +#define BIT_CTRL_ADC_FIFO_ON_ST(x) (((x) & BIT_MASK_ADC_FIFO_ON_ST) << BIT_SHIFT_ADC_FIFO_ON_ST) + +#define BIT_ADC_ISO_ON_ST BIT(10) +#define BIT_SHIFT_ADC_ISO_ON_ST 10 +#define BIT_MASK_ADC_ISO_ON_ST 0x1 +#define BIT_CTRL_ADC_ISO_ON_ST(x) (((x) & BIT_MASK_ADC_ISO_ON_ST) << BIT_SHIFT_ADC_ISO_ON_ST) + +#define BIT_ADC_PWR33_ON_ST BIT(9) +#define BIT_SHIFT_ADC_PWR33_ON_ST 9 +#define BIT_MASK_ADC_PWR33_ON_ST 0x1 +#define BIT_CTRL_ADC_PWR33_ON_ST(x) (((x) & BIT_MASK_ADC_PWR33_ON_ST) << BIT_SHIFT_ADC_PWR33_ON_ST) + +#define BIT_ADC_PWR12_ON_ST BIT(8) +#define BIT_SHIFT_ADC_PWR12_ON_ST 8 +#define BIT_MASK_ADC_PWR12_ON_ST 0x1 +#define BIT_CTRL_ADC_PWR12_ON_ST(x) (((x) & BIT_MASK_ADC_PWR12_ON_ST) << BIT_SHIFT_ADC_PWR12_ON_ST) + +#define BIT_ADC_ISO_MANUAL BIT(3) +#define BIT_SHIFT_ADC_ISO_MANUAL 3 +#define BIT_MASK_ADC_ISO_MANUAL 0x1 +#define BIT_CTRL_ADC_ISO_MANUAL(x) (((x) & BIT_MASK_ADC_ISO_MANUAL) << BIT_SHIFT_ADC_ISO_MANUAL) + +#define BIT_ADC_PWR33_MANUAL BIT(2) +#define BIT_SHIFT_ADC_PWR33_MANUAL 2 +#define BIT_MASK_ADC_PWR33_MANUAL 0x1 +#define BIT_CTRL_ADC_PWR33_MANUAL(x) (((x) & BIT_MASK_ADC_PWR33_MANUAL) << BIT_SHIFT_ADC_PWR33_MANUAL) + +#define BIT_ADC_PWR12_MANUAL BIT(1) +#define BIT_SHIFT_ADC_PWR12_MANUAL 1 +#define BIT_MASK_ADC_PWR12_MANUAL 0x1 +#define BIT_CTRL_ADC_PWR12_MANUAL(x) (((x) & BIT_MASK_ADC_PWR12_MANUAL) << BIT_SHIFT_ADC_PWR12_MANUAL) + +#define BIT_ADC_PWR_AUTO BIT(0) +#define BIT_SHIFT_ADC_PWR_AUTO 0 +#define BIT_MASK_ADC_PWR_AUTO 0x1 +#define BIT_CTRL_ADC_PWR_AUTO(x) (((x) & BIT_MASK_ADC_PWR_AUTO) << BIT_SHIFT_ADC_PWR_AUTO) + + +//2 REG_ADC_ANAPAR_AD0 + +#define BIT_SHIFT_ADC_ANAPAR_AD0 2 +#define BIT_MASK_ADC_ANAPAR_AD0 0x3fffffff +#define BIT_ADC_ANAPAR_AD0(x) (((x) & BIT_MASK_ADC_ANAPAR_AD0) << BIT_SHIFT_ADC_ANAPAR_AD0) +#define BIT_CTRL_ADC_ANAPAR_AD0(x) (((x) & BIT_MASK_ADC_ANAPAR_AD0) << BIT_SHIFT_ADC_ANAPAR_AD0) +#define BIT_GET_ADC_ANAPAR_AD0(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD0) & BIT_MASK_ADC_ANAPAR_AD0) + +#define BIT_ADC_AUDIO_EN BIT(1) +#define BIT_SHIFT_ADC_AUDIO_EN 1 +#define BIT_MASK_ADC_AUDIO_EN 0x1 +#define BIT_CTRL_ADC_AUDIO_EN(x) (((x) & BIT_MASK_ADC_AUDIO_EN) << BIT_SHIFT_ADC_AUDIO_EN) + +#define BIT_ADC_EN_MANUAL BIT(0) +#define BIT_SHIFT_ADC_EN_MANUAL 0 +#define BIT_MASK_ADC_EN_MANUAL 0x1 +#define BIT_CTRL_ADC_EN_MANUAL(x) (((x) & BIT_MASK_ADC_EN_MANUAL) << BIT_SHIFT_ADC_EN_MANUAL) + + +//2 REG_ADC_ANAPAR_AD1 + +#define BIT_SHIFT_ADC_ANAPAR_AD1 0 +#define BIT_MASK_ADC_ANAPAR_AD1 0xffffffffL +#define BIT_ADC_ANAPAR_AD1(x) (((x) & BIT_MASK_ADC_ANAPAR_AD1) << BIT_SHIFT_ADC_ANAPAR_AD1) +#define BIT_CTRL_ADC_ANAPAR_AD1(x) (((x) & BIT_MASK_ADC_ANAPAR_AD1) << BIT_SHIFT_ADC_ANAPAR_AD1) +#define BIT_GET_ADC_ANAPAR_AD1(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD1) & BIT_MASK_ADC_ANAPAR_AD1) + + +//2 REG_ADC_ANAPAR_AD2 + +#define BIT_SHIFT_ADC_ANAPAR_AD2 0 +#define BIT_MASK_ADC_ANAPAR_AD2 0xffffffffL +#define BIT_ADC_ANAPAR_AD2(x) (((x) & BIT_MASK_ADC_ANAPAR_AD2) << BIT_SHIFT_ADC_ANAPAR_AD2) +#define BIT_CTRL_ADC_ANAPAR_AD2(x) (((x) & BIT_MASK_ADC_ANAPAR_AD2) << BIT_SHIFT_ADC_ANAPAR_AD2) +#define BIT_GET_ADC_ANAPAR_AD2(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD2) & BIT_MASK_ADC_ANAPAR_AD2) + + +//2 REG_ADC_ANAPAR_AD3 + +#define BIT_SHIFT_ADC_ANAPAR_AD3 0 +#define BIT_MASK_ADC_ANAPAR_AD3 0xffffffffL +#define BIT_ADC_ANAPAR_AD3(x) (((x) & BIT_MASK_ADC_ANAPAR_AD3) << BIT_SHIFT_ADC_ANAPAR_AD3) +#define BIT_CTRL_ADC_ANAPAR_AD3(x) (((x) & BIT_MASK_ADC_ANAPAR_AD3) << BIT_SHIFT_ADC_ANAPAR_AD3) +#define BIT_GET_ADC_ANAPAR_AD3(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD3) & BIT_MASK_ADC_ANAPAR_AD3) + + +//2 REG_ADC_ANAPAR_AD4 + +#define BIT_SHIFT_ADC_ANAPAR_AD4 0 +#define BIT_MASK_ADC_ANAPAR_AD4 0xffffffffL +#define BIT_ADC_ANAPAR_AD4(x) (((x) & BIT_MASK_ADC_ANAPAR_AD4) << BIT_SHIFT_ADC_ANAPAR_AD4) +#define BIT_CTRL_ADC_ANAPAR_AD4(x) (((x) & BIT_MASK_ADC_ANAPAR_AD4) << BIT_SHIFT_ADC_ANAPAR_AD4) +#define BIT_GET_ADC_ANAPAR_AD4(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD4) & BIT_MASK_ADC_ANAPAR_AD4) + + +//2 REG_ADC_ANAPAR_AD5 + +#define BIT_SHIFT_ADC_ANAPAR_AD5 0 +#define BIT_MASK_ADC_ANAPAR_AD5 0xffffffffL +#define BIT_ADC_ANAPAR_AD5(x) (((x) & BIT_MASK_ADC_ANAPAR_AD5) << BIT_SHIFT_ADC_ANAPAR_AD5) +#define BIT_CTRL_ADC_ANAPAR_AD5(x) (((x) & BIT_MASK_ADC_ANAPAR_AD5) << BIT_SHIFT_ADC_ANAPAR_AD5) +#define BIT_GET_ADC_ANAPAR_AD5(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD5) & BIT_MASK_ADC_ANAPAR_AD5) + + +//2 REG_ADC_CALI_DATA + +#define BIT_SHIFT_ADC_CALI_DATA_6 16 +#define BIT_MASK_ADC_CALI_DATA_6 0xffff +#define BIT_ADC_CALI_DATA_6(x) (((x) & BIT_MASK_ADC_CALI_DATA_6) << BIT_SHIFT_ADC_CALI_DATA_6) +#define BIT_CTRL_ADC_CALI_DATA_6(x) (((x) & BIT_MASK_ADC_CALI_DATA_6) << BIT_SHIFT_ADC_CALI_DATA_6) +#define BIT_GET_ADC_CALI_DATA_6(x) (((x) >> BIT_SHIFT_ADC_CALI_DATA_6) & BIT_MASK_ADC_CALI_DATA_6) + + +#define BIT_SHIFT_ADC_CALI_DATA_0 0 +#define BIT_MASK_ADC_CALI_DATA_0 0xffff +#define BIT_ADC_CALI_DATA_0(x) (((x) & BIT_MASK_ADC_CALI_DATA_0) << BIT_SHIFT_ADC_CALI_DATA_0) +#define BIT_CTRL_ADC_CALI_DATA_0(x) (((x) & BIT_MASK_ADC_CALI_DATA_0) << BIT_SHIFT_ADC_CALI_DATA_0) +#define BIT_GET_ADC_CALI_DATA_0(x) (((x) >> BIT_SHIFT_ADC_CALI_DATA_0) & BIT_MASK_ADC_CALI_DATA_0) + +//================ Register Reg Field ========================= +#define REG_ADC_FIFO_READ 0x0000 +#define REG_ADC_CONTROL 0x0004 +#define REG_ADC_INTR_EN 0x0008 +#define REG_ADC_INTR_STS 0x000C +#define REG_ADC_COMP_VALUE_L 0x0010 +#define REG_ADC_COMP_VALUE_H 0x0014 +#define REG_ADC_COMP_SET 0x0018 +#define REG_ADC_POWER 0x001C +#define REG_ADC_ANAPAR_AD0 0x0020 +#define REG_ADC_ANAPAR_AD1 0x0024 +#define REG_ADC_ANAPAR_AD2 0x0028 +#define REG_ADC_ANAPAR_AD3 0x002C +#define REG_ADC_ANAPAR_AD4 0x0030 +#define REG_ADC_ANAPAR_AD5 0x0034 +#define REG_ADC_CALI_DATA 0x0038 + +//================ ADC HAL related enumeration ================== + +//================ ADC Function Prototypes ===================== +#define HAL_ADC_WRITE32(addr, value) HAL_WRITE32(ADC_REG_BASE,addr,value) +#define HAL_ADC_READ32(addr) HAL_READ32(ADC_REG_BASE,addr) + +RTK_STATUS HalADCInit8195a(IN VOID *Data); +RTK_STATUS HalADCDeInit8195a(IN VOID *Data); +RTK_STATUS HalADCEnableRtl8195a(IN VOID *Data); +RTK_STATUS HalADCIntrCtrl8195a(IN VOID *Data); +u32 HalADCReceiveRtl8195a(IN VOID *Data); +u32 HalADCReadRegRtl8195a(IN VOID *Data,IN u8 I2CReg); + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_dac.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_dac.h new file mode 100644 index 0000000..a00ccce --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_dac.h @@ -0,0 +1,294 @@ +#ifndef _RTL8195A_DAC_H_ +#define _RTL8195A_DAC_H_ + +//================ Register Bit Field ========================== +//2 REG_DAC0_FIFO_WR + +#define BIT_SHIFT_DAC0_FIFO_WO 0 +#define BIT_MASK_DAC0_FIFO_WO 0xffffffffL +#define BIT_DAC0_FIFO_WO(x) (((x) & BIT_MASK_DAC0_FIFO_WO) << BIT_SHIFT_DAC0_FIFO_WO) +#define BIT_CTRL_DAC0_FIFO_WO(x) (((x) & BIT_MASK_DAC0_FIFO_WO) << BIT_SHIFT_DAC0_FIFO_WO) +#define BIT_GET_DAC0_FIFO_WO(x) (((x) >> BIT_SHIFT_DAC0_FIFO_WO) & BIT_MASK_DAC0_FIFO_WO) + + +//2 REG_DAC_CTRL + +#define BIT_SHIFT_DAC_DELTA_SIGMA 25 +#define BIT_MASK_DAC_DELTA_SIGMA 0x7 +#define BIT_DAC_DELTA_SIGMA(x) (((x) & BIT_MASK_DAC_DELTA_SIGMA) << BIT_SHIFT_DAC_DELTA_SIGMA) +#define BIT_CTRL_DAC_DELTA_SIGMA(x) (((x) & BIT_MASK_DAC_DELTA_SIGMA) << BIT_SHIFT_DAC_DELTA_SIGMA) +#define BIT_GET_DAC_DELTA_SIGMA(x) (((x) >> BIT_SHIFT_DAC_DELTA_SIGMA) & BIT_MASK_DAC_DELTA_SIGMA) + +#define BIT_DAC_BYPASS_DSC BIT(24) +#define BIT_SHIFT_DAC_BYPASS_DSC 24 +#define BIT_MASK_DAC_BYPASS_DSC 0x1 +#define BIT_CTRL_DAC_BYPASS_DSC(x) (((x) & BIT_MASK_DAC_BYPASS_DSC) << BIT_SHIFT_DAC_BYPASS_DSC) + + +#define BIT_SHIFT_DAC_DSC_DBG_SEL 19 +#define BIT_MASK_DAC_DSC_DBG_SEL 0x3 +#define BIT_DAC_DSC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DSC_DBG_SEL) << BIT_SHIFT_DAC_DSC_DBG_SEL) +#define BIT_CTRL_DAC_DSC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DSC_DBG_SEL) << BIT_SHIFT_DAC_DSC_DBG_SEL) +#define BIT_GET_DAC_DSC_DBG_SEL(x) (((x) >> BIT_SHIFT_DAC_DSC_DBG_SEL) & BIT_MASK_DAC_DSC_DBG_SEL) + + +#define BIT_SHIFT_DAC_DBG_SEL 16 +#define BIT_MASK_DAC_DBG_SEL 0x7 +#define BIT_DAC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DBG_SEL) << BIT_SHIFT_DAC_DBG_SEL) +#define BIT_CTRL_DAC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DBG_SEL) << BIT_SHIFT_DAC_DBG_SEL) +#define BIT_GET_DAC_DBG_SEL(x) (((x) >> BIT_SHIFT_DAC_DBG_SEL) & BIT_MASK_DAC_DBG_SEL) + + +#define BIT_SHIFT_DAC_BURST_SIZE 8 +#define BIT_MASK_DAC_BURST_SIZE 0xf +#define BIT_DAC_BURST_SIZE(x) (((x) & BIT_MASK_DAC_BURST_SIZE) << BIT_SHIFT_DAC_BURST_SIZE) +#define BIT_CTRL_DAC_BURST_SIZE(x) (((x) & BIT_MASK_DAC_BURST_SIZE) << BIT_SHIFT_DAC_BURST_SIZE) +#define BIT_GET_DAC_BURST_SIZE(x) (((x) >> BIT_SHIFT_DAC_BURST_SIZE) & BIT_MASK_DAC_BURST_SIZE) + +#define BIT_DAC_FILTER_SETTLE BIT(4) +#define BIT_SHIFT_DAC_FILTER_SETTLE 4 +#define BIT_MASK_DAC_FILTER_SETTLE 0x1 +#define BIT_CTRL_DAC_FILTER_SETTLE(x) (((x) & BIT_MASK_DAC_FILTER_SETTLE) << BIT_SHIFT_DAC_FILTER_SETTLE) + +#define BIT_DAC_OV_OPTION BIT(3) +#define BIT_SHIFT_DAC_OV_OPTION 3 +#define BIT_MASK_DAC_OV_OPTION 0x1 +#define BIT_CTRL_DAC_OV_OPTION(x) (((x) & BIT_MASK_DAC_OV_OPTION) << BIT_SHIFT_DAC_OV_OPTION) + +#define BIT_DAC_ENDIAN BIT(2) +#define BIT_SHIFT_DAC_ENDIAN 2 +#define BIT_MASK_DAC_ENDIAN 0x1 +#define BIT_CTRL_DAC_ENDIAN(x) (((x) & BIT_MASK_DAC_ENDIAN) << BIT_SHIFT_DAC_ENDIAN) + +#define BIT_DAC_SPEED BIT(1) +#define BIT_SHIFT_DAC_SPEED 1 +#define BIT_MASK_DAC_SPEED 0x1 +#define BIT_CTRL_DAC_SPEED(x) (((x) & BIT_MASK_DAC_SPEED) << BIT_SHIFT_DAC_SPEED) + +#define BIT_DAC_FIFO_EN BIT(0) +#define BIT_SHIFT_DAC_FIFO_EN 0 +#define BIT_MASK_DAC_FIFO_EN 0x1 +#define BIT_CTRL_DAC_FIFO_EN(x) (((x) & BIT_MASK_DAC_FIFO_EN) << BIT_SHIFT_DAC_FIFO_EN) + + +//2 REG_DAC_INTR_CTRL +#define BIT_DAC_DSC_OVERFLOW1_EN BIT(6) +#define BIT_SHIFT_DAC_DSC_OVERFLOW1_EN 6 +#define BIT_MASK_DAC_DSC_OVERFLOW1_EN 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW1_EN(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW1_EN) << BIT_SHIFT_DAC_DSC_OVERFLOW1_EN) + +#define BIT_DAC_DSC_OVERFLOW0_EN BIT(5) +#define BIT_SHIFT_DAC_DSC_OVERFLOW0_EN 5 +#define BIT_MASK_DAC_DSC_OVERFLOW0_EN 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW0_EN(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW0_EN) << BIT_SHIFT_DAC_DSC_OVERFLOW0_EN) + +#define BIT_DAC__WRITE_ERROR_EN BIT(4) +#define BIT_SHIFT_DAC__WRITE_ERROR_EN 4 +#define BIT_MASK_DAC__WRITE_ERROR_EN 0x1 +#define BIT_CTRL_DAC__WRITE_ERROR_EN(x) (((x) & BIT_MASK_DAC__WRITE_ERROR_EN) << BIT_SHIFT_DAC__WRITE_ERROR_EN) + +#define BIT_DAC_FIFO_STOP_EN BIT(3) +#define BIT_SHIFT_DAC_FIFO_STOP_EN 3 +#define BIT_MASK_DAC_FIFO_STOP_EN 0x1 +#define BIT_CTRL_DAC_FIFO_STOP_EN(x) (((x) & BIT_MASK_DAC_FIFO_STOP_EN) << BIT_SHIFT_DAC_FIFO_STOP_EN) + +#define BIT_DAC_FIFO_OVERFLOW_EN BIT(2) +#define BIT_SHIFT_DAC_FIFO_OVERFLOW_EN 2 +#define BIT_MASK_DAC_FIFO_OVERFLOW_EN 0x1 +#define BIT_CTRL_DAC_FIFO_OVERFLOW_EN(x) (((x) & BIT_MASK_DAC_FIFO_OVERFLOW_EN) << BIT_SHIFT_DAC_FIFO_OVERFLOW_EN) + +#define BIT_DAC_FIFO_WR_REQ_EN BIT(1) +#define BIT_SHIFT_DAC_FIFO_WR_REQ_EN 1 +#define BIT_MASK_DAC_FIFO_WR_REQ_EN 0x1 +#define BIT_CTRL_DAC_FIFO_WR_REQ_EN(x) (((x) & BIT_MASK_DAC_FIFO_WR_REQ_EN) << BIT_SHIFT_DAC_FIFO_WR_REQ_EN) + +#define BIT_DAC_FIFO_FULL_EN BIT(0) +#define BIT_SHIFT_DAC_FIFO_FULL_EN 0 +#define BIT_MASK_DAC_FIFO_FULL_EN 0x1 +#define BIT_CTRL_DAC_FIFO_FULL_EN(x) (((x) & BIT_MASK_DAC_FIFO_FULL_EN) << BIT_SHIFT_DAC_FIFO_FULL_EN) + + +//2 REG_DAC_INTR_STS +#define BIT_DAC_DSC_OVERFLOW1_ST BIT(6) +#define BIT_SHIFT_DAC_DSC_OVERFLOW1_ST 6 +#define BIT_MASK_DAC_DSC_OVERFLOW1_ST 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW1_ST(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW1_ST) << BIT_SHIFT_DAC_DSC_OVERFLOW1_ST) + +#define BIT_DAC_DSC_OVERFLOW0_ST BIT(5) +#define BIT_SHIFT_DAC_DSC_OVERFLOW0_ST 5 +#define BIT_MASK_DAC_DSC_OVERFLOW0_ST 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW0_ST(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW0_ST) << BIT_SHIFT_DAC_DSC_OVERFLOW0_ST) + +#define BIT_DAC__WRITE_ERROR_ST BIT(4) +#define BIT_SHIFT_DAC__WRITE_ERROR_ST 4 +#define BIT_MASK_DAC__WRITE_ERROR_ST 0x1 +#define BIT_CTRL_DAC__WRITE_ERROR_ST(x) (((x) & BIT_MASK_DAC__WRITE_ERROR_ST) << BIT_SHIFT_DAC__WRITE_ERROR_ST) + +#define BIT_DAC_FIFO_STOP_ST BIT(3) +#define BIT_SHIFT_DAC_FIFO_STOP_ST 3 +#define BIT_MASK_DAC_FIFO_STOP_ST 0x1 +#define BIT_CTRL_DAC_FIFO_STOP_ST(x) (((x) & BIT_MASK_DAC_FIFO_STOP_ST) << BIT_SHIFT_DAC_FIFO_STOP_ST) + +#define BIT_DAC_FIFO_OVERFLOW_ST BIT(2) +#define BIT_SHIFT_DAC_FIFO_OVERFLOW_ST 2 +#define BIT_MASK_DAC_FIFO_OVERFLOW_ST 0x1 +#define BIT_CTRL_DAC_FIFO_OVERFLOW_ST(x) (((x) & BIT_MASK_DAC_FIFO_OVERFLOW_ST) << BIT_SHIFT_DAC_FIFO_OVERFLOW_ST) + +#define BIT_DAC_FIFO_WR_REQ_ST BIT(1) +#define BIT_SHIFT_DAC_FIFO_WR_REQ_ST 1 +#define BIT_MASK_DAC_FIFO_WR_REQ_ST 0x1 +#define BIT_CTRL_DAC_FIFO_WR_REQ_ST(x) (((x) & BIT_MASK_DAC_FIFO_WR_REQ_ST) << BIT_SHIFT_DAC_FIFO_WR_REQ_ST) + +#define BIT_DAC_FIFO_FULL_ST BIT(0) +#define BIT_SHIFT_DAC_FIFO_FULL_ST 0 +#define BIT_MASK_DAC_FIFO_FULL_ST 0x1 +#define BIT_CTRL_DAC_FIFO_FULL_ST(x) (((x) & BIT_MASK_DAC_FIFO_FULL_ST) << BIT_SHIFT_DAC_FIFO_FULL_ST) + + +//2 REG_DAC_PWR_CTRL + +#define BIT_SHIFT_DAC_PWR_CUT_CNTR 16 +#define BIT_MASK_DAC_PWR_CUT_CNTR 0xff +#define BIT_DAC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_DAC_PWR_CUT_CNTR) << BIT_SHIFT_DAC_PWR_CUT_CNTR) +#define BIT_CTRL_DAC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_DAC_PWR_CUT_CNTR) << BIT_SHIFT_DAC_PWR_CUT_CNTR) +#define BIT_GET_DAC_PWR_CUT_CNTR(x) (((x) >> BIT_SHIFT_DAC_PWR_CUT_CNTR) & BIT_MASK_DAC_PWR_CUT_CNTR) + +#define BIT_ST_DAC_FIFO_ON BIT(11) +#define BIT_SHIFT_ST_DAC_FIFO_ON 11 +#define BIT_MASK_ST_DAC_FIFO_ON 0x1 +#define BIT_CTRL_ST_DAC_FIFO_ON(x) (((x) & BIT_MASK_ST_DAC_FIFO_ON) << BIT_SHIFT_ST_DAC_FIFO_ON) + +#define BIT_ST_DAC_ISO_ON BIT(10) +#define BIT_SHIFT_ST_DAC_ISO_ON 10 +#define BIT_MASK_ST_DAC_ISO_ON 0x1 +#define BIT_CTRL_ST_DAC_ISO_ON(x) (((x) & BIT_MASK_ST_DAC_ISO_ON) << BIT_SHIFT_ST_DAC_ISO_ON) + +#define BIT_ST_DAC_PWR33_ON BIT(9) +#define BIT_SHIFT_ST_DAC_PWR33_ON 9 +#define BIT_MASK_ST_DAC_PWR33_ON 0x1 +#define BIT_CTRL_ST_DAC_PWR33_ON(x) (((x) & BIT_MASK_ST_DAC_PWR33_ON) << BIT_SHIFT_ST_DAC_PWR33_ON) + +#define BIT_ST_DAC_PWR12_ON BIT(8) +#define BIT_SHIFT_ST_DAC_PWR12_ON 8 +#define BIT_MASK_ST_DAC_PWR12_ON 0x1 +#define BIT_CTRL_ST_DAC_PWR12_ON(x) (((x) & BIT_MASK_ST_DAC_PWR12_ON) << BIT_SHIFT_ST_DAC_PWR12_ON) + +#define BIT_DAC_ISO_MANU BIT(3) +#define BIT_SHIFT_DAC_ISO_MANU 3 +#define BIT_MASK_DAC_ISO_MANU 0x1 +#define BIT_CTRL_DAC_ISO_MANU(x) (((x) & BIT_MASK_DAC_ISO_MANU) << BIT_SHIFT_DAC_ISO_MANU) + +#define BIT_DAC_PWR33_MANU BIT(2) +#define BIT_SHIFT_DAC_PWR33_MANU 2 +#define BIT_MASK_DAC_PWR33_MANU 0x1 +#define BIT_CTRL_DAC_PWR33_MANU(x) (((x) & BIT_MASK_DAC_PWR33_MANU) << BIT_SHIFT_DAC_PWR33_MANU) + +#define BIT_DAC_PWR12_MANU BIT(1) +#define BIT_SHIFT_DAC_PWR12_MANU 1 +#define BIT_MASK_DAC_PWR12_MANU 0x1 +#define BIT_CTRL_DAC_PWR12_MANU(x) (((x) & BIT_MASK_DAC_PWR12_MANU) << BIT_SHIFT_DAC_PWR12_MANU) + +#define BIT_DAC_PWR_AUTO BIT(0) +#define BIT_SHIFT_DAC_PWR_AUTO 0 +#define BIT_MASK_DAC_PWR_AUTO 0x1 +#define BIT_CTRL_DAC_PWR_AUTO(x) (((x) & BIT_MASK_DAC_PWR_AUTO) << BIT_SHIFT_DAC_PWR_AUTO) + + +//2 REG_DAC_ANAPAR_DA0 + +#define BIT_SHIFT_PWR_ALL_CNTR 12 +#define BIT_MASK_PWR_ALL_CNTR 0xfffff +#define BIT_PWR_ALL_CNTR(x) (((x) & BIT_MASK_PWR_ALL_CNTR) << BIT_SHIFT_PWR_ALL_CNTR) +#define BIT_CTRL_PWR_ALL_CNTR(x) (((x) & BIT_MASK_PWR_ALL_CNTR) << BIT_SHIFT_PWR_ALL_CNTR) +#define BIT_GET_PWR_ALL_CNTR(x) (((x) >> BIT_SHIFT_PWR_ALL_CNTR) & BIT_MASK_PWR_ALL_CNTR) + + +#define BIT_SHIFT_PWR_FUP_CNTR 0 +#define BIT_MASK_PWR_FUP_CNTR 0xfff +#define BIT_PWR_FUP_CNTR(x) (((x) & BIT_MASK_PWR_FUP_CNTR) << BIT_SHIFT_PWR_FUP_CNTR) +#define BIT_CTRL_PWR_FUP_CNTR(x) (((x) & BIT_MASK_PWR_FUP_CNTR) << BIT_SHIFT_PWR_FUP_CNTR) +#define BIT_GET_PWR_FUP_CNTR(x) (((x) >> BIT_SHIFT_PWR_FUP_CNTR) & BIT_MASK_PWR_FUP_CNTR) + + +//2 REG_DAC_ANAPAR_DA1 +#define BIT_FUP_EN BIT(31) +#define BIT_SHIFT_FUP_EN 31 +#define BIT_MASK_FUP_EN 0x1 +#define BIT_CTRL_FUP_EN(x) (((x) & BIT_MASK_FUP_EN) << BIT_SHIFT_FUP_EN) + + +#define BIT_SHIFT_ANAPAR_DA 8 +#define BIT_MASK_ANAPAR_DA 0x7fffff +#define BIT_ANAPAR_DA(x) (((x) & BIT_MASK_ANAPAR_DA) << BIT_SHIFT_ANAPAR_DA) +#define BIT_CTRL_ANAPAR_DA(x) (((x) & BIT_MASK_ANAPAR_DA) << BIT_SHIFT_ANAPAR_DA) +#define BIT_GET_ANAPAR_DA(x) (((x) >> BIT_SHIFT_ANAPAR_DA) & BIT_MASK_ANAPAR_DA) + +#define BIT_D_POW_DACVREF BIT(7) +#define BIT_SHIFT_D_POW_DACVREF 7 +#define BIT_MASK_D_POW_DACVREF 0x1 +#define BIT_CTRL_D_POW_DACVREF(x) (((x) & BIT_MASK_D_POW_DACVREF) << BIT_SHIFT_D_POW_DACVREF) + +#define BIT_D_POW_VREF2 BIT(6) +#define BIT_SHIFT_D_POW_VREF2 6 +#define BIT_MASK_D_POW_VREF2 0x1 +#define BIT_CTRL_D_POW_VREF2(x) (((x) & BIT_MASK_D_POW_VREF2) << BIT_SHIFT_D_POW_VREF2) + +#define BIT_D_POW_MBIAS BIT(5) +#define BIT_SHIFT_D_POW_MBIAS 5 +#define BIT_MASK_D_POW_MBIAS 0x1 +#define BIT_CTRL_D_POW_MBIAS(x) (((x) & BIT_MASK_D_POW_MBIAS) << BIT_SHIFT_D_POW_MBIAS) + +#define BIT_D_POW_DIV4 BIT(4) +#define BIT_SHIFT_D_POW_DIV4 4 +#define BIT_MASK_D_POW_DIV4 0x1 +#define BIT_CTRL_D_POW_DIV4(x) (((x) & BIT_MASK_D_POW_DIV4) << BIT_SHIFT_D_POW_DIV4) + +#define BIT_D_POW_DF1SE_R BIT(3) +#define BIT_SHIFT_D_POW_DF1SE_R 3 +#define BIT_MASK_D_POW_DF1SE_R 0x1 +#define BIT_CTRL_D_POW_DF1SE_R(x) (((x) & BIT_MASK_D_POW_DF1SE_R) << BIT_SHIFT_D_POW_DF1SE_R) + +#define BIT_D_POW_DF2SE_L BIT(2) +#define BIT_SHIFT_D_POW_DF2SE_L 2 +#define BIT_MASK_D_POW_DF2SE_L 0x1 +#define BIT_CTRL_D_POW_DF2SE_L(x) (((x) & BIT_MASK_D_POW_DF2SE_L) << BIT_SHIFT_D_POW_DF2SE_L) + +#define BIT_D_POW_DAC_R BIT(1) +#define BIT_SHIFT_D_POW_DAC_R 1 +#define BIT_MASK_D_POW_DAC_R 0x1 +#define BIT_CTRL_D_POW_DAC_R(x) (((x) & BIT_MASK_D_POW_DAC_R) << BIT_SHIFT_D_POW_DAC_R) + +#define BIT_D_POW_DAC_L BIT(0) +#define BIT_SHIFT_D_POW_DAC_L 0 +#define BIT_MASK_D_POW_DAC_L 0x1 +#define BIT_CTRL_D_POW_DAC_L(x) (((x) & BIT_MASK_D_POW_DAC_L) << BIT_SHIFT_D_POW_DAC_L) + + +//================ Register Reg Field ========================= +#define REG_DAC0_FIFO_WR 0x0000 +#define REG_DAC_CTRL 0x0004 +#define REG_DAC_INTR_CTRL 0x0008 +#define REG_DAC_INTR_STS 0x000C +#define REG_DAC_PWR_CTRL 0x0010 +#define REG_DAC_ANAPAR_DA0 0x0014 +#define REG_DAC_ANAPAR_DA1 0x0018 + + +//================ DAC HAL related enumeration ================== + + +//================ DAC HAL Macro =========================== +#define HAL_DAC_WRITE32(dacidx, addr, value) HAL_WRITE32(DAC_REG_BASE+dacidx*0x800 \ + ,addr,value) +#define HAL_DAC_READ32(dacidx, addr) HAL_READ32(DAC_REG_BASE+dacidx*0x800,addr) + + +//================ DAC Function Prototypes ===================== +RTK_STATUS HalDACInit8195a(IN VOID *Data); +RTK_STATUS HalDACDeInit8195a(IN VOID *Data); +RTK_STATUS HalDACEnableRtl8195a(IN VOID *Data); +RTK_STATUS HalDACIntrCtrl8195a(IN VOID *Data); +u8 HalDACSendRtl8195a(IN VOID *Data); +u32 HalDACReadRegRtl8195a(IN VOID *Data,IN u8 I2CReg); + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gdma.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gdma.h new file mode 100644 index 0000000..515855f --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gdma.h @@ -0,0 +1,462 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_GDMA_H_ +#define _RTL8195A_GDMA_H_ + + +#define HAL_GDMAX_READ32(GdmaIndex, addr) \ + HAL_READ32(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr) +#define HAL_GDMAX_WRITE32(GdmaIndex, addr, value) \ + HAL_WRITE32((GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF)), addr, value) +#define HAL_GDMAX_READ16(GdmaIndex, addr) \ + HAL_READ16(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr) +#define HAL_GDMAX_WRITE16(GdmaIndex, addr, value) \ + HAL_WRITE16(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr, value) +#define HAL_GDMAX_READ8(GdmaIndex, addr) \ + HAL_READ8(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr) +#define HAL_GDMAX_WRITE8(GdmaIndex, addr, value) \ + HAL_WRITE8(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr, value) + + +#define GDMA_CH_MAX 0x06 + +#define REG_GDMA_CH_OFF 0x058 +#define REG_GDMA_CH_SAR 0x000 +#define REG_GDMA_CH_DAR 0x008 +#define REG_GDMA_CH_LLP 0x010 +#define REG_GDMA_CH_CTL 0x018 +#define REG_GDMA_CH_SSTAT 0x020 +#define REG_GDMA_CH_DSTAT 0x028 +#define REG_GDMA_CH_SSTATAR 0x030 +#define REG_GDMA_CH_DSTATAR 0x038 +#define REG_GDMA_CH_CFG 0x040 +#define REG_GDMA_CH_SGR 0x048 +#define REG_GDMA_CH_DSR 0x050 + +//3 Interrupt Registers +#define REG_GDMA_RAW_INT_BASE 0x2C0 +#define REG_GDMA_RAW_INT_TFR 0x2C0 +#define REG_GDMA_RAW_INT_BLOCK 0x2c8 +#define REG_GDMA_RAW_INT_SRC_TRAN 0x2D0 +#define REG_GDMA_RAW_INT_DST_TRAN 0x2D8 +#define REG_GDMA_RAW_INT_ERR 0x2E0 + +#define REG_GDMA_STATUS_INT_BASE 0x2E8 +#define REG_GDMA_STATUS_INT_TFR 0x2E8 +#define REG_GDMA_STATUS_INT_BLOCK 0x2F0 +#define REG_GDMA_STATUS_INT_SRC_TRAN 0x2F8 +#define REG_GDMA_STATUS_INT_DST_TRAN 0x300 +#define REG_GDMA_STATUS_INT_ERR 0x308 + +#define REG_GDMA_MASK_INT_BASE 0x310 +#define REG_GDMA_MASK_INT_TFR 0x310 +#define REG_GDMA_MASK_INT_BLOCK 0x318 +#define REG_GDMA_MASK_INT_SRC_TRAN 0x320 +#define REG_GDMA_MASK_INT_DST_TRAN 0x328 +#define REG_GDMA_MASK_INT_INT_ERR 0x330 + +#define REG_GDMA_CLEAR_INT_BASE 0x338 +#define REG_GDMA_CLEAR_INT_TFR 0x338 +#define REG_GDMA_CLEAR_INT_BLOCK 0x340 +#define REG_GDMA_CLEAR_INT_SRC_TRAN 0x348 +#define REG_GDMA_CLEAR_INT_DST_TRAN 0x350 +#define REG_GDMA_CLEAR_INT_ERR 0x358 +#define REG_GDMA_STATUS_INT 0x360 + +//3 Software handshaking Registers +#define REG_GDMA_REQ_SRC 0x368 +#define REG_GDMA_REQ_DST 0x370 +#define REG_GDMA_REQ_SGL_REQ 0x378 +#define REG_GDMA_REQ_DST_REQ 0x380 +#define REG_GDMA_REQ_LST_SRC 0x388 +#define REG_GDMA_REQ_LST_DST 0x390 + +//3 Miscellaneous Registers +#define REG_GDMA_DMAC_CFG 0x398 +#define REG_GDMA_CH_EN 0x3A0 +#define REG_GDMA_DMA_ID 0x3A8 +#define REG_GDMA_DMA_TEST 0x3B0 +#define REG_GDMA_DMA_COM_PARAMS6 0x3C8 +#define REG_GDMA_DMA_COM_PARAMS5 0x3D0 +#define REG_GDMA_DMA_COM_PARAMS4 0x3D8 +#define REG_GDMA_DMA_COM_PARAMS3 0x3E0 +#define REG_GDMA_DMA_COM_PARAMS2 0x3E8 +#define REG_GDMA_DMA_COM_PARAMS1 0x3F0 +#define REG_GDMA_DMA_COM_PARAMS0 0x3F8 + +//3 CTL Register Bit Control +#define BIT_SHIFT_CTLX_LO_INT_EN 0 +#define BIT_MASK_CTLX_LO_INT_EN 0x1 +#define BIT_CTLX_LO_INT_EN(x)(((x) & BIT_MASK_CTLX_LO_INT_EN) << BIT_SHIFT_CTLX_LO_INT_EN) +#define BIT_INVC_CTLX_LO_INT_EN (~(BIT_MASK_CTLX_LO_INT_EN << BIT_SHIFT_CTLX_LO_INT_EN)) + +#define BIT_SHIFT_CTLX_LO_DST_TR_WIDTH 1 +#define BIT_MASK_CTLX_LO_DST_TR_WIDTH 0x7 +#define BIT_CTLX_LO_DST_TR_WIDTH(x) (((x) & BIT_MASK_CTLX_LO_DST_TR_WIDTH) << BIT_SHIFT_CTLX_LO_DST_TR_WIDTH) +#define BIT_INVC_CTLX_LO_DST_TR_WIDTH (~(BIT_MASK_CTLX_LO_DST_TR_WIDTH << BIT_SHIFT_CTLX_LO_DST_TR_WIDTH)) + +#define BIT_SHIFT_CTLX_LO_SRC_TR_WIDTH 4 +#define BIT_MASK_CTLX_LO_SRC_TR_WIDTH 0x7 +#define BIT_CTLX_LO_SRC_TR_WIDTH(x) (((x) & BIT_MASK_CTLX_LO_SRC_TR_WIDTH) << BIT_SHIFT_CTLX_LO_SRC_TR_WIDTH) +#define BIT_INVC_CTLX_LO_SRC_TR_WIDTH (~(BIT_MASK_CTLX_LO_SRC_TR_WIDTH << BIT_SHIFT_CTLX_LO_SRC_TR_WIDTH)) + +#define BIT_SHIFT_CTLX_LO_DINC 7 +#define BIT_MASK_CTLX_LO_DINC 0x3 +#define BIT_CTLX_LO_DINC(x)(((x) & BIT_MASK_CTLX_LO_DINC) << BIT_SHIFT_CTLX_LO_DINC) +#define BIT_INVC_CTLX_LO_DINC (~(BIT_MASK_CTLX_LO_DINC << BIT_SHIFT_CTLX_LO_DINC)) + +#define BIT_SHIFT_CTLX_LO_SINC 9 +#define BIT_MASK_CTLX_LO_SINC 0x3 +#define BIT_CTLX_LO_SINC(x)(((x) & BIT_MASK_CTLX_LO_SINC) << BIT_SHIFT_CTLX_LO_SINC) +#define BIT_INVC_CTLX_LO_SINC (~(BIT_MASK_CTLX_LO_SINC << BIT_SHIFT_CTLX_LO_SINC)) + +#define BIT_SHIFT_CTLX_LO_DEST_MSIZE 11 +#define BIT_MASK_CTLX_LO_DEST_MSIZE 0x7 +#define BIT_CTLX_LO_DEST_MSIZE(x)(((x) & BIT_MASK_CTLX_LO_DEST_MSIZE) << BIT_SHIFT_CTLX_LO_DEST_MSIZE) +#define BIT_INVC_CTLX_LO_DEST_MSIZE (~(BIT_MASK_CTLX_LO_DEST_MSIZE << BIT_SHIFT_CTLX_LO_DEST_MSIZE)) + +#define BIT_SHIFT_CTLX_LO_SRC_MSIZE 14 +#define BIT_MASK_CTLX_LO_SRC_MSIZE 0x7 +#define BIT_CTLX_LO_SRC_MSIZE(x)(((x) & BIT_MASK_CTLX_LO_SRC_MSIZE) << BIT_SHIFT_CTLX_LO_SRC_MSIZE) +#define BIT_INVC_CTLX_LO_SRC_MSIZE (~(BIT_MASK_CTLX_LO_SRC_MSIZE << BIT_SHIFT_CTLX_LO_SRC_MSIZE)) + + +#define BIT_SHIFT_CTLX_LO_SRC_GATHER_EN 17 +#define BIT_MASK_CTLX_LO_SRC_GATHER_EN 0x1 +#define BIT_CTLX_LO_SRC_GATHER_EN(x)(((x) & BIT_MASK_CTLX_LO_SRC_GATHER_EN) << BIT_SHIFT_CTLX_LO_SRC_GATHER_EN) +#define BIT_INVC_CTLX_LO_SRC_GATHER_EN (~(BIT_MASK_CTLX_LO_SRC_GATHER_EN << BIT_SHIFT_CTLX_LO_SRC_GATHER_EN)) + + +#define BIT_SHIFT_CTLX_LO_DST_SCATTER_EN 18 +#define BIT_MASK_CTLX_LO_DST_SCATTER_EN 0x1 +#define BIT_CTLX_LO_DST_SCATTER_EN(x)(((x) & BIT_MASK_CTLX_LO_DST_SCATTER_EN) << BIT_SHIFT_CTLX_LO_DST_SCATTER_EN) +#define BIT_INVC_CTLX_LO_DST_SCATTER_EN (~(BIT_MASK_CTLX_LO_DST_SCATTER_EN << BIT_SHIFT_CTLX_LO_DST_SCATTER_EN)) + + +#define BIT_SHIFT_CTLX_LO_TT_FC 20 +#define BIT_MASK_CTLX_LO_TT_FC 0x7 +#define BIT_CTLX_LO_TT_FC(x)(((x) & BIT_MASK_CTLX_LO_TT_FC) << BIT_SHIFT_CTLX_LO_TT_FC) +#define BIT_INVC_CTLX_LO_TT_FC (~(BIT_MASK_CTLX_LO_TT_FC << BIT_SHIFT_CTLX_LO_TT_FC)) + + +#define BIT_SHIFT_CTLX_LO_DMS 23 +#define BIT_MASK_CTLX_LO_DMS 0x3 +#define BIT_CTLX_LO_DMS(x)(((x) & BIT_MASK_CTLX_LO_DMS) << BIT_MASK_CTLX_LO_DMS) +#define BIT_INVC_CTLX_LO_DMS (~(BIT_MASK_CTLX_LO_DMS << BIT_SHIFT_CTLX_LO_DMS)) + + +#define BIT_SHIFT_CTLX_LO_SMS 25 +#define BIT_MASK_CTLX_LO_SMS 0x3 +#define BIT_CTLX_LO_SMS(x)(((x) & BIT_MASK_CTLX_LO_SMS) << BIT_SHIFT_CTLX_LO_SMS) +#define BIT_INVC_CTLX_LO_SMS (~(BIT_MASK_CTLX_LO_SMS << BIT_SHIFT_CTLX_LO_SMS)) + + +#define BIT_SHIFT_CTLX_LO_LLP_DST_EN 27 +#define BIT_MASK_CTLX_LO_LLP_DST_EN 0x1 +#define BIT_CTLX_LO_LLP_DST_EN(x)(((x) & BIT_MASK_CTLX_LO_LLP_DST_EN) << BIT_SHIFT_CTLX_LO_LLP_DST_EN) +#define BIT_INVC_CTLX_LO_LLP_DST_EN (~(BIT_MASK_CTLX_LO_LLP_DST_EN << BIT_SHIFT_CTLX_LO_LLP_DST_EN)) + +#define BIT_SHIFT_CTLX_LO_LLP_SRC_EN 28 +#define BIT_MASK_CTLX_LO_LLP_SRC_EN 0x1 +#define BIT_CTLX_LO_LLP_SRC_EN(x)(((x) & BIT_MASK_CTLX_LO_LLP_SRC_EN) << BIT_SHIFT_CTLX_LO_LLP_SRC_EN) +#define BIT_INVC_CTLX_LO_LLP_SRC_EN (~(BIT_MASK_CTLX_LO_LLP_SRC_EN << BIT_SHIFT_CTLX_LO_LLP_SRC_EN)) + + +#define BIT_SHIFT_CTLX_UP_BLOCK_BS 0 +#define BIT_MASK_CTLX_UP_BLOCK_BS 0xFFF +#define BIT_CTLX_UP_BLOCK_BS(x)(((x) & BIT_MASK_CTLX_UP_BLOCK_BS) << BIT_SHIFT_CTLX_UP_BLOCK_BS) +#define BIT_INVC_CTLX_UP_BLOCK_BS (~(BIT_MASK_CTLX_UP_BLOCK_BS << BIT_SHIFT_CTLX_UP_BLOCK_BS)) + + +#define BIT_SHIFT_CTLX_UP_DONE 12 +#define BIT_MASK_CTLX_UP_DONE 0x1 +#define BIT_CTLX_UP_DONE(x)(((x) & BIT_MASK_CTLX_UP_DONE) << BIT_SHIFT_CTLX_UP_DONE) +#define BIT_INVC_CTLX_UP_DONE (~(BIT_MASK_CTLX_UP_DONE << BIT_SHIFT_CTLX_UP_DONE)) + + +//3 CFG Register Bit Control +#define BIT_SHIFT_CFGX_LO_CH_PRIOR 5 +#define BIT_MASK_CFGX_LO_CH_PRIOR 0x7 +#define BIT_CFGX_LO_CH_PRIOR(x)(((x) & BIT_MASK_CFGX_LO_CH_PRIOR) << BIT_SHIFT_CFGX_LO_CH_PRIOR) +#define BIT_INVC_CFGX_LO_CH_PRIOR (~(BIT_MASK_CFGX_LO_CH_PRIOR << BIT_SHIFT_CFGX_LO_CH_PRIOR)) + + +#define BIT_SHIFT_CFGX_LO_CH_SUSP 8 +#define BIT_MASK_CFGX_LO_CH_SUSP 0x1 +#define BIT_CFGX_LO_CH_SUSP(x)(((x) & BIT_MASK_CFGX_LO_CH_SUSP) << BIT_SHIFT_CFGX_LO_CH_SUSP) +#define BIT_INVC_CFGX_LO_CH_SUSP (~(BIT_MASK_CFGX_LO_CH_SUSP << BIT_SHIFT_CFGX_LO_CH_SUSP)) + + +#define BIT_SHIFT_CFGX_LO_FIFO_EMPTY 9 +#define BIT_MASK_CFGX_LO_FIFO_EMPTY 0x1 +#define BIT_CFGX_LO_FIFO_EMPTY(x)(((x) & BIT_MASK_CFGX_LO_FIFO_EMPTY) << BIT_SHIFT_CFGX_LO_FIFO_EMPTY) +#define BIT_INVC_CFGX_LO_FIFO_EMPTY (~(BIT_MASK_CFGX_LO_FIFO_EMPTY << BIT_SHIFT_CFGX_LO_FIFO_EMPTY)) + + +#define BIT_SHIFT_CFGX_LO_HS_SEL_DST 10 +#define BIT_MASK_CFGX_LO_HS_SEL_DST 0x1 +#define BIT_CFGX_LO_HS_SEL_DST(x)(((x) & BIT_MASK_CFGX_LO_HS_SEL_DST) << BIT_SHIFT_CFGX_LO_HS_SEL_DST) +#define BIT_INVC_CFGX_LO_HS_SEL_DST (~(BIT_MASK_CFGX_LO_HS_SEL_DST << BIT_SHIFT_CFGX_LO_HS_SEL_DST)) + +#define BIT_SHIFT_CFGX_LO_HS_SEL_SRC 11 +#define BIT_MASK_CFGX_LO_HS_SEL_SRC 0x1 +#define BIT_CFGX_LO_HS_SEL_SRC(x)(((x) & BIT_MASK_CFGX_LO_HS_SEL_SRC) << BIT_SHIFT_CFGX_LO_HS_SEL_SRC) +#define BIT_INVC_CFGX_LO_HS_SEL_SRC (~(BIT_MASK_CFGX_LO_HS_SEL_SRC << BIT_SHIFT_CFGX_LO_HS_SEL_SRC)) + +#define BIT_SHIFT_CFGX_LO_LOCK_CH_L 12 +#define BIT_MASK_CFGX_LO_LOCK_CH_L 0x3 +#define BIT_CFGX_LO_LOCK_CH_L(x)(((x) & BIT_MASK_CFGX_LO_LOCK_CH_L) << BIT_SHIFT_CFGX_LO_LOCK_CH_L) +#define BIT_INVC_CFGX_LO_LOCK_CH_L (~(BIT_MASK_CFGX_LO_LOCK_CH_L << BIT_SHIFT_CFGX_LO_LOCK_CH_L)) + +#define BIT_SHIFT_CFGX_LO_LOCK_B_L 14 +#define BIT_MASK_CFGX_LO_LOCK_B_L 0x3 +#define BIT_CFGX_LO_LOCK_B_L(x)(((x) & BIT_MASK_CFGX_LO_LOCK_B_L) << BIT_SHIFT_CFGX_LO_LOCK_B_L) +#define BIT_INVC_CFGX_LO_LOCK_B_L (~(BIT_MASK_CFGX_LO_LOCK_B_L << BIT_SHIFT_CFGX_LO_LOCK_B_L)) + +#define BIT_SHIFT_CFGX_LO_LOCK_CH 16 +#define BIT_MASK_CFGX_LO_LOCK_CH 0x1 +#define BIT_CFGX_LO_LOCK_CH(x)(((x) & BIT_MASK_CFGX_LO_LOCK_CH) << BIT_SHIFT_CFGX_LO_LOCK_CH) +#define BIT_INVC_CFGX_LO_LOCK_CH (~(BIT_MASK_CFGX_LO_LOCK_CH << BIT_SHIFT_CFGX_LO_LOCK_CH)) + +#define BIT_SHIFT_CFGX_LO_LOCK_B 17 +#define BIT_MASK_CFGX_LO_LOCK_B 0x1 +#define BIT_CFGX_LO_LOCK_B(x)(((x) & BIT_MASK_CFGX_LO_LOCK_B) << BIT_SHIFT_CFGX_LO_LOCK_B) +#define BIT_INVC_CFGX_LO_LOCK_B (~(BIT_MASK_CFGX_LO_LOCK_B << BIT_SHIFT_CFGX_LO_LOCK_B)) + +#define BIT_SHIFT_CFGX_LO_DST_HS_POL 18 +#define BIT_MASK_CFGX_LO_DST_HS_POL 0x1 +#define BIT_CFGX_LO_DST_HS_POL(x)(((x) & BIT_MASK_CFGX_LO_DST_HS_POL) << BIT_SHIFT_CFGX_LO_DST_HS_POL) +#define BIT_INVC_CFGX_LO_DST_HS_POL (~(BIT_MASK_CFGX_LO_DST_HS_POL << BIT_SHIFT_CFGX_LO_DST_HS_POL)) + +#define BIT_SHIFT_CFGX_LO_SRC_HS_POL 19 +#define BIT_MASK_CFGX_LO_SRC_HS_POL 0x1 +#define BIT_CFGX_LO_SRC_HS_POL(x)(((x) & BIT_MASK_CFGX_LO_SRC_HS_POL) << BIT_SHIFT_CFGX_LO_SRC_HS_POL) +#define BIT_INVC_CFGX_LO_SRC_HS_POL (~(BIT_MASK_CFGX_LO_SRC_HS_POL << BIT_SHIFT_CFGX_LO_SRC_HS_POL)) + +#define BIT_SHIFT_CFGX_LO_MAX_ABRST 20 +#define BIT_MASK_CFGX_LO_MAX_ABRST 0x3FF +#define BIT_CFGX_LO_MAX_ABRST(x)(((x) & BIT_MASK_CFGX_LO_MAX_ABRST) << BIT_SHIFT_CFGX_LO_MAX_ABRST) +#define BIT_INVC_CFGX_LO_MAX_ABRST (~(BIT_MASK_CFGX_LO_MAX_ABRST << BIT_SHIFT_CFGX_LO_MAX_ABRST)) + +#define BIT_SHIFT_CFGX_LO_RELOAD_SRC 30 +#define BIT_MASK_CFGX_LO_RELOAD_SRC 0x1 +#define BIT_CFGX_LO_RELOAD_SRC(x)(((x) & BIT_MASK_CFGX_LO_RELOAD_SRC) << BIT_SHIFT_CFGX_LO_RELOAD_SRC) +#define BIT_INVC_CFGX_LO_RELOAD_SRC (~(BIT_MASK_CFGX_LO_RELOAD_SRC << BIT_SHIFT_CFGX_LO_RELOAD_SRC)) + +#define BIT_SHIFT_CFGX_LO_RELOAD_DST 31 +#define BIT_MASK_CFGX_LO_RELOAD_DST 0x1 +#define BIT_CFGX_LO_RELOAD_DST(x)(((x) & BIT_MASK_CFGX_LO_RELOAD_DST) << BIT_SHIFT_CFGX_LO_RELOAD_DST) +#define BIT_INVC_CFGX_LO_RELOAD_DST (~(BIT_MASK_CFGX_LO_RELOAD_DST << BIT_SHIFT_CFGX_LO_RELOAD_DST)) + +#define BIT_SHIFT_CFGX_UP_FCMODE 0 +#define BIT_MASK_CFGX_UP_FCMODE 0x1 +#define BIT_CFGX_UP_FCMODE(x)(((x) & BIT_MASK_CFGX_UP_FCMODE) << BIT_SHIFT_CFGX_UP_FCMODE) +#define BIT_INVC_CFGX_UP_FCMODE (~(BIT_MASK_CFGX_UP_FCMODE << BIT_SHIFT_CFGX_UP_FCMODE)) + +#define BIT_SHIFT_CFGX_UP_FIFO_MODE 1 +#define BIT_MASK_CFGX_UP_FIFO_MODE 0x1 +#define BIT_CFGX_UP_FIFO_MODE(x)(((x) & BIT_MASK_CFGX_UP_FIFO_MODE) << BIT_SHIFT_CFGX_UP_FIFO_MODE) +#define BIT_INVC_CFGX_UP_FIFO_MODE (~(BIT_MASK_CFGX_UP_FIFO_MODE << BIT_SHIFT_CFGX_UP_FIFO_MODE)) + +#define BIT_SHIFT_CFGX_UP_PROTCTL 2 +#define BIT_MASK_CFGX_UP_PROTCTL 0x7 +#define BIT_CFGX_UP_PROTCTL(x)(((x) & BIT_MASK_CFGX_UP_PROTCTL) << BIT_SHIFT_CFGX_UP_PROTCTL) +#define BIT_INVC_CFGX_UP_PROTCTL (~(BIT_MASK_CFGX_UP_PROTCTL << BIT_SHIFT_CFGX_UP_PROTCTL)) + +#define BIT_SHIFT_CFGX_UP_DS_UPD_EN 5 +#define BIT_MASK_CFGX_UP_DS_UPD_EN 0x1 +#define BIT_CFGX_UP_DS_UPD_EN(x)(((x) & BIT_MASK_CFGX_UP_DS_UPD_EN) << BIT_SHIFT_CFGX_UP_DS_UPD_EN) +#define BIT_INVC_CFGX_UP_DS_UPD_EN (~(BIT_MASK_CFGX_UP_DS_UPD_EN << BIT_SHIFT_CFGX_UP_DS_UPD_EN)) + +#define BIT_SHIFT_CFGX_UP_SS_UPD_EN 6 +#define BIT_MASK_CFGX_UP_SS_UPD_EN 0x1 +#define BIT_CFGX_UP_SS_UPD_EN(x)(((x) & BIT_MASK_CFGX_UP_SS_UPD_EN) << BIT_SHIFT_CFGX_UP_SS_UPD_EN) +#define BIT_INVC_CFGX_UP_SS_UPD_EN (~(BIT_MASK_CFGX_UP_SS_UPD_EN << BIT_SHIFT_CFGX_UP_SS_UPD_EN)) + +#define BIT_SHIFT_CFGX_UP_SRC_PER 7 +#define BIT_MASK_CFGX_UP_SRC_PER 0xF +#define BIT_CFGX_UP_SRC_PER(x)(((x) & BIT_MASK_CFGX_UP_SRC_PER) << BIT_SHIFT_CFGX_UP_SRC_PER) +#define BIT_INVC_CFGX_UP_SRC_PER (~(BIT_MASK_CFGX_UP_SRC_PER << BIT_SHIFT_CFGX_UP_SRC_PER)) + +#define BIT_SHIFT_CFGX_UP_DEST_PER 11 +#define BIT_MASK_CFGX_UP_DEST_PER 0xF +#define BIT_CFGX_UP_DEST_PER(x)(((x) & BIT_MASK_CFGX_UP_DEST_PER) << BIT_SHIFT_CFGX_UP_DEST_PER) +#define BIT_INVC_CFGX_UP_DEST_PER (~(BIT_MASK_CFGX_UP_DEST_PER << BIT_SHIFT_CFGX_UP_DEST_PER)) + +typedef enum _GDMA_CHANNEL_NUM_ { + GdmaNoCh = 0x0000, + GdmaCh0 = 0x0101, + GdmaCh1 = 0x0202, + GdmaCh2 = 0x0404, + GdmaCh3 = 0x0808, + GdmaCh4 = 0x1010, + GdmaCh5 = 0x2020, + GdmaCh6 = 0x4040, + GdmaCh7 = 0x8080, + GdmaAllCh = 0xffff +}GDMA_CHANNEL_NUM, *PGDMA_CHANNEL_NUM; + + +//3 CTL register struct + +typedef enum _GDMA_CTL_TT_FC_TYPE_ { + TTFCMemToMem = 0x00, + TTFCMemToPeri = 0x01, + TTFCPeriToMem = 0x02 +}GDMA_CTL_TT_FC_TYPE, *PGDMA_CTL_TT_FC_TYPE; + +//Max type = Bus Width +typedef enum _GDMA_CTL_TR_WIDTH_ { + TrWidthOneByte = 0x00, + TrWidthTwoBytes = 0x01, + TrWidthFourBytes = 0x02 +}GDMA_CTL_TR_WIDTH, *PGDMA_CTL_TR_WIDTH; + +typedef enum _GDMA_CTL_MSIZE_ { + MsizeOne = 0x00, + MsizeFour = 0x01, + MsizeEight = 0x02 +}GDMA_CTL_MSIZE, *PGDMA_CTL_MSIZE; + +typedef enum _GDMA_INC_TYPE_ { + IncType = 0x00, + DecType = 0x01, + NoChange = 0x02 +}GDMA_INC_TYPE, *PGDMA_INC_TYPE; + + +typedef struct _GDMA_CTL_REG_ { + GDMA_CTL_TT_FC_TYPE TtFc; + GDMA_CTL_TR_WIDTH DstTrWidth; + GDMA_CTL_TR_WIDTH SrcTrWidth; + GDMA_INC_TYPE Dinc; + GDMA_INC_TYPE Sinc; + GDMA_CTL_MSIZE DestMsize; + GDMA_CTL_MSIZE SrcMsize; + + u8 IntEn :1; // Bit 0 + u8 SrcGatherEn :1; // Bit 1 + u8 DstScatterEn :1; // Bit 2 + u8 LlpDstEn :1; // Bit 3 + u8 LlpSrcEn :1; // Bit 4 + u8 Done :1; // Bit 5 + u8 Rsvd6To7 :2; //Bit 6 -7 + u16 BlockSize; + +}GDMA_CTL_REG, *PGDMA_CTL_REG; + + +//3 CFG Register Structure + +typedef enum _GDMA_CH_PRIORITY_ { + Prior0 = 0, + Prior1 = 1, + Prior2 = 2, + Prior3 = 3, + Prior4 = 4, + Prior5 = 5, + Prior6 = 6, + Prior7 = 7 +}GDMA_CH_PRIORITY, *PGDMA_CH_PRIORITY; + +typedef enum _GDMA_LOCK_LEVEL_ { + OverComplDmaTransfer = 0x00, + OverComplDmaBlockTransfer = 0x01, + OverComplDmaTransation = 0x02 +}GDMA_LOCK_LEVEL, *PGDMA_LOCK_LEVEL; + + +typedef struct _GDMA_CFG_REG_ { + GDMA_CH_PRIORITY ChPrior; + GDMA_LOCK_LEVEL LockBL; + GDMA_LOCK_LEVEL LockChL; + u16 MaxAbrst; + u8 SrcPer; + u8 DestPer; + u16 ChSusp :1; //Bit 0 + u16 FifoEmpty :1; //Bit 1 + u16 HsSelDst :1; //Bit 2 + u16 HsSelSrc :1; //Bit 3 + u16 LockCh :1; //Bit 4 + u16 LockB :1; //Bit 5 + u16 DstHsPol :1; //Bit 6 + u16 SrcHsPol :1; //Bit 7 + u16 ReloadSrc :1; //Bit 8 + u16 ReloadDst :1; //Bit 9 + u16 FifoMode :1; //Bit 10 + u16 DsUpdEn :1; //Bit 11 + u16 SsUpdEn :1; //Bit 12 + u16 Rsvd13To15 :3; +}GDMA_CFG_REG, *PGDMA_CFG_REG; + +typedef enum _GDMA_ISR_TYPE_ { + TransferType = 0x1, + BlockType = 0x2, + SrcTransferType = 0x4, + DstTransferType = 0x8, + ErrType = 0x10 +}GDMA_ISR_TYPE, *PGDMA_ISR_TYPE; + + +VOID +HalGdmaOnOffRtl8195a ( + IN VOID *Data +); + +BOOL +HalGdamChInitRtl8195a( + IN VOID *Data +); + +BOOL +HalGdmaChSetingRtl8195a( + IN VOID *Data +); + +BOOL +HalGdmaChBlockSetingRtl8195a( + IN VOID *Data +); + + +VOID +HalGdmaChDisRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChEnRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChIsrEnAndDisRtl8195a ( + IN VOID *Data +); + +u8 +HalGdmaChIsrCleanRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChCleanAutoSrcRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChCleanAutoDstRtl8195a ( + IN VOID *Data +); + + + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gpio.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gpio.h new file mode 100644 index 0000000..ba588fe --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_gpio.h @@ -0,0 +1,143 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_GPIO_H_ +#define _RTL8195A_GPIO_H_ + +#include "hal_api.h" +#include "hal_gpio.h" + +#define GPIO_PORTA_DR 0x00 // data register +#define GPIO_PORTA_DDR 0x04 // data direction +#define GPIO_PORTA_CTRL 0x08 // data source control, we should keep it as default: data source from software + +#define GPIO_PORTB_DR 0x0c // data register +#define GPIO_PORTB_DDR 0x10 // data direction +#define GPIO_PORTB_CTRL 0x14 // data source control, we should keep it as default: data source from software + +#define GPIO_PORTC_DR 0x18 // data register +#define GPIO_PORTC_DDR 0x1c // data direction +#define GPIO_PORTC_CTRL 0x20 // data source control, we should keep it as default: data source from software + +//1 Only the PORTA can be configured to generate interrupts +#define GPIO_INT_EN 0x30 // Interrupt enable register +#define GPIO_INT_MASK 0x34 // Interrupt mask +#define GPIO_INT_TYPE 0x38 // Interrupt type(level/edge) register +#define GPIO_INT_POLARITY 0x3C // Interrupt polarity(Active low/high) register +#define GPIO_INT_STATUS 0x40 // Interrupt status +#define GPIO_INT_RAWSTATUS 0x44 // Interrupt status without mask +#define GPIO_DEBOUNCE 0x48 // Interrupt signal debounce +#define GPIO_PORTA_EOI 0x4c // Clear interrupt + +#define GPIO_EXT_PORTA 0x50 // GPIO IN read or OUT read back +#define GPIO_EXT_PORTB 0x54 // GPIO IN read or OUT read back +#define GPIO_EXT_PORTC 0x58 // GPIO IN read or OUT read back + +#define GPIO_INT_SYNC 0x60 // Is level-sensitive interrupt being sync sith PCLK + +enum { + HAL_GPIO_HIGHZ = 0, + HAL_GPIO_PULL_LOW = 1, + HAL_GPIO_PULL_HIGH = 2 +}; + +extern u32 +HAL_GPIO_IrqHandler_8195a( + IN VOID *pData +); + +extern u32 +HAL_GPIO_MbedIrqHandler_8195a( + IN VOID *pData +); + +extern u32 +HAL_GPIO_MbedIrqHandler_8195a( + IN VOID *pData +); + +HAL_Status +HAL_GPIO_IntCtrl_8195a( + HAL_GPIO_PIN *GPIO_Pin, + u32 En +); + +HAL_Status +HAL_GPIO_Init_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +HAL_Status +HAL_GPIO_DeInit_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +HAL_GPIO_PIN_STATE +HAL_GPIO_ReadPin_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +HAL_Status +HAL_GPIO_WritePin_8195a( + HAL_GPIO_PIN *GPIO_Pin, + HAL_GPIO_PIN_STATE Pin_State +); + +HAL_Status +HAL_GPIO_RegIrq_8195a( + IN PIRQ_HANDLE pIrqHandle +); + +HAL_Status +HAL_GPIO_UnRegIrq_8195a( + IN PIRQ_HANDLE pIrqHandle +); + +HAL_Status +HAL_GPIO_UserRegIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin, + VOID *IrqHandler, + VOID *IrqData +); + +HAL_Status +HAL_GPIO_UserUnRegIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +HAL_Status +HAL_GPIO_MaskIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +HAL_Status +HAL_GPIO_UnMaskIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +HAL_Status +HAL_GPIO_IntDebounce_8195a( + HAL_GPIO_PIN *GPIO_Pin, + u8 Enable +); + +u32 +HAL_GPIO_GetIPPinName_8195a( + u32 chip_pin +); + +HAL_Status +HAL_GPIO_PullCtrl_8195a( + u32 chip_pin, + u8 pull_type +); + +#endif // end of "#define _RTL8195A_GPIO_H_" + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2c.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2c.h new file mode 100644 index 0000000..03dfc63 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2c.h @@ -0,0 +1,839 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_I2C_H_ +#define _RTL8195A_I2C_H_ + +#include "hal_api.h" + +//================ Register Bit Field ================== +//2 REG_DW_I2C_IC_CON +#define BIT_IC_CON_IC_SLAVE_DISABLE BIT(6) +#define BIT_SHIFT_IC_CON_IC_SLAVE_DISABLE 6 +#define BIT_MASK_IC_CON_IC_SLAVE_DISABLE 0x1 +#define BIT_CTRL_IC_CON_IC_SLAVE_DISABLE(x) (((x) & BIT_MASK_IC_CON_IC_SLAVE_DISABLE) << BIT_SHIFT_IC_CON_IC_SLAVE_DISABLE) + +#define BIT_IC_CON_IC_RESTART_EN BIT(5) +#define BIT_SHIFT_IC_CON_IC_RESTART_EN 5 +#define BIT_MASK_IC_CON_IC_RESTART_EN 0x1 +#define BIT_CTRL_IC_CON_IC_RESTART_EN(x) (((x) & BIT_MASK_IC_CON_IC_RESTART_EN) << BIT_SHIFT_IC_CON_IC_RESTART_EN) + +#define BIT_IC_CON_IC_10BITADDR_MASTER BIT(4) +#define BIT_SHIFT_IC_CON_IC_10BITADDR_MASTER 4 +#define BIT_MASK_IC_CON_IC_10BITADDR_MASTER 0x1 +#define BIT_CTRL_IC_CON_IC_10BITADDR_MASTER(x) (((x) & BIT_MASK_IC_CON_IC_10BITADDR_MASTER) << BIT_SHIFT_IC_CON_IC_10BITADDR_MASTER) + +#define BIT_IC_CON_IC_10BITADDR_SLAVE BIT(3) +#define BIT_SHIFT_IC_CON_IC_10BITADDR_SLAVE 3 +#define BIT_MASK_IC_CON_IC_10BITADDR_SLAVE 0x1 +#define BIT_CTRL_IC_CON_IC_10BITADDR_SLAVE(x) (((x) & BIT_MASK_IC_CON_IC_10BITADDR_SLAVE) << BIT_SHIFT_IC_CON_IC_10BITADDR_SLAVE) + + +#define BIT_SHIFT_IC_CON_SPEED 1 +#define BIT_MASK_IC_CON_SPEED 0x3 +#define BIT_IC_CON_SPEED(x) (((x) & BIT_MASK_IC_CON_SPEED) << BIT_SHIFT_IC_CON_SPEED) +#define BIT_CTRL_IC_CON_SPEED(x) (((x) & BIT_MASK_IC_CON_SPEED) << BIT_SHIFT_IC_CON_SPEED) +#define BIT_GET_IC_CON_SPEED(x) (((x) >> BIT_SHIFT_IC_CON_SPEED) & BIT_MASK_IC_CON_SPEED) + +#define BIT_IC_CON_MASTER_MODE BIT(0) +#define BIT_SHIFT_IC_CON_MASTER_MODE 0 +#define BIT_MASK_IC_CON_MASTER_MODE 0x1 +#define BIT_CTRL_IC_CON_MASTER_MODE(x) (((x) & BIT_MASK_IC_CON_MASTER_MODE) << BIT_SHIFT_IC_CON_MASTER_MODE) + + +//2 REG_DW_I2C_IC_TAR +#define BIT_IC_TAR_IC_10BITADDR_MASTER BIT(12) +#define BIT_SHIFT_IC_TAR_IC_10BITADDR_MASTER 12 +#define BIT_MASK_IC_TAR_IC_10BITADDR_MASTER 0x1 +#define BIT_CTRL_IC_TAR_IC_10BITADDR_MASTER(x) (((x) & BIT_MASK_IC_TAR_IC_10BITADDR_MASTER) << BIT_SHIFT_IC_TAR_IC_10BITADDR_MASTER) + +#define BIT_IC_TAR_SPECIAL BIT(11) +#define BIT_SHIFT_IC_TAR_SPECIAL 11 +#define BIT_MASK_IC_TAR_SPECIAL 0x1 +#define BIT_CTRL_IC_TAR_SPECIAL(x) (((x) & BIT_MASK_IC_TAR_SPECIAL) << BIT_SHIFT_IC_TAR_SPECIAL) + +#define BIT_IC_TAR_GC_OR_START BIT(10) +#define BIT_SHIFT_IC_TAR_GC_OR_START 10 +#define BIT_MASK_IC_TAR_GC_OR_START 0x1 +#define BIT_CTRL_IC_TAR_GC_OR_START(x) (((x) & BIT_MASK_IC_TAR_GC_OR_START) << BIT_SHIFT_IC_TAR_GC_OR_START) + + +#define BIT_SHIFT_IC_TAR 0 +#define BIT_MASK_IC_TAR 0x3ff +#define BIT_IC_TAR(x) (((x) & BIT_MASK_IC_TAR) << BIT_SHIFT_IC_TAR) +#define BIT_CTRL_IC_TAR(x) (((x) & BIT_MASK_IC_TAR) << BIT_SHIFT_IC_TAR) +#define BIT_GET_IC_TAR(x) (((x) >> BIT_SHIFT_IC_TAR) & BIT_MASK_IC_TAR) + + +//2 REG_DW_I2C_IC_SAR + +#define BIT_SHIFT_IC_SAR 0 +#define BIT_MASK_IC_SAR 0x3ff +#define BIT_IC_SAR(x) (((x) & BIT_MASK_IC_SAR) << BIT_SHIFT_IC_SAR) +#define BIT_CTRL_IC_SAR(x) (((x) & BIT_MASK_IC_SAR) << BIT_SHIFT_IC_SAR) +#define BIT_GET_IC_SAR(x) (((x) >> BIT_SHIFT_IC_SAR) & BIT_MASK_IC_SAR) + + +//2 REG_DW_I2C_IC_HS_MADDR + +#define BIT_SHIFT_IC_HS_MADDR 0 +#define BIT_MASK_IC_HS_MADDR 0x7 +#define BIT_IC_HS_MADDR(x) (((x) & BIT_MASK_IC_HS_MADDR) << BIT_SHIFT_IC_HS_MADDR) +#define BIT_CTRL_IC_HS_MADDR(x) (((x) & BIT_MASK_IC_HS_MADDR) << BIT_SHIFT_IC_HS_MADDR) +#define BIT_GET_IC_HS_MADDR(x) (((x) >> BIT_SHIFT_IC_HS_MADDR) & BIT_MASK_IC_HS_MADDR) + + +//2 REG_DW_I2C_IC_DATA_CMD +#define BIT_IC_DATA_CMD_RESTART BIT(10) +#define BIT_SHIFT_IC_DATA_CMD_RESTART 10 +#define BIT_MASK_IC_DATA_CMD_RESTART 0x1 +#define BIT_CTRL_IC_DATA_CMD_RESTART(x) (((x) & BIT_MASK_IC_DATA_CMD_RESTART) << BIT_SHIFT_IC_DATA_CMD_RESTART) + +#define BIT_IC_DATA_CMD_STOP BIT(9) +#define BIT_SHIFT_IC_DATA_CMD_STOP 9 +#define BIT_MASK_IC_DATA_CMD_STOP 0x1 +#define BIT_CTRL_IC_DATA_CMD_STOP(x) (((x) & BIT_MASK_IC_DATA_CMD_STOP) << BIT_SHIFT_IC_DATA_CMD_STOP) + +#define BIT_IC_DATA_CMD_CMD BIT(8) +#define BIT_SHIFT_IC_DATA_CMD_CMD 8 +#define BIT_MASK_IC_DATA_CMD_CMD 0x1 +#define BIT_CTRL_IC_DATA_CMD_CMD(x) (((x) & BIT_MASK_IC_DATA_CMD_CMD) << BIT_SHIFT_IC_DATA_CMD_CMD) + + +#define BIT_SHIFT_IC_DATA_CMD_DAT 0 +#define BIT_MASK_IC_DATA_CMD_DAT 0xff +#define BIT_IC_DATA_CMD_DAT(x) (((x) & BIT_MASK_IC_DATA_CMD_DAT) << BIT_SHIFT_IC_DATA_CMD_DAT) +#define BIT_CTRL_IC_DATA_CMD_DAT(x) (((x) & BIT_MASK_IC_DATA_CMD_DAT) << BIT_SHIFT_IC_DATA_CMD_DAT) +#define BIT_GET_IC_DATA_CMD_DAT(x) (((x) >> BIT_SHIFT_IC_DATA_CMD_DAT) & BIT_MASK_IC_DATA_CMD_DAT) + + +//2 REG_DW_I2C_IC_SS_SCL_HCNT + +#define BIT_SHIFT_IC_SS_SCL_HCNT 0 +#define BIT_MASK_IC_SS_SCL_HCNT 0xffff +#define BIT_IC_SS_SCL_HCNT(x) (((x) & BIT_MASK_IC_SS_SCL_HCNT) << BIT_SHIFT_IC_SS_SCL_HCNT) +#define BIT_CTRL_IC_SS_SCL_HCNT(x) (((x) & BIT_MASK_IC_SS_SCL_HCNT) << BIT_SHIFT_IC_SS_SCL_HCNT) +#define BIT_GET_IC_SS_SCL_HCNT(x) (((x) >> BIT_SHIFT_IC_SS_SCL_HCNT) & BIT_MASK_IC_SS_SCL_HCNT) + + +//2 REG_DW_I2C_IC_SS_SCL_LCNT + +#define BIT_SHIFT_IC_SS_SCL_LCNT 0 +#define BIT_MASK_IC_SS_SCL_LCNT 0xffff +#define BIT_IC_SS_SCL_LCNT(x) (((x) & BIT_MASK_IC_SS_SCL_LCNT) << BIT_SHIFT_IC_SS_SCL_LCNT) +#define BIT_CTRL_IC_SS_SCL_LCNT(x) (((x) & BIT_MASK_IC_SS_SCL_LCNT) << BIT_SHIFT_IC_SS_SCL_LCNT) +#define BIT_GET_IC_SS_SCL_LCNT(x) (((x) >> BIT_SHIFT_IC_SS_SCL_LCNT) & BIT_MASK_IC_SS_SCL_LCNT) + + +//2 REG_DW_I2C_IC_FS_SCL_HCNT + +#define BIT_SHIFT_IC_FS_SCL_HCNT 0 +#define BIT_MASK_IC_FS_SCL_HCNT 0xffff +#define BIT_IC_FS_SCL_HCNT(x) (((x) & BIT_MASK_IC_FS_SCL_HCNT) << BIT_SHIFT_IC_FS_SCL_HCNT) +#define BIT_CTRL_IC_FS_SCL_HCNT(x) (((x) & BIT_MASK_IC_FS_SCL_HCNT) << BIT_SHIFT_IC_FS_SCL_HCNT) +#define BIT_GET_IC_FS_SCL_HCNT(x) (((x) >> BIT_SHIFT_IC_FS_SCL_HCNT) & BIT_MASK_IC_FS_SCL_HCNT) + + +//2 REG_DW_I2C_IC_FS_SCL_LCNT + +#define BIT_SHIFT_IC_FS_SCL_LCNT 0 +#define BIT_MASK_IC_FS_SCL_LCNT 0xffff +#define BIT_IC_FS_SCL_LCNT(x) (((x) & BIT_MASK_IC_FS_SCL_LCNT) << BIT_SHIFT_IC_FS_SCL_LCNT) +#define BIT_CTRL_IC_FS_SCL_LCNT(x) (((x) & BIT_MASK_IC_FS_SCL_LCNT) << BIT_SHIFT_IC_FS_SCL_LCNT) +#define BIT_GET_IC_FS_SCL_LCNT(x) (((x) >> BIT_SHIFT_IC_FS_SCL_LCNT) & BIT_MASK_IC_FS_SCL_LCNT) + + +//2 REG_DW_I2C_IC_HS_SCL_HCNT + +#define BIT_SHIFT_IC_HS_SCL_HCNT 0 +#define BIT_MASK_IC_HS_SCL_HCNT 0xffff +#define BIT_IC_HS_SCL_HCNT(x) (((x) & BIT_MASK_IC_HS_SCL_HCNT) << BIT_SHIFT_IC_HS_SCL_HCNT) +#define BIT_CTRL_IC_HS_SCL_HCNT(x) (((x) & BIT_MASK_IC_HS_SCL_HCNT) << BIT_SHIFT_IC_HS_SCL_HCNT) +#define BIT_GET_IC_HS_SCL_HCNT(x) (((x) >> BIT_SHIFT_IC_HS_SCL_HCNT) & BIT_MASK_IC_HS_SCL_HCNT) + + +//2 REG_DW_I2C_IC_HS_SCL_LCNT + +#define BIT_SHIFT_IC_HS_SCL_LCNT 0 +#define BIT_MASK_IC_HS_SCL_LCNT 0xffff +#define BIT_IC_HS_SCL_LCNT(x) (((x) & BIT_MASK_IC_HS_SCL_LCNT) << BIT_SHIFT_IC_HS_SCL_LCNT) +#define BIT_CTRL_IC_HS_SCL_LCNT(x) (((x) & BIT_MASK_IC_HS_SCL_LCNT) << BIT_SHIFT_IC_HS_SCL_LCNT) +#define BIT_GET_IC_HS_SCL_LCNT(x) (((x) >> BIT_SHIFT_IC_HS_SCL_LCNT) & BIT_MASK_IC_HS_SCL_LCNT) + + +//2 REG_DW_I2C_IC_INTR_STAT +#define BIT_IC_INTR_STAT_R_GEN_CALL BIT(11) +#define BIT_SHIFT_IC_INTR_STAT_R_GEN_CALL 11 +#define BIT_MASK_IC_INTR_STAT_R_GEN_CALL 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_GEN_CALL(x) (((x) & BIT_MASK_IC_INTR_STAT_R_GEN_CALL) << BIT_SHIFT_IC_INTR_STAT_R_GEN_CALL) + +#define BIT_IC_INTR_STAT_R_START_DET BIT(10) +#define BIT_SHIFT_IC_INTR_STAT_R_START_DET 10 +#define BIT_MASK_IC_INTR_STAT_R_START_DET 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_START_DET(x) (((x) & BIT_MASK_IC_INTR_STAT_R_START_DET) << BIT_SHIFT_IC_INTR_STAT_R_START_DET) + +#define BIT_IC_INTR_STAT_R_STOP_DET BIT(9) +#define BIT_SHIFT_IC_INTR_STAT_R_STOP_DET 9 +#define BIT_MASK_IC_INTR_STAT_R_STOP_DET 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_STOP_DET(x) (((x) & BIT_MASK_IC_INTR_STAT_R_STOP_DET) << BIT_SHIFT_IC_INTR_STAT_R_STOP_DET) + +#define BIT_IC_INTR_STAT_R_ACTIVITY BIT(8) +#define BIT_SHIFT_IC_INTR_STAT_R_ACTIVITY 8 +#define BIT_MASK_IC_INTR_STAT_R_ACTIVITY 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_ACTIVITY(x) (((x) & BIT_MASK_IC_INTR_STAT_R_ACTIVITY) << BIT_SHIFT_IC_INTR_STAT_R_ACTIVITY) + +#define BIT_IC_INTR_STAT_R_RX_DONE BIT(7) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_DONE 7 +#define BIT_MASK_IC_INTR_STAT_R_RX_DONE 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_DONE(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_DONE) << BIT_SHIFT_IC_INTR_STAT_R_RX_DONE) + +#define BIT_IC_INTR_STAT_R_TX_ABRT BIT(6) +#define BIT_SHIFT_IC_INTR_STAT_R_TX_ABRT 6 +#define BIT_MASK_IC_INTR_STAT_R_TX_ABRT 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_TX_ABRT(x) (((x) & BIT_MASK_IC_INTR_STAT_R_TX_ABRT) << BIT_SHIFT_IC_INTR_STAT_R_TX_ABRT) + +#define BIT_IC_INTR_STAT_R_RD_REQ BIT(5) +#define BIT_SHIFT_IC_INTR_STAT_R_RD_REQ 5 +#define BIT_MASK_IC_INTR_STAT_R_RD_REQ 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RD_REQ(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RD_REQ) << BIT_SHIFT_IC_INTR_STAT_R_RD_REQ) + +#define BIT_IC_INTR_STAT_R_TX_EMPTY BIT(4) +#define BIT_SHIFT_IC_INTR_STAT_R_TX_EMPTY 4 +#define BIT_MASK_IC_INTR_STAT_R_TX_EMPTY 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_TX_EMPTY(x) (((x) & BIT_MASK_IC_INTR_STAT_R_TX_EMPTY) << BIT_SHIFT_IC_INTR_STAT_R_TX_EMPTY) + +#define BIT_IC_INTR_STAT_R_TX_OVER BIT(3) +#define BIT_SHIFT_IC_INTR_STAT_R_TX_OVER 3 +#define BIT_MASK_IC_INTR_STAT_R_TX_OVER 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_TX_OVER(x) (((x) & BIT_MASK_IC_INTR_STAT_R_TX_OVER) << BIT_SHIFT_IC_INTR_STAT_R_TX_OVER) + +#define BIT_IC_INTR_STAT_R_RX_FULL BIT(2) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_FULL 2 +#define BIT_MASK_IC_INTR_STAT_R_RX_FULL 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_FULL(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_FULL) << BIT_SHIFT_IC_INTR_STAT_R_RX_FULL) + +#define BIT_IC_INTR_STAT_R_RX_OVER BIT(1) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_OVER 1 +#define BIT_MASK_IC_INTR_STAT_R_RX_OVER 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_OVER(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_OVER) << BIT_SHIFT_IC_INTR_STAT_R_RX_OVER) + +#define BIT_IC_INTR_STAT_R_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_UNDER 0 +#define BIT_MASK_IC_INTR_STAT_R_RX_UNDER 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_UNDER(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_UNDER) << BIT_SHIFT_IC_INTR_STAT_R_RX_UNDER) + + +//2 REG_DW_I2C_IC_INTR_MASK +#define BIT_IC_INTR_MASK_M_GEN_CALL BIT(11) +#define BIT_SHIFT_IC_INTR_MASK_M_GEN_CALL 11 +#define BIT_MASK_IC_INTR_MASK_M_GEN_CALL 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_GEN_CALL(x) (((x) & BIT_MASK_IC_INTR_MASK_M_GEN_CALL) << BIT_SHIFT_IC_INTR_MASK_M_GEN_CALL) + +#define BIT_IC_INTR_MASK_M_START_DET BIT(10) +#define BIT_SHIFT_IC_INTR_MASK_M_START_DET 10 +#define BIT_MASK_IC_INTR_MASK_M_START_DET 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_START_DET(x) (((x) & BIT_MASK_IC_INTR_MASK_M_START_DET) << BIT_SHIFT_IC_INTR_MASK_M_START_DET) + +#define BIT_IC_INTR_MASK_M_STOP_DET BIT(9) +#define BIT_SHIFT_IC_INTR_MASK_M_STOP_DET 9 +#define BIT_MASK_IC_INTR_MASK_M_STOP_DET 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_STOP_DET(x) (((x) & BIT_MASK_IC_INTR_MASK_M_STOP_DET) << BIT_SHIFT_IC_INTR_MASK_M_STOP_DET) + +#define BIT_IC_INTR_MASK_M_ACTIVITY BIT(8) +#define BIT_SHIFT_IC_INTR_MASK_M_ACTIVITY 8 +#define BIT_MASK_IC_INTR_MASK_M_ACTIVITY 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_ACTIVITY(x) (((x) & BIT_MASK_IC_INTR_MASK_M_ACTIVITY) << BIT_SHIFT_IC_INTR_MASK_M_ACTIVITY) + +#define BIT_IC_INTR_MASK_M_RX_DONE BIT(7) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_DONE 7 +#define BIT_MASK_IC_INTR_MASK_M_RX_DONE 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_DONE(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_DONE) << BIT_SHIFT_IC_INTR_MASK_M_RX_DONE) + +#define BIT_IC_INTR_MASK_M_TX_ABRT BIT(6) +#define BIT_SHIFT_IC_INTR_MASK_M_TX_ABRT 6 +#define BIT_MASK_IC_INTR_MASK_M_TX_ABRT 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_TX_ABRT(x) (((x) & BIT_MASK_IC_INTR_MASK_M_TX_ABRT) << BIT_SHIFT_IC_INTR_MASK_M_TX_ABRT) + +#define BIT_IC_INTR_MASK_M_RD_REQ BIT(5) +#define BIT_SHIFT_IC_INTR_MASK_M_RD_REQ 5 +#define BIT_MASK_IC_INTR_MASK_M_RD_REQ 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RD_REQ(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RD_REQ) << BIT_SHIFT_IC_INTR_MASK_M_RD_REQ) + +#define BIT_IC_INTR_MASK_M_TX_EMPTY BIT(4) +#define BIT_SHIFT_IC_INTR_MASK_M_TX_EMPTY 4 +#define BIT_MASK_IC_INTR_MASK_M_TX_EMPTY 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_TX_EMPTY(x) (((x) & BIT_MASK_IC_INTR_MASK_M_TX_EMPTY) << BIT_SHIFT_IC_INTR_MASK_M_TX_EMPTY) + +#define BIT_IC_INTR_MASK_M_TX_OVER BIT(3) +#define BIT_SHIFT_IC_INTR_MASK_M_TX_OVER 3 +#define BIT_MASK_IC_INTR_MASK_M_TX_OVER 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_TX_OVER(x) (((x) & BIT_MASK_IC_INTR_MASK_M_TX_OVER) << BIT_SHIFT_IC_INTR_MASK_M_TX_OVER) + +#define BIT_IC_INTR_MASK_M_RX_FULL BIT(2) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_FULL 2 +#define BIT_MASK_IC_INTR_MASK_M_RX_FULL 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_FULL(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_FULL) << BIT_SHIFT_IC_INTR_MASK_M_RX_FULL) + +#define BIT_IC_INTR_MASK_M_RX_OVER BIT(1) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_OVER 1 +#define BIT_MASK_IC_INTR_MASK_M_RX_OVER 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_OVER(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_OVER) << BIT_SHIFT_IC_INTR_MASK_M_RX_OVER) + +#define BIT_IC_INTR_MASK_M_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_UNDER 0 +#define BIT_MASK_IC_INTR_MASK_M_RX_UNDER 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_UNDER(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_UNDER) << BIT_SHIFT_IC_INTR_MASK_M_RX_UNDER) + + +//2 REG_DW_I2C_IC_RAW_INTR_STAT +#define BIT_IC_RAW_INTR_STAT_GEN_CALL BIT(11) +#define BIT_SHIFT_IC_RAW_INTR_STAT_GEN_CALL 11 +#define BIT_MASK_IC_RAW_INTR_STAT_GEN_CALL 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_GEN_CALL(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_GEN_CALL) << BIT_SHIFT_IC_RAW_INTR_STAT_GEN_CALL) + +#define BIT_IC_RAW_INTR_STAT_START_DET BIT(10) +#define BIT_SHIFT_IC_RAW_INTR_STAT_START_DET 10 +#define BIT_MASK_IC_RAW_INTR_STAT_START_DET 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_START_DET(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_START_DET) << BIT_SHIFT_IC_RAW_INTR_STAT_START_DET) + +#define BIT_IC_RAW_INTR_STAT_STOP_DET BIT(9) +#define BIT_SHIFT_IC_RAW_INTR_STAT_STOP_DET 9 +#define BIT_MASK_IC_RAW_INTR_STAT_STOP_DET 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_STOP_DET(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_STOP_DET) << BIT_SHIFT_IC_RAW_INTR_STAT_STOP_DET) + +#define BIT_IC_RAW_INTR_STAT_ACTIVITY BIT(8) +#define BIT_SHIFT_IC_RAW_INTR_STAT_ACTIVITY 8 +#define BIT_MASK_IC_RAW_INTR_STAT_ACTIVITY 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_ACTIVITY(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_ACTIVITY) << BIT_SHIFT_IC_RAW_INTR_STAT_ACTIVITY) + +#define BIT_IC_RAW_INTR_STAT_RX_DONE BIT(7) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_DONE 7 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_DONE 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_DONE(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_DONE) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_DONE) + +#define BIT_IC_RAW_INTR_STAT_TX_ABRT BIT(6) +#define BIT_SHIFT_IC_RAW_INTR_STAT_TX_ABRT 6 +#define BIT_MASK_IC_RAW_INTR_STAT_TX_ABRT 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_TX_ABRT(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_TX_ABRT) << BIT_SHIFT_IC_RAW_INTR_STAT_TX_ABRT) + +#define BIT_IC_RAW_INTR_STAT_RD_REQ BIT(5) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RD_REQ 5 +#define BIT_MASK_IC_RAW_INTR_STAT_RD_REQ 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RD_REQ(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RD_REQ) << BIT_SHIFT_IC_RAW_INTR_STAT_RD_REQ) + +#define BIT_IC_RAW_INTR_STAT_TX_EMPTY BIT(4) +#define BIT_SHIFT_IC_RAW_INTR_STAT_TX_EMPTY 4 +#define BIT_MASK_IC_RAW_INTR_STAT_TX_EMPTY 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_TX_EMPTY(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_TX_EMPTY) << BIT_SHIFT_IC_RAW_INTR_STAT_TX_EMPTY) + +#define BIT_IC_RAW_INTR_STAT_TX_OVER BIT(3) +#define BIT_SHIFT_IC_RAW_INTR_STAT_TX_OVER 3 +#define BIT_MASK_IC_RAW_INTR_STAT_TX_OVER 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_TX_OVER(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_TX_OVER) << BIT_SHIFT_IC_RAW_INTR_STAT_TX_OVER) + +#define BIT_IC_RAW_INTR_STAT_RX_FULL BIT(2) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_FULL 2 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_FULL 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_FULL(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_FULL) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_FULL) + +#define BIT_IC_RAW_INTR_STAT_RX_OVER BIT(1) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_OVER 1 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_OVER 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_OVER(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_OVER) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_OVER) + +#define BIT_IC_RAW_INTR_STAT_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_UNDER 0 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_UNDER 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_UNDER(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_UNDER) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_UNDER) + + +//2 REG_DW_I2C_IC_RX_TL + +#define BIT_SHIFT_IC_RX_TL 0 +#define BIT_MASK_IC_RX_TL 0xff +#define BIT_IC_RX_TL(x) (((x) & BIT_MASK_IC_RX_TL) << BIT_SHIFT_IC_RX_TL) +#define BIT_CTRL_IC_RX_TL(x) (((x) & BIT_MASK_IC_RX_TL) << BIT_SHIFT_IC_RX_TL) +#define BIT_GET_IC_RX_TL(x) (((x) >> BIT_SHIFT_IC_RX_TL) & BIT_MASK_IC_RX_TL) + + +//2 REG_DW_I2C_IC_TX_TL + +#define BIT_SHIFT_IC_TX_TL 0 +#define BIT_MASK_IC_TX_TL 0xff +#define BIT_IC_TX_TL(x) (((x) & BIT_MASK_IC_TX_TL) << BIT_SHIFT_IC_TX_TL) +#define BIT_CTRL_IC_TX_TL(x) (((x) & BIT_MASK_IC_TX_TL) << BIT_SHIFT_IC_TX_TL) +#define BIT_GET_IC_TX_TL(x) (((x) >> BIT_SHIFT_IC_TX_TL) & BIT_MASK_IC_TX_TL) + + +//2 REG_DW_I2C_IC_CLR_INTR +#define BIT_IC_CLR_INTR BIT(0) +#define BIT_SHIFT_IC_CLR_INTR 0 +#define BIT_MASK_IC_CLR_INTR 0x1 +#define BIT_CTRL_IC_CLR_INTR(x) (((x) & BIT_MASK_IC_CLR_INTR) << BIT_SHIFT_IC_CLR_INTR) + + +//2 REG_DW_I2C_IC_CLR_RX_UNDER +#define BIT_IC_CLR_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_CLR_RX_UNDER 0 +#define BIT_MASK_IC_CLR_RX_UNDER 0x1 +#define BIT_CTRL_IC_CLR_RX_UNDER(x) (((x) & BIT_MASK_IC_CLR_RX_UNDER) << BIT_SHIFT_IC_CLR_RX_UNDER) + + +//2 REG_DW_I2C_IC_CLR_RX_OVER +#define BIT_IC_CLR_RX_OVER BIT(0) +#define BIT_SHIFT_IC_CLR_RX_OVER 0 +#define BIT_MASK_IC_CLR_RX_OVER 0x1 +#define BIT_CTRL_IC_CLR_RX_OVER(x) (((x) & BIT_MASK_IC_CLR_RX_OVER) << BIT_SHIFT_IC_CLR_RX_OVER) + + +//2 REG_DW_I2C_IC_CLR_TX_OVER +#define BIT_IC_CLR_TX_OVER BIT(0) +#define BIT_SHIFT_IC_CLR_TX_OVER 0 +#define BIT_MASK_IC_CLR_TX_OVER 0x1 +#define BIT_CTRL_IC_CLR_TX_OVER(x) (((x) & BIT_MASK_IC_CLR_TX_OVER) << BIT_SHIFT_IC_CLR_TX_OVER) + + +//2 REG_DW_I2C_IC_CLR_RD_REQ +#define BIT_IC_CLR_RD_REQ BIT(0) +#define BIT_SHIFT_IC_CLR_RD_REQ 0 +#define BIT_MASK_IC_CLR_RD_REQ 0x1 +#define BIT_CTRL_IC_CLR_RD_REQ(x) (((x) & BIT_MASK_IC_CLR_RD_REQ) << BIT_SHIFT_IC_CLR_RD_REQ) + + +//2 REG_DW_I2C_IC_CLR_TX_ABRT +#define BIT_CLR_RD_REQ BIT(0) +#define BIT_SHIFT_CLR_RD_REQ 0 +#define BIT_MASK_CLR_RD_REQ 0x1 +#define BIT_CTRL_CLR_RD_REQ(x) (((x) & BIT_MASK_CLR_RD_REQ) << BIT_SHIFT_CLR_RD_REQ) + + +//2 REG_DW_I2C_IC_CLR_RX_DONE +#define BIT_IC_CLR_RX_DONE BIT(0) +#define BIT_SHIFT_IC_CLR_RX_DONE 0 +#define BIT_MASK_IC_CLR_RX_DONE 0x1 +#define BIT_CTRL_IC_CLR_RX_DONE(x) (((x) & BIT_MASK_IC_CLR_RX_DONE) << BIT_SHIFT_IC_CLR_RX_DONE) + + +//2 REG_DW_I2C_IC_CLR_ACTIVITY +#define BIT_IC_CLR_ACTIVITY BIT(0) +#define BIT_SHIFT_IC_CLR_ACTIVITY 0 +#define BIT_MASK_IC_CLR_ACTIVITY 0x1 +#define BIT_CTRL_IC_CLR_ACTIVITY(x) (((x) & BIT_MASK_IC_CLR_ACTIVITY) << BIT_SHIFT_IC_CLR_ACTIVITY) + + +//2 REG_DW_I2C_IC_CLR_STOP_DET +#define BIT_IC_CLR_STOP_DET BIT(0) +#define BIT_SHIFT_IC_CLR_STOP_DET 0 +#define BIT_MASK_IC_CLR_STOP_DET 0x1 +#define BIT_CTRL_IC_CLR_STOP_DET(x) (((x) & BIT_MASK_IC_CLR_STOP_DET) << BIT_SHIFT_IC_CLR_STOP_DET) + + +//2 REG_DW_I2C_IC_CLR_START_DET +#define BIT_IC_CLR_START_DET BIT(0) +#define BIT_SHIFT_IC_CLR_START_DET 0 +#define BIT_MASK_IC_CLR_START_DET 0x1 +#define BIT_CTRL_IC_CLR_START_DET(x) (((x) & BIT_MASK_IC_CLR_START_DET) << BIT_SHIFT_IC_CLR_START_DET) + + +//2 REG_DW_I2C_IC_CLR_GEN_CALL +#define BIT_IC_CLR_GEN_CALL BIT(0) +#define BIT_SHIFT_IC_CLR_GEN_CALL 0 +#define BIT_MASK_IC_CLR_GEN_CALL 0x1 +#define BIT_CTRL_IC_CLR_GEN_CALL(x) (((x) & BIT_MASK_IC_CLR_GEN_CALL) << BIT_SHIFT_IC_CLR_GEN_CALL) + + +//2 REG_DW_I2C_IC_ENABLE +#define BIT_IC_ENABLE BIT(0) +#define BIT_SHIFT_IC_ENABLE 0 +#define BIT_MASK_IC_ENABLE 0x1 +#define BIT_CTRL_IC_ENABLE(x) (((x) & BIT_MASK_IC_ENABLE) << BIT_SHIFT_IC_ENABLE) + + +//2 REG_DW_I2C_IC_STATUS +#define BIT_IC_STATUS_SLV_ACTIVITY BIT(6) +#define BIT_SHIFT_IC_STATUS_SLV_ACTIVITY 6 +#define BIT_MASK_IC_STATUS_SLV_ACTIVITY 0x1 +#define BIT_CTRL_IC_STATUS_SLV_ACTIVITY(x) (((x) & BIT_MASK_IC_STATUS_SLV_ACTIVITY) << BIT_SHIFT_IC_STATUS_SLV_ACTIVITY) + +#define BIT_IC_STATUS_MST_ACTIVITY BIT(5) +#define BIT_SHIFT_IC_STATUS_MST_ACTIVITY 5 +#define BIT_MASK_IC_STATUS_MST_ACTIVITY 0x1 +#define BIT_CTRL_IC_STATUS_MST_ACTIVITY(x) (((x) & BIT_MASK_IC_STATUS_MST_ACTIVITY) << BIT_SHIFT_IC_STATUS_MST_ACTIVITY) + +#define BIT_IC_STATUS_RFF BIT(4) +#define BIT_SHIFT_IC_STATUS_RFF 4 +#define BIT_MASK_IC_STATUS_RFF 0x1 +#define BIT_CTRL_IC_STATUS_RFF(x) (((x) & BIT_MASK_IC_STATUS_RFF) << BIT_SHIFT_IC_STATUS_RFF) + +#define BIT_IC_STATUS_RFNE BIT(3) +#define BIT_SHIFT_IC_STATUS_RFNE 3 +#define BIT_MASK_IC_STATUS_RFNE 0x1 +#define BIT_CTRL_IC_STATUS_RFNE(x) (((x) & BIT_MASK_IC_STATUS_RFNE) << BIT_SHIFT_IC_STATUS_RFNE) + +#define BIT_IC_STATUS_TFE BIT(2) +#define BIT_SHIFT_IC_STATUS_TFE 2 +#define BIT_MASK_IC_STATUS_TFE 0x1 +#define BIT_CTRL_IC_STATUS_TFE(x) (((x) & BIT_MASK_IC_STATUS_TFE) << BIT_SHIFT_IC_STATUS_TFE) + +#define BIT_IC_STATUS_TFNF BIT(1) +#define BIT_SHIFT_IC_STATUS_TFNF 1 +#define BIT_MASK_IC_STATUS_TFNF 0x1 +#define BIT_CTRL_IC_STATUS_TFNF(x) (((x) & BIT_MASK_IC_STATUS_TFNF) << BIT_SHIFT_IC_STATUS_TFNF) + +#define BIT_IC_STATUS_ACTIVITY BIT(0) +#define BIT_SHIFT_IC_STATUS_ACTIVITY 0 +#define BIT_MASK_IC_STATUS_ACTIVITY 0x1 +#define BIT_CTRL_IC_STATUS_ACTIVITY(x) (((x) & BIT_MASK_IC_STATUS_ACTIVITY) << BIT_SHIFT_IC_STATUS_ACTIVITY) + + +//2 REG_DW_I2C_IC_TXFLR + +#define BIT_SHIFT_IC_TXFLR 0 +#define BIT_MASK_IC_TXFLR 0x3f +#define BIT_IC_TXFLR(x) (((x) & BIT_MASK_IC_TXFLR) << BIT_SHIFT_IC_TXFLR) +#define BIT_CTRL_IC_TXFLR(x) (((x) & BIT_MASK_IC_TXFLR) << BIT_SHIFT_IC_TXFLR) +#define BIT_GET_IC_TXFLR(x) (((x) >> BIT_SHIFT_IC_TXFLR) & BIT_MASK_IC_TXFLR) + + +//2 REG_DW_I2C_IC_RXFLR + +#define BIT_SHIFT_IC_RXFLR 0 +#define BIT_MASK_IC_RXFLR 0x1f +#define BIT_IC_RXFLR(x) (((x) & BIT_MASK_IC_RXFLR) << BIT_SHIFT_IC_RXFLR) +#define BIT_CTRL_IC_RXFLR(x) (((x) & BIT_MASK_IC_RXFLR) << BIT_SHIFT_IC_RXFLR) +#define BIT_GET_IC_RXFLR(x) (((x) >> BIT_SHIFT_IC_RXFLR) & BIT_MASK_IC_RXFLR) + + +//2 REG_DW_I2C_IC_SDA_HOLD + +#define BIT_SHIFT_IC_SDA_HOLD 0 +#define BIT_MASK_IC_SDA_HOLD 0xffff +#define BIT_IC_SDA_HOLD(x) (((x) & BIT_MASK_IC_SDA_HOLD) << BIT_SHIFT_IC_SDA_HOLD) +#define BIT_CTRL_IC_SDA_HOLD(x) (((x) & BIT_MASK_IC_SDA_HOLD) << BIT_SHIFT_IC_SDA_HOLD) +#define BIT_GET_IC_SDA_HOLD(x) (((x) >> BIT_SHIFT_IC_SDA_HOLD) & BIT_MASK_IC_SDA_HOLD) + + +//2 REG_DW_I2C_IC_TX_ABRT_SOURCE +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX BIT(15) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX 15 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST BIT(14) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST 14 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO BIT(13) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO 13 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO) + +#define BIT_IC_TX_ABRT_SOURCE_ARB_LOST BIT(12) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ARB_LOST 12 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ARB_LOST 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ARB_LOST(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ARB_LOST) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ARB_LOST) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS BIT(11) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS 11 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT BIT(10) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT 10 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT BIT(9) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT 9 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT BIT(8) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT 8 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET BIT(7) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET 7 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET BIT(6) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET 6 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ BIT(5) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ 5 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK BIT(4) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK 4 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK BIT(3) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK 3 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK BIT(2) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK 2 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK BIT(1) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK 1 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK BIT(0) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK 0 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK) + + +//2 REG_DW_I2C_IC_SLV_DATA_NACK_ONLY +#define BIT_IC_SLV_DATA_NACK_ONLY BIT(0) +#define BIT_SHIFT_IC_SLV_DATA_NACK_ONLY 0 +#define BIT_MASK_IC_SLV_DATA_NACK_ONLY 0x1 +#define BIT_CTRL_IC_SLV_DATA_NACK_ONLY(x) (((x) & BIT_MASK_IC_SLV_DATA_NACK_ONLY) << BIT_SHIFT_IC_SLV_DATA_NACK_ONLY) + + +//2 REG_DW_I2C_IC_DMA_CR +#define BIT_IC_DMA_CR_TDMAE BIT(1) +#define BIT_SHIFT_IC_DMA_CR_TDMAE 1 +#define BIT_MASK_IC_DMA_CR_TDMAE 0x1 +#define BIT_CTRL_IC_DMA_CR_TDMAE(x) (((x) & BIT_MASK_IC_DMA_CR_TDMAE) << BIT_SHIFT_IC_DMA_CR_TDMAE) + +#define BIT_IC_DMA_CR_RDMAE BIT(0) +#define BIT_SHIFT_IC_DMA_CR_RDMAE 0 +#define BIT_MASK_IC_DMA_CR_RDMAE 0x1 +#define BIT_CTRL_IC_DMA_CR_RDMAE(x) (((x) & BIT_MASK_IC_DMA_CR_RDMAE) << BIT_SHIFT_IC_DMA_CR_RDMAE) + + +//2 REG_DW_I2C_IC_DMA_TDLR + +#define BIT_SHIFT_IC_DMA_TDLR_DMATDL 0 +#define BIT_MASK_IC_DMA_TDLR_DMATDL 0x1f +#define BIT_IC_DMA_TDLR_DMATDL(x) (((x) & BIT_MASK_IC_DMA_TDLR_DMATDL) << BIT_SHIFT_IC_DMA_TDLR_DMATDL) +#define BIT_CTRL_IC_DMA_TDLR_DMATDL(x) (((x) & BIT_MASK_IC_DMA_TDLR_DMATDL) << BIT_SHIFT_IC_DMA_TDLR_DMATDL) +#define BIT_GET_IC_DMA_TDLR_DMATDL(x) (((x) >> BIT_SHIFT_IC_DMA_TDLR_DMATDL) & BIT_MASK_IC_DMA_TDLR_DMATDL) + + +//2 REG_DW_I2C_IC_DMA_RDLR + +#define BIT_SHIFT_IC_DMA_RDLR_DMARDL 0 +#define BIT_MASK_IC_DMA_RDLR_DMARDL 0xf +#define BIT_IC_DMA_RDLR_DMARDL(x) (((x) & BIT_MASK_IC_DMA_RDLR_DMARDL) << BIT_SHIFT_IC_DMA_RDLR_DMARDL) +#define BIT_CTRL_IC_DMA_RDLR_DMARDL(x) (((x) & BIT_MASK_IC_DMA_RDLR_DMARDL) << BIT_SHIFT_IC_DMA_RDLR_DMARDL) +#define BIT_GET_IC_DMA_RDLR_DMARDL(x) (((x) >> BIT_SHIFT_IC_DMA_RDLR_DMARDL) & BIT_MASK_IC_DMA_RDLR_DMARDL) + + +//2 REG_DW_I2C_IC_SDA_SETUP + +#define BIT_SHIFT_IC_SDA_SETUP 0 +#define BIT_MASK_IC_SDA_SETUP 0xff +#define BIT_IC_SDA_SETUP(x) (((x) & BIT_MASK_IC_SDA_SETUP) << BIT_SHIFT_IC_SDA_SETUP) +#define BIT_CTRL_IC_SDA_SETUP(x) (((x) & BIT_MASK_IC_SDA_SETUP) << BIT_SHIFT_IC_SDA_SETUP) +#define BIT_GET_IC_SDA_SETUP(x) (((x) >> BIT_SHIFT_IC_SDA_SETUP) & BIT_MASK_IC_SDA_SETUP) + + +//2 REG_DW_I2C_IC_ACK_GENERAL_CALL +#define BIT_IC_ACK_GENERAL_CALL BIT(0) +#define BIT_SHIFT_IC_ACK_GENERAL_CALL 0 +#define BIT_MASK_IC_ACK_GENERAL_CALL 0x1 +#define BIT_CTRL_IC_ACK_GENERAL_CALL(x) (((x) & BIT_MASK_IC_ACK_GENERAL_CALL) << BIT_SHIFT_IC_ACK_GENERAL_CALL) + + +//2 REG_DW_I2C_IC_ENABLE_STATUS +#define BIT_IC_ENABLE_STATUS_SLV_RX_DATA_LOST BIT(2) +#define BIT_SHIFT_IC_ENABLE_STATUS_SLV_RX_DATA_LOST 2 +#define BIT_MASK_IC_ENABLE_STATUS_SLV_RX_DATA_LOST 0x1 +#define BIT_CTRL_IC_ENABLE_STATUS_SLV_RX_DATA_LOST(x) (((x) & BIT_MASK_IC_ENABLE_STATUS_SLV_RX_DATA_LOST) << BIT_SHIFT_IC_ENABLE_STATUS_SLV_RX_DATA_LOST) + +#define BIT_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY BIT(1) +#define BIT_SHIFT_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY 1 +#define BIT_MASK_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY 0x1 +#define BIT_CTRL_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY(x) (((x) & BIT_MASK_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY) << BIT_SHIFT_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY) + +#define BIT_IC_ENABLE_STATUS_IC_EN BIT(0) +#define BIT_SHIFT_IC_ENABLE_STATUS_IC_EN 0 +#define BIT_MASK_IC_ENABLE_STATUS_IC_EN 0x1 +#define BIT_CTRL_IC_ENABLE_STATUS_IC_EN(x) (((x) & BIT_MASK_IC_ENABLE_STATUS_IC_EN) << BIT_SHIFT_IC_ENABLE_STATUS_IC_EN) + + +//2 REG_DW_I2C_IC_COMP_PARAM_1 + +#define BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH 16 +#define BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH 0xff +#define BIT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) +#define BIT_CTRL_IC_COMP_PARAM_1_TX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) +#define BIT_GET_IC_COMP_PARAM_1_TX_BUFFER_DEPTH(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) & BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) + + +#define BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH 8 +#define BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH 0xff +#define BIT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) +#define BIT_CTRL_IC_COMP_PARAM_1_RX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) +#define BIT_GET_IC_COMP_PARAM_1_RX_BUFFER_DEPTH(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) & BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) + +#define BIT_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS BIT(7) +#define BIT_SHIFT_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS 7 +#define BIT_MASK_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS) << BIT_SHIFT_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS) + +#define BIT_IC_COMP_PARAM_1_HAS_DMA BIT(6) +#define BIT_SHIFT_IC_COMP_PARAM_1_HAS_DMA 6 +#define BIT_MASK_IC_COMP_PARAM_1_HAS_DMA 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_HAS_DMA(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_HAS_DMA) << BIT_SHIFT_IC_COMP_PARAM_1_HAS_DMA) + +#define BIT_IC_COMP_PARAM_1_INTR_IO BIT(5) +#define BIT_SHIFT_IC_COMP_PARAM_1_INTR_IO 5 +#define BIT_MASK_IC_COMP_PARAM_1_INTR_IO 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_INTR_IO(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_INTR_IO) << BIT_SHIFT_IC_COMP_PARAM_1_INTR_IO) + +#define BIT_IC_COMP_PARAM_1_HC_COUNT_VALUES BIT(4) +#define BIT_SHIFT_IC_COMP_PARAM_1_HC_COUNT_VALUES 4 +#define BIT_MASK_IC_COMP_PARAM_1_HC_COUNT_VALUES 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_HC_COUNT_VALUES(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_HC_COUNT_VALUES) << BIT_SHIFT_IC_COMP_PARAM_1_HC_COUNT_VALUES) + + +#define BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE 2 +#define BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE 0x3 +#define BIT_IC_COMP_PARAM_1_MAX_SPEED_MODE(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE) << BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE) +#define BIT_CTRL_IC_COMP_PARAM_1_MAX_SPEED_MODE(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE) << BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE) +#define BIT_GET_IC_COMP_PARAM_1_MAX_SPEED_MODE(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE) & BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE) + + +#define BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH 0 +#define BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH 0x3 +#define BIT_IC_COMP_PARAM_1_APB_DATA_WIDTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH) << BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH) +#define BIT_CTRL_IC_COMP_PARAM_1_APB_DATA_WIDTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH) << BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH) +#define BIT_GET_IC_COMP_PARAM_1_APB_DATA_WIDTH(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH) & BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH) + + +//2 REG_DW_I2C_IC_COMP_VERSION + +#define BIT_SHIFT_IC_COMP_VERSION 0 +#define BIT_MASK_IC_COMP_VERSION 0xffffffffL +#define BIT_IC_COMP_VERSION(x) (((x) & BIT_MASK_IC_COMP_VERSION) << BIT_SHIFT_IC_COMP_VERSION) +#define BIT_CTRL_IC_COMP_VERSION(x) (((x) & BIT_MASK_IC_COMP_VERSION) << BIT_SHIFT_IC_COMP_VERSION) +#define BIT_GET_IC_COMP_VERSION(x) (((x) >> BIT_SHIFT_IC_COMP_VERSION) & BIT_MASK_IC_COMP_VERSION) + + +//2 REG_DW_I2C_IC_COMP_TYPE + +#define BIT_SHIFT_IC_COMP_TYPE 0 +#define BIT_MASK_IC_COMP_TYPE 0xffffffffL +#define BIT_IC_COMP_TYPE(x) (((x) & BIT_MASK_IC_COMP_TYPE) << BIT_SHIFT_IC_COMP_TYPE) +#define BIT_CTRL_IC_COMP_TYPE(x) (((x) & BIT_MASK_IC_COMP_TYPE) << BIT_SHIFT_IC_COMP_TYPE) +#define BIT_GET_IC_COMP_TYPE(x) (((x) >> BIT_SHIFT_IC_COMP_TYPE) & BIT_MASK_IC_COMP_TYPE) + +//======================== Register Address Definition ======================== +#define REG_DW_I2C_IC_CON 0x0000 +#define REG_DW_I2C_IC_TAR 0x0004 +#define REG_DW_I2C_IC_SAR 0x0008 +#define REG_DW_I2C_IC_HS_MADDR 0x000C +#define REG_DW_I2C_IC_DATA_CMD 0x0010 +#define REG_DW_I2C_IC_SS_SCL_HCNT 0x0014 +#define REG_DW_I2C_IC_SS_SCL_LCNT 0x0018 +#define REG_DW_I2C_IC_FS_SCL_HCNT 0x001C +#define REG_DW_I2C_IC_FS_SCL_LCNT 0x0020 +#define REG_DW_I2C_IC_HS_SCL_HCNT 0x0024 +#define REG_DW_I2C_IC_HS_SCL_LCNT 0x0028 +#define REG_DW_I2C_IC_INTR_STAT 0x002C +#define REG_DW_I2C_IC_INTR_MASK 0x0030 +#define REG_DW_I2C_IC_RAW_INTR_STAT 0x0034 +#define REG_DW_I2C_IC_RX_TL 0x0038 +#define REG_DW_I2C_IC_TX_TL 0x003C +#define REG_DW_I2C_IC_CLR_INTR 0x0040 +#define REG_DW_I2C_IC_CLR_RX_UNDER 0x0044 +#define REG_DW_I2C_IC_CLR_RX_OVER 0x0048 +#define REG_DW_I2C_IC_CLR_TX_OVER 0x004C +#define REG_DW_I2C_IC_CLR_RD_REQ 0x0050 +#define REG_DW_I2C_IC_CLR_TX_ABRT 0x0054 +#define REG_DW_I2C_IC_CLR_RX_DONE 0x0058 +#define REG_DW_I2C_IC_CLR_ACTIVITY 0x005C +#define REG_DW_I2C_IC_CLR_STOP_DET 0x0060 +#define REG_DW_I2C_IC_CLR_START_DET 0x0064 +#define REG_DW_I2C_IC_CLR_GEN_CALL 0x0068 +#define REG_DW_I2C_IC_ENABLE 0x006C +#define REG_DW_I2C_IC_STATUS 0x0070 +#define REG_DW_I2C_IC_TXFLR 0x0074 +#define REG_DW_I2C_IC_RXFLR 0x0078 +#define REG_DW_I2C_IC_SDA_HOLD 0x007C +#define REG_DW_I2C_IC_TX_ABRT_SOURCE 0x0080 +#define REG_DW_I2C_IC_SLV_DATA_NACK_ONLY 0x0084 +#define REG_DW_I2C_IC_DMA_CR 0x0088 +#define REG_DW_I2C_IC_DMA_TDLR 0x008C +#define REG_DW_I2C_IC_DMA_RDLR 0x0090 +#define REG_DW_I2C_IC_SDA_SETUP 0x0094 +#define REG_DW_I2C_IC_ACK_GENERAL_CALL 0x0098 +#define REG_DW_I2C_IC_ENABLE_STATUS 0x009C +#define REG_DW_I2C_IC_COMP_PARAM_1 0x00F4 +#define REG_DW_I2C_IC_COMP_VERSION 0x00F8 +#define REG_DW_I2C_IC_COMP_TYPE 0x00FC + +//====================================================== +// I2C related enumeration +// I2C Address Mode +typedef enum _I2C_ADDR_MODE_ { + I2C_ADDR_7BIT = 0, + I2C_ADDR_10BIT = 1, +}I2C_ADDR_MODE,*PI2C_ADDR_MODE; + +// I2C Speed Mode +typedef enum _I2C_SPD_MODE_ { + I2C_SS_MODE = 1, + I2C_FS_MODE = 2, + I2C_HS_MODE = 3, +}I2C_SPD_MODE,*PI2C_SPD_MODE; + +//I2C Timing Parameters +#define I2C_SS_MIN_SCL_HTIME 4000 //the unit is ns. +#define I2C_SS_MIN_SCL_LTIME 4700 //the unit is ns. + +#define I2C_FS_MIN_SCL_HTIME 600 //the unit is ns. +#define I2C_FS_MIN_SCL_LTIME 1300 //the unit is ns. + +#define I2C_HS_MIN_SCL_HTIME_100 60 //the unit is ns, with bus loading = 100pf +#define I2C_HS_MIN_SCL_LTIME_100 120 //the unit is ns., with bus loading = 100pf + +#define I2C_HS_MIN_SCL_HTIME_400 160 //the unit is ns, with bus loading = 400pf +#define I2C_HS_MIN_SCL_LTIME_400 320 //the unit is ns., with bus loading = 400pf + + +//====================================================== +//I2C Essential functions and macros +_LONG_CALL_ VOID HalI2CWrite32(IN u8 I2CIdx, IN u8 I2CReg, IN u32 I2CVal); +_LONG_CALL_ u32 HalI2CRead32(IN u8 I2CIdx, IN u8 I2CReg); + +#define HAL_I2C_WRITE32(I2CIdx, addr, value) HalI2CWrite32(I2CIdx,addr,value) +#define HAL_I2C_READ32(I2CIdx, addr) HalI2CRead32(I2CIdx,addr) + +// Rtl8195a I2C function prototypes +_LONG_CALL_ HAL_Status HalI2CEnableRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CInit8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CDeInit8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CSetCLKRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CMassSendRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CSendRtl8195a(IN VOID *Data); +_LONG_CALL_ u8 HalI2CReceiveRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CIntrCtrl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CClrIntrRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CClrAllIntrRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CDMACtrl8195a(IN VOID *Data); +_LONG_CALL_ u32 HalI2CReadRegRtl8195a(IN VOID *Data, IN u8 I2CReg); +_LONG_CALL_ HAL_Status HalI2CWriteRegRtl8195a(IN VOID *Data, IN u8 I2CReg, IN u32 RegVal); +_LONG_CALL_ HAL_Status HalI2CDMACtrl8195a(IN VOID *Data); + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2s.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2s.h new file mode 100644 index 0000000..902f849 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_i2s.h @@ -0,0 +1,497 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_I2S_H_ +#define _RTL8195A_I2S_H_ + + +//=============== Register Bit Field Definition ==================== +// REG_I2S_CONTROL +#define BIT_CTLX_I2S_EN BIT(0) +#define BIT_SHIFT_CTLX_I2S_EN 0 +#define BIT_MASK_CTLX_I2S_EN 0x1 +#define BIT_CTRL_CTLX_I2S_EN(x) (((x) & BIT_MASK_CTLX_I2S_EN) << BIT_SHIFT_CTLX_I2S_EN) + +#define BIT_SHIFT_CTLX_I2S_TRX_ACT 1 +#define BIT_MASK_CTLX_I2S_TRX_ACT 0x3 +#define BIT_CTRL_CTLX_I2S_TRX_ACT(x) (((x) & BIT_MASK_CTLX_I2S_TRX_ACT) << BIT_SHIFT_CTLX_I2S_TRX_ACT) +#define BIT_GET_CTLX_I2S_TRX_ACT(x) (((x) >> BIT_SHIFT_CTLX_I2S_TRX_ACT) & BIT_MASK_CTLX_I2S_TRX_ACT) + +#define BIT_SHIFT_CTLX_I2S_CH_NUM 3 +#define BIT_MASK_CTLX_I2S_CH_NUM 0x3 +#define BIT_CTRL_CTLX_I2S_CH_NUM(x) (((x) & BIT_MASK_CTLX_I2S_CH_NUM) << BIT_SHIFT_CTLX_I2S_CH_NUM) +#define BIT_GET_CTLX_I2S_CH_NUM(x) (((x) >> BIT_SHIFT_CTLX_I2S_CH_NUM) & BIT_MASK_CTLX_I2S_CH_NUM) + +#define BIT_CTLX_I2S_WL BIT(6) +#define BIT_SHIFT_CTLX_I2S_WL 6 +#define BIT_MASK_CTLX_I2S_WL 0x1 +#define BIT_CTRL_CTLX_I2S_WL(x) (((x) & BIT_MASK_CTLX_I2S_WL) << BIT_SHIFT_CTLX_I2S_WL) + +#define BIT_CTLX_I2S_LRSWAP BIT(10) +#define BIT_SHIFT_CTLX_I2S_LRSWAP 10 +#define BIT_MASK_CTLX_I2S_LRSWAP 0x1 +#define BIT_CTRL_CTLX_I2S_LRSWAP(x) (((x) & BIT_MASK_CTLX_I2S_LRSWAP) << BIT_SHIFT_CTLX_I2S_LRSWAP) + +#define BIT_CTLX_I2S_SCK_INV BIT(11) +#define BIT_SHIFT_CTLX_I2S_SCK_INV 11 +#define BIT_MASK_CTLX_I2S_SCK_INV 0x1 +#define BIT_CTRL_CTLX_I2S_SCK_INV(x) (((x) & BIT_MASK_CTLX_I2S_SCK_INV) << BIT_SHIFT_CTLX_I2S_SCK_INV) + +#define BIT_CTLX_I2S_ENDIAN_SWAP BIT(12) +#define BIT_SHIFT_CTLX_I2S_ENDIAN_SWAP 12 +#define BIT_MASK_CTLX_I2S_ENDIAN_SWAP 0x1 +#define BIT_CTRL_CTLX_I2S_ENDIAN_SWAP(x) (((x) & BIT_MASK_CTLX_I2S_ENDIAN_SWAP) << BIT_SHIFT_CTLX_I2S_ENDIAN_SWAP) + +#define BIT_CTLX_I2S_SLAVE_MODE BIT(29) +#define BIT_SHIFT_CTLX_I2S_SLAVE_MODE 29 +#define BIT_MASK_CTLX_I2S_SLAVE_MODE 0x1 +#define BIT_CTRL_CTLX_I2S_SLAVE_MODE(x) (((x) & BIT_MASK_CTLX_I2S_SLAVE_MODE) << BIT_SHIFT_CTLX_I2S_SLAVE_MODE) + +#define BIT_CTLX_I2S_CLK_SRC BIT(30) +#define BIT_SHIFT_CTLX_I2S_CLK_SRC 30 +#define BIT_MASK_CTLX_I2S_CLK_SRC 0x1 +#define BIT_CTRL_CTLX_I2S_CLK_SRC(x) (((x) & BIT_MASK_CTLX_I2S_CLK_SRC) << BIT_SHIFT_CTLX_I2S_CLK_SRC) + +#define BIT_CTLX_I2S_SW_RSTN BIT(31) +#define BIT_SHIFT_CTLX_I2S_SW_RSTN 31 +#define BIT_MASK_CTLX_I2S_SW_RSTN 0x1 +#define BIT_CTRL_CTLX_I2S_SW_RSTN(x) (((x) & BIT_MASK_CTLX_I2S_SW_RSTN) << BIT_SHIFT_CTLX_I2S_SW_RSTN) + +// REG_I2S_SETTING +#define BIT_SHIFT_SETTING_I2S_PAGE_SZ 0 +#define BIT_MASK_SETTING_I2S_PAGE_SZ 0xFFF +#define BIT_CTRL_SETTING_I2S_PAGE_SZ(x) (((x) & BIT_MASK_SETTING_I2S_PAGE_SZ) << BIT_SHIFT_SETTING_I2S_PAGE_SZ) +#define BIT_GET_SETTING_I2S_PAGE_SZ(x) (((x) >> BIT_SHIFT_SETTING_I2S_PAGE_SZ) & BIT_MASK_SETTING_I2S_PAGE_SZ) + +#define BIT_SHIFT_SETTING_I2S_PAGE_NUM 12 +#define BIT_MASK_SETTING_I2S_PAGE_NUM 0x3 +#define BIT_CTRL_SETTING_I2S_PAGE_NUM(x) (((x) & BIT_MASK_SETTING_I2S_PAGE_NUM) << BIT_SHIFT_SETTING_I2S_PAGE_NUM) +#define BIT_GET_SETTING_I2S_PAGE_NUM(x) (((x) >> BIT_SHIFT_SETTING_I2S_PAGE_NUM) & BIT_MASK_SETTING_I2S_PAGE_NUM) + +#define BIT_SHIFT_SETTING_I2S_SAMPLE_RATE 14 +#define BIT_MASK_SETTING_I2S_SAMPLE_RATE 0x7 +#define BIT_CTRL_SETTING_I2S_SAMPLE_RATE(x) (((x) & BIT_MASK_SETTING_I2S_SAMPLE_RATE) << BIT_SHIFT_SETTING_I2S_SAMPLE_RATE) +#define BIT_GET_SETTING_I2S_SAMPLE_RATE(x) (((x) >> BIT_SHIFT_SETTING_I2S_SAMPLE_RATE) & BIT_MASK_SETTING_I2S_SAMPLE_RATE) + +// i2s trx page own bit +#define BIT_PAGE_I2S_OWN_BIT BIT(31) +#define BIT_SHIFT_PAGE_I2S_OWN_BIT 31 +#define BIT_MASK_PAGE_I2S_OWN_BIT 0x1 +#define BIT_CTRL_PAGE_I2S_OWN_BIT(x) (((x) & BIT_MASK_PAGE_I2S_OWN_BIT) << BIT_SHIFT_PAGE_I2S_OWN_BIT) + +//=============== Register Address Definition ==================== +#define REG_I2S_PAGE_OWN_OFF 0x004 + +#define REG_I2S_CTL 0x000 +#define REG_I2S_TX_PAGE_PTR 0x004 +#define REG_I2S_RX_PAGE_PTR 0x008 +#define REG_I2S_SETTING 0x00C + +#define REG_I2S_TX_MASK_INT 0x010 +#define REG_I2S_TX_STATUS_INT 0x014 +#define REG_I2S_RX_MASK_INT 0x018 +#define REG_I2S_RX_STATUS_INT 0x01c + + +#define REG_I2S_TX_PAGE0_OWN 0x020 +#define REG_I2S_TX_PAGE1_OWN 0x024 +#define REG_I2S_TX_PAGE2_OWN 0x028 +#define REG_I2S_TX_PAGE3_OWN 0x02C +#define REG_I2S_RX_PAGE0_OWN 0x030 +#define REG_I2S_RX_PAGE1_OWN 0x034 +#define REG_I2S_RX_PAGE2_OWN 0x038 +#define REG_I2S_RX_PAGE3_OWN 0x03C + +/*I2S Essential Functions and Macros*/ +VOID +HalI2SWrite32( + IN u8 I2SIdx, + IN u8 I2SReg, + IN u32 I2SVal +); + +u32 +HalI2SRead32( + IN u8 I2SIdx, + IN u8 I2SReg +); + +/* +#define HAL_I2SX_READ32(I2sIndex, addr) \ + HAL_READ32(I2S0_REG_BASE+ (I2sIndex*I2S1_REG_OFF), addr) +#define HAL_I2SX_WRITE32(I2sIndex, addr, value) \ + HAL_WRITE32((I2S0_REG_BASE+ (I2sIndex*I2S1_REG_OFF)), addr, value) +*/ + +#define HAL_I2S_WRITE32(I2SIdx, addr, value) HalI2SWrite32(I2SIdx,addr,value) +#define HAL_I2S_READ32(I2SIdx, addr) HalI2SRead32(I2SIdx,addr) + +/* I2S debug output*/ +#define I2S_PREFIX "RTL8195A[i2s]: " +#define I2S_PREFIX_LVL " [i2s_DBG]: " + +typedef enum _I2S_DBG_LVL_ { + HAL_I2S_LVL = 0x01, + SAL_I2S_LVL = 0x02, + VERI_I2S_LVL = 0x03, +}I2S_DBG_LVL,*PI2S_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_I2S_HAL + + #define DBG_8195A_I2S(...) do{ \ + _DbgDump("\r"I2S_PREFIX __VA_ARGS__);\ + }while(0) + + + #define I2SDBGLVL 0xFF + #define DBG_8195A_I2S_LVL(LVL,...) do{\ + if (LVL&I2SDBGLVL){\ + _DbgDump("\r"I2S_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_I2S_LOG_PERD 100 + #define DBG_8195A_I2S(...) + #define DBG_8195A_I2S_LVL(...) +#endif +#else + #define DBG_I2S_LOG_PERD 100 + #define DBG_8195A_I2S(...) + #define DBG_8195A_I2S_LVL(...) +#endif + +/* +#define REG_I2S_PAGE_OWN_OFF 0x004 +#define REG_I2S_CTL 0x000 +#define REG_I2S_TX_PAGE_PTR 0x004 +#define REG_I2S_RX_PAGE_PTR 0x008 +#define REG_I2S_SETTING 0x00C + +#define REG_I2S_TX_MASK_INT 0x010 +#define REG_I2S_TX_STATUS_INT 0x014 +#define REG_I2S_RX_MASK_INT 0x018 +#define REG_I2S_RX_STATUS_INT 0x01c + + + +#define REG_I2S_TX_PAGE0_OWN 0x020 +#define REG_I2S_TX_PAGE1_OWN 0x024 +#define REG_I2S_TX_PAGE2_OWN 0x028 +#define REG_I2S_TX_PAGE3_OWN 0x02C +#define REG_I2S_RX_PAGE0_OWN 0x030 +#define REG_I2S_RX_PAGE1_OWN 0x034 +#define REG_I2S_RX_PAGE2_OWN 0x038 +#define REG_I2S_RX_PAGE3_OWN 0x03C +*/ +/* template +#define BIT_SHIFT_CTLX_ 7 +#define BIT_MASK_CTLX_ 0x1 +#define BIT_CTLX_(x) (((x) & BIT_MASK_CTLX_) << BIT_SHIFT_CTLX_) +#define BIT_INV_CTLX_ (~(BIT_MASK_CTLX_ << BIT_SHIFT_CTLX_)) +*//* +#define BIT_SHIFT_CTLX_IIS_EN 0 +#define BIT_MASK_CTLX_IIS_EN 0x1 +#define BIT_CTLX_IIS_EN(x) (((x) & BIT_MASK_CTLX_IIS_EN) << BIT_SHIFT_CTLX_IIS_EN) +#define BIT_INV_CTLX_IIS_EN (~(BIT_MASK_CTLX_IIS_EN << BIT_SHIFT_CTLX_IIS_EN)) + +#define BIT_SHIFT_CTLX_TRX 1 +#define BIT_MASK_CTLX_TRX 0x3 +#define BIT_CTLX_TRX(x) (((x) & BIT_MASK_CTLX_TRX) << BIT_SHIFT_CTLX_TRX) +#define BIT_INV_CTLX_TRX (~(BIT_MASK_CTLX_TRX << BIT_SHIFT_CTLX_TRX)) + +#define BIT_SHIFT_CTLX_CH_NUM 3 +#define BIT_MASK_CTLX_CH_NUM 0x3 +#define BIT_CTLX_CH_NUM(x) (((x) & BIT_MASK_CTLX_CH_NUM) << BIT_SHIFT_CTLX_CH_NUM) +#define BIT_INV_CTLX_CH_NUM (~(BIT_MASK_CTLX_CH_NUM << BIT_SHIFT_CTLX_CH_NUM)) + +#define BIT_SHIFT_CTLX_EDGE_SW 5 +#define BIT_MASK_CTLX_EDGE_SW 0x1 +#define BIT_CTLX_EDGE_SW(x) (((x) & BIT_MASK_CTLX_EDGE_SW) << BIT_SHIFT_CTLX_EDGE_SW) +#define BIT_INV_CTLX_EDGE_SW (~(BIT_MASK_CTLX_EDGE_SW << BIT_SHIFT_CTLX_EDGE_SW)) + +#define BIT_SHIFT_CTLX_WL 6 +#define BIT_MASK_CTLX_WL 0x1 +#define BIT_CTLX_WL(x) (((x) & BIT_MASK_CTLX_WL) << BIT_SHIFT_CTLX_WL) +#define BIT_INV_CTLX_WL (~(BIT_MASK_CTLX_WL << BIT_SHIFT_CTLX_WL)) + +#define BIT_SHIFT_CTLX_LOOP_BACK 7 +#define BIT_MASK_CTLX_LOOP_BACK 0x1 +#define BIT_CTLX_LOOP_BACK(x) (((x) & BIT_MASK_CTLX_LOOP_BACK) << BIT_SHIFT_CTLX_LOOP_BACK) +#define BIT_INV_CTLX_LOOP_BACK (~(BIT_MASK_CTLX_LOOP_BACK << BIT_SHIFT_CTLX_LOOP_BACK)) + + +#define BIT_SHIFT_CTLX_FORMAT 8 +#define BIT_MASK_CTLX_FORMAT 0x3 +#define BIT_CTLX_FORMAT(x) (((x) & BIT_MASK_CTLX_FORMAT) << BIT_SHIFT_CTLX_FORMAT) +#define BIT_INV_CTLX_FORMAT (~(BIT_MASK_CTLX_FORMAT << BIT_SHIFT_CTLX_FORMAT)) + +#define BIT_SHIFT_CTLX_LRSWAP 10 +#define BIT_MASK_CTLX_LRSWAP 0x1 +#define BIT_CTLX_LRSWAP(x) (((x) & BIT_MASK_CTLX_LRSWAP) << BIT_SHIFT_CTLX_LRSWAP) +#define BIT_INV_CTLX_LRSWAP (~(BIT_MASK_CTLX_LRSWAP << BIT_SHIFT_CTLX_LRSWAP)) + +#define BIT_SHIFT_CTLX_SCK_INV 11 +#define BIT_MASK_CTLX_SCK_INV 0x1 +#define BIT_CTLX_SCK_INV(x) (((x) & BIT_MASK_CTLX_SCK_INV) << BIT_SHIFT_CTLX_SCK_INV) +#define BIT_INV_CTLX_SCK_INV (~(BIT_MASK_CTLX_SCK_INV << BIT_SHIFT_CTLX_SCK_INV)) + +#define BIT_SHIFT_CTLX_ENDIAN_SWAP 12 +#define BIT_MASK_CTLX_ENDIAN_SWAP 0x1 +#define BIT_CTLX_ENDIAN_SWAP(x) (((x) & BIT_MASK_CTLX_ENDIAN_SWAP) << BIT_SHIFT_CTLX_ENDIAN_SWAP) +#define BIT_INV_CTLX_ENDIAN_SWAP (~(BIT_MASK_CTLX_ENDIAN_SWAP << BIT_SHIFT_CTLX_ENDIAN_SWAP)) + + +#define BIT_SHIFT_CTLX_DEBUG_SWITCH 15 +#define BIT_MASK_CTLX_DEBUG_SWITCH 0x3 +#define BIT_CTLX_DEBUG_SWITCH(x) (((x) & BIT_MASK_CTLX_DEBUG_SWITCH) << BIT_SHIFT_CTLX_DEBUG_SWITCH) +#define BIT_INV_CTLX_DEBUG_SWITCH (~(BIT_MASK_CTLX_DEBUG_SWITCH << BIT_SHIFT_CTLX_DEBUG_SWITCH)) + +#define BIT_SHIFT_CTLX_SLAVE_SEL 29 +#define BIT_MASK_CTLX_SLAVE_SEL 0x1 +#define BIT_CTLX_SLAVE_SEL(x) (((x) & BIT_MASK_CTLX_SLAVE_SEL) << BIT_SHIFT_CTLX_SLAVE_SEL) +#define BIT_INV_CTLX_SLAVE_SEL (~(BIT_MASK_CTLX_SLAVE_SEL << BIT_SHIFT_CTLX_SLAVE_SEL)) + + +#define BIT_SHIFT_CTLX_CLK_SRC 30 +#define BIT_MASK_CTLX_CLK_SRC 0x1 +#define BIT_CTLX_CLK_SRC(x) (((x) & BIT_MASK_CTLX_CLK_SRC) << BIT_SHIFT_CTLX_CLK_SRC) +#define BIT_INV_CTLX_CLK_SRC (~(BIT_MASK_CTLX_CLK_SRC << BIT_SHIFT_CTLX_CLK_SRC)) + + + +#define BIT_SHIFT_CTLX_SW_RSTN 31 +#define BIT_MASK_CTLX_SW_RSTN 0x1 +#define BIT_CTLX_SW_RSTN(x) (((x) & BIT_MASK_CTLX_SW_RSTN) << BIT_SHIFT_CTLX_SW_RSTN) +#define BIT_INV_CTLX_SW_RSTN (~(BIT_MASK_CTLX_SW_RSTN << BIT_SHIFT_CTLX_SW_RSTN)) + + +#define BIT_SHIFT_SETTING_PAGE_SZ 0 +#define BIT_MASK_SETTING_PAGE_SZ 0xFFF +#define BIT_SETTING_PAGE_SZ(x) (((x) & BIT_MASK_SETTING_PAGE_SZ) << BIT_SHIFT_SETTING_PAGE_SZ) +#define BIT_INV_SETTING_PAGE_SZ (~(BIT_MASK_SETTING_PAGE_SZ << BIT_SHIFT_SETTING_PAGE_SZ)) + +#define BIT_SHIFT_SETTING_PAGE_NUM 12 +#define BIT_MASK_SETTING_PAGE_NUM 0x3 +#define BIT_SETTING_PAGE_NUM(x) (((x) & BIT_MASK_SETTING_PAGE_NUM) << BIT_SHIFT_SETTING_PAGE_NUM) +#define BIT_INV_SETTING_PAGE_NUM (~(BIT_MASK_SETTING_PAGE_NUM << BIT_SHIFT_SETTING_PAGE_NUM)) + +#define BIT_SHIFT_SETTING_SAMPLE_RATE 14 +#define BIT_MASK_SETTING_SAMPLE_RATE 0x7 +#define BIT_SETTING_SAMPLE_RATE(x) (((x) & BIT_MASK_SETTING_SAMPLE_RATE) << BIT_SHIFT_SETTING_SAMPLE_RATE) +#define BIT_INV_SETTING_SAMPLE_RATE (~(BIT_MASK_SETTING_SAMPLE_RATE << BIT_SHIFT_SETTING_SAMPLE_RATE)) +*/ + +typedef enum _I2S_CTL_FORMAT { + FormatI2s = 0x00, + FormatLeftJustified = 0x01, + FormatRightJustified = 0x02 +}I2S_CTL_FORMAT, *PI2S_CTL_FORMAT; + +typedef enum _I2S_CTL_CHNUM { + ChannelStereo = 0x00, + Channel5p1 = 0x01, + ChannelMono = 0x02 +}I2S_CTL_CHNUM, *PI2S_CTL_CHNUM; + +typedef enum _I2S_CTL_TRX_ACT { + RxOnly = 0x00, + TxOnly = 0x01, + TXRX = 0x02 +}I2S_CTL_TRX_ACT, *PI2S_CTL_TRX_ACT; +/* +typedef struct _I2S_CTL_REG_ { + I2S_CTL_FORMAT Format; + I2S_CTL_CHNUM ChNum; + I2S_CTL_TRX_ACT TrxAct; + + u32 I2s_En :1; // Bit 0 + u32 Rsvd1to4 :4; // Bit 1-4 is TrxAct, ChNum + u32 EdgeSw :1; // Bit 5 Edge switch + u32 WordLength :1; // Bit 6 + u32 LoopBack :1; // Bit 7 + u32 Rsvd8to9 :2; // Bit 8-9 is Format + u32 DacLrSwap :1; // Bit 10 + u32 SckInv :1; // Bit 11 + u32 EndianSwap :1; // Bit 12 + u32 Rsvd13to14 :2; // Bit 11-14 + u32 DebugSwitch :2; // Bit 15-16 + u32 Rsvd17to28 :12; // Bit 17-28 + u32 SlaveMode :1; // Bit 29 + u32 SR44p1KHz :1; // Bit 30 + u32 SwRstn :1; // Bit 31 +} I2S_CTL_REG, *PI2S_CTL_REG; +*/ +typedef enum _I2S_SETTING_PAGE_NUM { + I2s1Page = 0x00, + I2s2Page = 0x01, + I2s3Page = 0x02, + I2s4Page = 0x03 +}I2S_SETTING_PAGE_NUM, *PI2S_SETTING_PAGE_NUM; + +//sampling rate +typedef enum _I2S_SETTING_SR { + I2sSR8K = 0x00, + I2sSR16K = 0x01, + I2sSR24K = 0x02, + I2sSR32K = 0x03, + I2sSR48K = 0x05, + I2sSR44p1K = 0x15, + I2sSR96K = 0x06, + I2sSR88p2K = 0x16 +}I2S_SETTING_SR, *PI2S_SETTING_SR; +/* +typedef struct _I2S_SETTING_REG_ { + I2S_SETTING_PAGE_NUM PageNum; + I2S_SETTING_SR SampleRate; + + u32 PageSize:12; // Bit 0-11 +}I2S_SETTING_REG, *PI2S_SETTING_REG; + +typedef enum _I2S_TX_ISR { + I2sTxP0OK = 0x01, + I2sTxP1OK = 0x02, + I2sTxP2OK = 0x04, + I2sTxP3OK = 0x08, + I2sTxPageUn = 0x10, + I2sTxFifoEmpty = 0x20 +}I2S_TX_ISR, *PI2S_TX_ISR; + +typedef enum _I2S_RX_ISR { + I2sRxP0OK = 0x01, + I2sRxP1OK = 0x02, + I2sRxP2OK = 0x04, + I2sRxP3OK = 0x08, + I2sRxPageUn = 0x10, + I2sRxFifoFull = 0x20 +}I2S_RX_ISR, *PI2S_RX_ISR; +*/ + +/* Hal I2S function prototype*/ +RTK_STATUS +HalI2SInitRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SDeInitRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2STxRtl8195a( + IN VOID *Data, + IN u8 *pBuff +); + +RTK_STATUS +HalI2SRxRtl8195a( + IN VOID *Data, + OUT u8 *pBuff +); + +RTK_STATUS +HalI2SEnableRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SIntrCtrlRtl8195a( + IN VOID *Data +); + +u32 +HalI2SReadRegRtl8195a( + IN VOID *Data, + IN u8 I2SReg +); + +RTK_STATUS +HalI2SSetRateRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetWordLenRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetChNumRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetPageNumRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetPageSizeRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SClrIntrRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SClrAllIntrRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SDMACtrlRtl8195a( + IN VOID *Data +); + + + +/* + +VOID +HalI2sOnOffRtl8195a( + IN VOID *Data +); + +BOOL +HalI2sInitRtl8195a( + IN VOID *Data +); + +BOOL +HalI2sSettingRtl8195a( + IN VOID *Data +); + +BOOL +HalI2sEnRtl8195a( + IN VOID *Data +); + +BOOL +HalI2sIsrEnAndDisRtl8195a( + IN VOID *Data +); + +BOOL +HalI2sDumpRegRtl8195a( + IN VOID *Data +); + +BOOL +HalI2sRtl8195a( + IN VOID *Data +); +*/ +#endif /* _RTL8195A_I2S_H_ */ + + diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_peri_on.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_peri_on.h new file mode 100644 index 0000000..7dc04b4 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_peri_on.h @@ -0,0 +1,1252 @@ +#ifndef __INC_RTL8195A_PERI_ON_H +#define __INC_RTL8195A_PERI_ON_H + +#define CPU_OPT_WIDTH 0x1F + +//2 REG_NOT_VALID + +//2 REG_PEON_PWR_CTRL +#define BIT_SOC_UAHV_EN BIT(2) +#define BIT_SOC_UALV_EN BIT(1) +#define BIT_SOC_USBD_EN BIT(0) + +//2 REG_PON_ISO_CTRL + +//2 REG_NOT_VALID +#define BIT_ISO_OSC32K_EN BIT(4) +//#define BIT_ISO_USBA_EN BIT(1) +//#define BIT_ISO_USBD_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SOC_FUNC_EN +#define BIT_SOC_SECURITY_ENGINE_EN BIT(20) +#define BIT_SOC_GTIMER_EN BIT(16) +#define BIT_SOC_GDMA1_EN BIT(14) +#define BIT_SOC_GDMA0_EN BIT(13) +#define BIT_SOC_LOG_UART_EN BIT(12) +#define BIT_SOC_CPU_EN BIT(8) +#define BIT_SOC_MEM_CTRL_EN BIT(6) +#define BIT_SOC_FLASH_EN BIT(4) +#define BIT_SOC_LXBUS_EN BIT(2) +#define BIT_SOC_OCP_EN BIT(1) +#define BiT_SOC_FUN_EN BIT(0) + +//2 REG_SOC_HCI_COM_FUNC_EN +#define BIT_SOC_HCI_WL_MACON_EN BIT(16) +#define BIT_SOC_HCI_SM_SEL BIT(13) +#define BIT_SOC_HCI_MII_EN BIT(12) +#define BIT_SOC_HCI_OTG_RST_MUX BIT(5) +#define BIT_SOC_HCI_OTG_EN BIT(4) +#define BIT_SOC_HCI_SDIOD_ON_RST_MUX BIT(3) +#define BIT_SOC_HCI_SDIOH_EN BIT(2) +#define BIT_SOC_HCI_SDIOD_OFF_EN BIT(1) +#define BIT_SOC_HCI_SDIOD_ON_EN BIT(0) + +//2 REG_SOC_PERI_FUNC0_EN +#define BIT_PERI_PCM1_EN BIT(29) +#define BIT_PERI_PCM0_EN BIT(28) +#define BIT_PERI_I2S1_EN BIT(25) +#define BIT_PERI_I2S0_EN BIT(24) +#define BIT_PERI_I2C3_EN BIT(19) +#define BIT_PERI_I2C2_EN BIT(18) +#define BIT_PERI_I2C1_EN BIT(17) +#define BIT_PERI_I2C0_EN BIT(16) +#define BIT_PERI_SPI2_EN BIT(10) +#define BIT_PERI_SPI1_EN BIT(9) +#define BIT_PERI_SPI0_EN BIT(8) +#define BIT_PERI_UART2_EN BIT(2) +#define BIT_PERI_UART1_EN BIT(1) +#define BIT_PERI_UART0_EN BIT(0) + +//2 REG_SOC_PERI_FUNC1_EN +#define BIT_PERI_GPIO_EN BIT(8) +#define BIT_PERI_DAC1_EN BIT(5) +#define BIT_PERI_DAC0_EN BIT(4) +#define BIT_PERI_ADC0_EN BIT(0) + +//2 REG_SOC_PERI_BD_FUNC0_EN +#define BIT_PERI_UART2_BD_EN BIT(2) +#define BIT_PERI_UART1_BD_EN BIT(1) +#define BIT_PERI_UART0_BD_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_PESOC_CLK_CTRL +#define BIT_SOC_SLPCK_BTCMD_EN BIT(29) +#define BIT_SOC_ACTCK_BTCMD_EN BIT(28) +#define BIT_SOC_SLPCK_GPIO_EN BIT(25) +#define BIT_SOC_ACTCK_GPIO_EN BIT(24) +#define BIT_SOC_SLPCK_GDMA1_EN BIT(19) +#define BIT_SOC_ACTCK_GDMA1_EN BIT(18) +#define BIT_SOC_SLPCK_GDMA0_EN BIT(17) +#define BIT_SOC_ACTCK_GDMA0_EN BIT(16) +#define BIT_SOC_SLPCK_TIMER_EN BIT(15) +#define BIT_SOC_ACTCK_TIMER_EN BIT(14) +#define BIT_SOC_SLPCK_LOG_UART_EN BIT(13) +#define BIT_SOC_ACTCK_LOG_UART_EN BIT(12) +#define BIT_SOC_SLPCK_SDR_EN BIT(11) +#define BIT_SOC_ACTCK_SDR_EN BIT(10) +#define BIT_SOC_SLPCK_FLASH_EN BIT(9) +#define BIT_SOC_ACTCK_FLASH_EN BIT(8) +#define BIT_SOC_SLPCK_VENDOR_REG_EN BIT(7) +#define BIT_SOC_ACTCK_VENDOR_REG_EN BIT(6) +#define BIT_SOC_SLPCK_TRACE_EN BIT(5) +#define BIT_SOC_ACTCK_TRACE_EN BIT(4) +#define BIT_SOC_CKE_PLFM BIT(2) +#define BIT_SOC_CKE_OCP BIT(0) + +//2 REG_PESOC_PERI_CLK_CTRL0 +#define BIT_SOC_SLPCK_SPI2_EN BIT(21) +#define BIT_SOC_ACTCK_SPI2_EN BIT(20) +#define BIT_SOC_SLPCK_SPI1_EN BIT(19) +#define BIT_SOC_ACTCK_SPI1_EN BIT(18) +#define BIT_SOC_SLPCK_SPI0_EN BIT(17) +#define BIT_SOC_ACTCK_SPI0_EN BIT(16) +#define BIT_SOC_SLPCK_UART2_EN BIT(5) +#define BIT_SOC_ACTCK_UART2_EN BIT(4) +#define BIT_SOC_SLPCK_UART1_EN BIT(3) +#define BIT_SOC_ACTCK_UART1_EN BIT(2) +#define BIT_SOC_SLPCK_UART0_EN BIT(1) +#define BIT_SOC_ACTCK_UART0_EN BIT(0) + +//2 REG_PESOC_PERI_CLK_CTRL1 +#define BIT_SOC_SLPCK_DAC_EN BIT(29) +#define BIT_SOC_ACTCK_DAC_EN BIT(28) +#define BIT_SOC_SLPCK_ADC_EN BIT(25) +#define BIT_SOC_ACTCK_ADC_EN BIT(24) +#define BIT_SOC_SLPCK_PCM_EN BIT(21) +#define BIT_SOC_ACTCK_PCM_EN BIT(20) +#define BIT_SOC_SLPCK_I2S_EN BIT(17) +#define BIT_SOC_ACTCK_I2S_EN BIT(16) +#define BIT_SOC_SLPCK_I2C3_EN BIT(7) +#define BIT_SOC_ACTCK_I2C3_EN BIT(6) +#define BIT_SOC_SLPCK_I2C2_EN BIT(5) +#define BIT_SOC_ACTCK_I2C2_EN BIT(4) +#define BIT_SOC_SLPCK_I2C1_EN BIT(3) +#define BIT_SOC_ACTCK_I2C1_EN BIT(2) +#define BIT_SOC_SLPCK_I2C0_EN BIT(1) +#define BIT_SOC_ACTCK_I2C0_EN BIT(0) + +//2 REG_PESOC_CLK_CTRL3 + +//2 REG_PESOC_HCI_CLK_CTRL0 +#define BIT_SOC_SLPCK_MII_MPHY_EN BIT(25) +#define BIT_SOC_ACTCK_MII_MPHY_EN BIT(24) +#define BIT_SOC_SLPCK_OTG_EN BIT(5) +#define BIT_SOC_ACTCK_OTG_EN BIT(4) +#define BIT_SOC_SLPCK_SDIO_HST_EN BIT(3) +#define BIT_SOC_ACTCK_SDIO_HST_EN BIT(2) +#define BIT_SOC_SLPCK_SDIO_DEV_EN BIT(1) +#define BIT_SOC_ACTCK_SDIO_DEV_EN BIT(0) + +//2 REG_PESOC_COM_CLK_CTRL1 +#define BIT_SOC_NFC_CAL_EN BIT(18) +#define BIT_SOC_SLPCK_NFC_EN BIT(17) +#define BIT_SOC_ACTCK_NFC_EN BIT(16) +#define BIT_SOC_SLPCK_SECURITY_ENG_EN BIT(5) +#define BIT_SOC_ACTCK_SECURITY_ENG_EN BIT(4) +#define BIT_SOC_SLPCK_WL_EN BIT(1) +#define BIT_SOC_ACTCK_WL_EN BIT(0) + +//2 REG_PESOC_HW_ENG_CLK_CTRL + +//2 REG_RSVD + +//2 REG_PESOC_CLK_SEL +#define BIT_PESOC_SPI1_SCLK_SEL BIT(18) + +#define BIT_SHIFT_PESOC_PERI_SCLK_SEL 16 +#define BIT_MASK_PESOC_PERI_SCLK_SEL 0x3 +#define BIT_PESOC_PERI_SCLK_SEL(x) (((x) & BIT_MASK_PESOC_PERI_SCLK_SEL) << BIT_SHIFT_PESOC_PERI_SCLK_SEL) + + +#define BIT_SHIFT_PESOC_SDR_CK_SEL 10 +#define BIT_MASK_PESOC_SDR_CK_SEL 0x3 +#define BIT_PESOC_SDR_CK_SEL(x) (((x) & BIT_MASK_PESOC_SDR_CK_SEL) << BIT_SHIFT_PESOC_SDR_CK_SEL) + + +#define BIT_SHIFT_PESOC_FLASH_CK_SEL 8 +#define BIT_MASK_PESOC_FLASH_CK_SEL 0x3 +#define BIT_PESOC_FLASH_CK_SEL(x) (((x) & BIT_MASK_PESOC_FLASH_CK_SEL) << BIT_SHIFT_PESOC_FLASH_CK_SEL) + + +#define BIT_SHIFT_PESOC_TRACE_CK_SEL 4 +#define BIT_MASK_PESOC_TRACE_CK_SEL 0x3 +#define BIT_PESOC_TRACE_CK_SEL(x) (((x) & BIT_MASK_PESOC_TRACE_CK_SEL) << BIT_SHIFT_PESOC_TRACE_CK_SEL) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_SYS_ANACK_CAL_CTRL +#define BIT_SYS_ANACK_CAL_CMD BIT(15) +#define BIT_SYS_ANACK_CAL_SEL BIT(14) + +#define BIT_SHIFT_SYS_ANACK_CAL_RPT 0 +#define BIT_MASK_SYS_ANACK_CAL_RPT 0x3fff +#define BIT_SYS_ANACK_CAL_RPT(x) (((x) & BIT_MASK_SYS_ANACK_CAL_RPT) << BIT_SHIFT_SYS_ANACK_CAL_RPT) + + +//2 REG_OSC32K_CTRL + +#define BIT_SHIFT_32K_BIAS_CURRENT 16 +#define BIT_MASK_32K_BIAS_CURRENT 0xffff +#define BIT_32K_BIAS_CURRENT(x) (((x) & BIT_MASK_32K_BIAS_CURRENT) << BIT_SHIFT_32K_BIAS_CURRENT) + + +#define BIT_SHIFT_32K_RESISTOR_COM 2 +#define BIT_MASK_32K_RESISTOR_COM 0x3 +#define BIT_32K_RESISTOR_COM(x) (((x) & BIT_MASK_32K_RESISTOR_COM) << BIT_SHIFT_32K_RESISTOR_COM) + +#define BIT_32K_DBG_SEL BIT(1) +#define BIT_32K_POW_CKGEN_EN BIT(0) + +//2 REG_OSC32K_REG_CTRL0 +#define BIT_32K_REG_INDIRT_CMD BIT(23) + +#define BIT_SHIFT_32K_REG_INDIRT_ADDR 16 +#define BIT_MASK_32K_REG_INDIRT_ADDR 0x3f +#define BIT_32K_REG_INDIRT_ADDR(x) (((x) & BIT_MASK_32K_REG_INDIRT_ADDR) << BIT_SHIFT_32K_REG_INDIRT_ADDR) + + +#define BIT_SHIFT_32K_REG_INDIRT_WDATA 0 +#define BIT_MASK_32K_REG_INDIRT_WDATA 0xffff +#define BIT_32K_REG_INDIRT_WDATA(x) (((x) & BIT_MASK_32K_REG_INDIRT_WDATA) << BIT_SHIFT_32K_REG_INDIRT_WDATA) + + +//2 REG_OSC32K_REG_CTRL1 + +#define BIT_SHIFT_32K_REG_INDIRT_RDATA 0 +#define BIT_MASK_32K_REG_INDIRT_RDATA 0xffff +#define BIT_32K_REG_INDIRT_RDATA(x) (((x) & BIT_MASK_32K_REG_INDIRT_RDATA) << BIT_SHIFT_32K_REG_INDIRT_RDATA) + + +//2 REG_THERMAL_METER_CTRL + +#define BIT_SHIFT_TEMP_VALUE 24 +#define BIT_MASK_TEMP_VALUE 0x3f +#define BIT_TEMP_VALUE(x) (((x) & BIT_MASK_TEMP_VALUE) << BIT_SHIFT_TEMP_VALUE) + + +#define BIT_SHIFT_TEMP_DELTA 16 +#define BIT_MASK_TEMP_DELTA 0x3f +#define BIT_TEMP_DELTA(x) (((x) & BIT_MASK_TEMP_DELTA) << BIT_SHIFT_TEMP_DELTA) + +#define BIT_THERMAL_METER_EN BIT(15) +#define BIT_THERMAL_METER_VALID BIT(14) + +#define BIT_SHIFT_THERMAL_METER_TIMER 0 +#define BIT_MASK_THERMAL_METER_TIMER 0xfff +#define BIT_THERMAL_METER_TIMER(x) (((x) & BIT_MASK_THERMAL_METER_TIMER) << BIT_SHIFT_THERMAL_METER_TIMER) + + +//2 REG_UART_MUX_CTRL + +#define BIT_SHIFT_UART2_PIN_SEL 9 +#define BIT_MASK_UART2_PIN_SEL 0x7 +#define BIT_UART2_PIN_SEL(x) (((x) & BIT_MASK_UART2_PIN_SEL) << BIT_SHIFT_UART2_PIN_SEL) + +#define BIT_UART2_PIN_EN BIT(8) + +#define BIT_SHIFT_UART1_PIN_SEL 5 +#define BIT_MASK_UART1_PIN_SEL 0x7 +#define BIT_UART1_PIN_SEL(x) (((x) & BIT_MASK_UART1_PIN_SEL) << BIT_SHIFT_UART1_PIN_SEL) + +#define BIT_UART1_PIN_EN BIT(4) + +#define BIT_SHIFT_UART0_PIN_SEL 1 +#define BIT_MASK_UART0_PIN_SEL 0x7 +#define BIT_UART0_PIN_SEL(x) (((x) & BIT_MASK_UART0_PIN_SEL) << BIT_SHIFT_UART0_PIN_SEL) + +#define BIT_UART0_PIN_EN BIT(0) + +//2 REG_SPI_MUX_CTRL +#define BIT_SPI0_MULTI_CS_EN BIT(28) + +#define BIT_SHIFT_SPI2_PIN_SEL 9 +#define BIT_MASK_SPI2_PIN_SEL 0x7 +#define BIT_SPI2_PIN_SEL(x) (((x) & BIT_MASK_SPI2_PIN_SEL) << BIT_SHIFT_SPI2_PIN_SEL) + +#define BIT_SPI2_PIN_EN BIT(8) + +#define BIT_SHIFT_SPI1_PIN_SEL 5 +#define BIT_MASK_SPI1_PIN_SEL 0x7 +#define BIT_SPI1_PIN_SEL(x) (((x) & BIT_MASK_SPI1_PIN_SEL) << BIT_SHIFT_SPI1_PIN_SEL) + +#define BIT_SPI1_PIN_EN BIT(4) + +#define BIT_SHIFT_SPI0_PIN_SEL 1 +#define BIT_MASK_SPI0_PIN_SEL 0x7 +#define BIT_SPI0_PIN_SEL(x) (((x) & BIT_MASK_SPI0_PIN_SEL) << BIT_SHIFT_SPI0_PIN_SEL) + +#define BIT_SPI0_PIN_EN BIT(0) + +//2 REG_I2C_MUX_CTRL + +#define BIT_SHIFT_I2C3_PIN_SEL 13 +#define BIT_MASK_I2C3_PIN_SEL 0x7 +#define BIT_I2C3_PIN_SEL(x) (((x) & BIT_MASK_I2C3_PIN_SEL) << BIT_SHIFT_I2C3_PIN_SEL) + +#define BIT_I2C3_PIN_EN BIT(12) + +#define BIT_SHIFT_I2C2_PIN_SEL 9 +#define BIT_MASK_I2C2_PIN_SEL 0x7 +#define BIT_I2C2_PIN_SEL(x) (((x) & BIT_MASK_I2C2_PIN_SEL) << BIT_SHIFT_I2C2_PIN_SEL) + +#define BIT_I2C2_PIN_EN BIT(8) + +#define BIT_SHIFT_I2C1_PIN_SEL 5 +#define BIT_MASK_I2C1_PIN_SEL 0x7 +#define BIT_I2C1_PIN_SEL(x) (((x) & BIT_MASK_I2C1_PIN_SEL) << BIT_SHIFT_I2C1_PIN_SEL) + +#define BIT_I2C1_PIN_EN BIT(4) + +#define BIT_SHIFT_I2C0_PIN_SEL 1 +#define BIT_MASK_I2C0_PIN_SEL 0x7 +#define BIT_I2C0_PIN_SEL(x) (((x) & BIT_MASK_I2C0_PIN_SEL) << BIT_SHIFT_I2C0_PIN_SEL) + +#define BIT_I2C0_PIN_EN BIT(0) + +//2 REG_I2S_MUX_CTRL/ REG_PCM_MUX_CTRL + +//2 REG_NOT_VALID + +#define BIT_SHIFT_PCM1_PIN_SEL 21 +#define BIT_MASK_PCM1_PIN_SEL 0x7 +#define BIT_PCM1_PIN_SEL(x) (((x) & BIT_MASK_PCM1_PIN_SEL) << BIT_SHIFT_PCM1_PIN_SEL) + +#define BIT_PCM1_PIN_EN BIT(20) + +#define BIT_SHIFT_PCM0_PIN_SEL 17 +#define BIT_MASK_PCM0_PIN_SEL 0x7 +#define BIT_PCM0_PIN_SEL(x) (((x) & BIT_MASK_PCM0_PIN_SEL) << BIT_SHIFT_PCM0_PIN_SEL) + +#define BIT_PCM0_PIN_EN BIT(16) + +//2 REG_NOT_VALID + +#define BIT_SHIFT_I2S1_PIN_SEL 6 +#define BIT_MASK_I2S1_PIN_SEL 0x3 +#define BIT_I2S1_PIN_SEL(x) (((x) & BIT_MASK_I2S1_PIN_SEL) << BIT_SHIFT_I2S1_PIN_SEL) + +#define BIT_I2S1_MCK_EN BIT(5) +#define BIT_I2S1_PIN_EN BIT(4) + +#define BIT_SHIFT_I2S0_PIN_SEL 2 +#define BIT_MASK_I2S0_PIN_SEL 0x3 +#define BIT_I2S0_PIN_SEL(x) (((x) & BIT_MASK_I2S0_PIN_SEL) << BIT_SHIFT_I2S0_PIN_SEL) + +#define BIT_I2S0_MCK_EN BIT(1) +#define BIT_I2S0_PIN_EN BIT(0) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_HCI_PINMUX_CTRL +#define BIT_HCI_MII_PIN_EN BIT(24) +#define BIT_HCI_SDIOH_PIN_EN BIT(1) +#define BIT_HCI_SDIOD_PIN_EN BIT(0) + +//2 REG_WL_PINMUX_CTRL +#define BIT_NFC_PIN_EN BIT(16) +#define BIT_WL_BTCMD_PIN_EN BIT(13) +#define BIT_WL_BTCOEX_PIN_EN BIT(12) +#define BIT_WL_ANT1_PIN_EN BIT(9) +#define BIT_WL_ANT0_PIN_EN BIT(8) + +#define BIT_SHIFT_WL_LED_PIN_SEL 1 +#define BIT_MASK_WL_LED_PIN_SEL 0x3 +#define BIT_WL_LED_PIN_SEL(x) (((x) & BIT_MASK_WL_LED_PIN_SEL) << BIT_SHIFT_WL_LED_PIN_SEL) + +#define BIT_WL_LED_PIN_EN BIT(0) + +//2 REG_BT_PINMUX_CTRL + +//2 REG_PWM_PINMUX_CTRL + +#define BIT_SHIFT_ETE3_PIN_SEL 29 +#define BIT_MASK_ETE3_PIN_SEL 0x3 +#define BIT_ETE3_PIN_SEL(x) (((x) & BIT_MASK_ETE3_PIN_SEL) << BIT_SHIFT_ETE3_PIN_SEL) + +#define BIT_ETE3_PIN_EN BIT(28) + +#define BIT_SHIFT_ETE2_PIN_SEL 25 +#define BIT_MASK_ETE2_PIN_SEL 0x3 +#define BIT_ETE2_PIN_SEL(x) (((x) & BIT_MASK_ETE2_PIN_SEL) << BIT_SHIFT_ETE2_PIN_SEL) + +#define BIT_ETE2_PIN_EN BIT(24) + +#define BIT_SHIFT_ETE1_PIN_SEL 21 +#define BIT_MASK_ETE1_PIN_SEL 0x3 +#define BIT_ETE1_PIN_SEL(x) (((x) & BIT_MASK_ETE1_PIN_SEL) << BIT_SHIFT_ETE1_PIN_SEL) + +#define BIT_ETE1_PIN_EN BIT(20) + +#define BIT_SHIFT_ETE0_PIN_SEL 17 +#define BIT_MASK_ETE0_PIN_SEL 0x3 +#define BIT_ETE0_PIN_SEL(x) (((x) & BIT_MASK_ETE0_PIN_SEL) << BIT_SHIFT_ETE0_PIN_SEL) + +#define BIT_ETE0_PIN_EN BIT(16) + +#define BIT_SHIFT_PWM3_PIN_SEL 13 +#define BIT_MASK_PWM3_PIN_SEL 0x3 +#define BIT_PWM3_PIN_SEL(x) (((x) & BIT_MASK_PWM3_PIN_SEL) << BIT_SHIFT_PWM3_PIN_SEL) + +#define BIT_PWM3_PIN_EN BIT(12) + +#define BIT_SHIFT_PWM2_PIN_SEL 9 +#define BIT_MASK_PWM2_PIN_SEL 0x3 +#define BIT_PWM2_PIN_SEL(x) (((x) & BIT_MASK_PWM2_PIN_SEL) << BIT_SHIFT_PWM2_PIN_SEL) + +#define BIT_PWM2_PIN_EN BIT(8) + +#define BIT_SHIFT_PWM1_PIN_SEL 5 +#define BIT_MASK_PWM1_PIN_SEL 0x3 +#define BIT_PWM1_PIN_SEL(x) (((x) & BIT_MASK_PWM1_PIN_SEL) << BIT_SHIFT_PWM1_PIN_SEL) + +#define BIT_PWM1_PIN_EN BIT(4) + +#define BIT_SHIFT_PWM0_PIN_SEL 1 +#define BIT_MASK_PWM0_PIN_SEL 0x3 +#define BIT_PWM0_PIN_SEL(x) (((x) & BIT_MASK_PWM0_PIN_SEL) << BIT_SHIFT_PWM0_PIN_SEL) + +#define BIT_PWM0_PIN_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_CPU_PERIPHERAL_CTRL + +#define BIT_SHIFT_LOG_UART_PIN_SEL 22 +#define BIT_MASK_LOG_UART_PIN_SEL 0x3 +#define BIT_LOG_UART_PIN_SEL(x) (((x) & BIT_MASK_LOG_UART_PIN_SEL) << BIT_SHIFT_LOG_UART_PIN_SEL) + +#define BIT_LOG_UART_IR_EN BIT(21) +#define BIT_LOG_UART_PIN_EN BIT(20) +#define BIT_TRACE_PIN_EN BIT(17) +#define BIT_JTAG_PIN_EN BIT(16) +#define BIT_SDR_PIN_EN BIT(4) + +#define BIT_SHIFT_SPI_FLSH_PIN_SEL 1 +#define BIT_MASK_SPI_FLSH_PIN_SEL 0x3 +#define BIT_SPI_FLSH_PIN_SEL(x) (((x) & BIT_MASK_SPI_FLSH_PIN_SEL) << BIT_SHIFT_SPI_FLSH_PIN_SEL) + +#define BIT_SPI_FLSH_PIN_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_HCI_CTRL_STATUS_0 + +//2 REG_HCI_CTRL_STATUS_1 + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_PESOC_MEM_CTRL + +#define BIT_SHIFT_PESOC_SDR_DDL_CTRL 16 +#define BIT_MASK_PESOC_SDR_DDL_CTRL 0xff +#define BIT_PESOC_SDR_DDL_CTRL(x) (((x) & BIT_MASK_PESOC_SDR_DDL_CTRL) << BIT_SHIFT_PESOC_SDR_DDL_CTRL) + + +#define BIT_SHIFT_PESOC_FLASH_DDL_CTRL 0 +#define BIT_MASK_PESOC_FLASH_DDL_CTRL 0xff +#define BIT_PESOC_FLASH_DDL_CTRL(x) (((x) & BIT_MASK_PESOC_FLASH_DDL_CTRL) << BIT_SHIFT_PESOC_FLASH_DDL_CTRL) + + +//2 REG_PESOC_SOC_CTRL + +#define BIT_SHIFT_PESOC_GDMA_CFG 16 +#define BIT_MASK_PESOC_GDMA_CFG 0x1fff +#define BIT_PESOC_GDMA_CFG(x) (((x) & BIT_MASK_PESOC_GDMA_CFG) << BIT_SHIFT_PESOC_GDMA_CFG) + +#define BIT_PESOC_MII_LX_SLV_SWAP_SEL BIT(13) +#define BIT_PESOC_MII_LX_MST_SWAP_SEL BIT(12) +#define BIT_PESOC_MII_LX_WRAPPER_EN BIT(11) +#define BIT_PESOC_LX_SLV_SWAP_SEL BIT(10) +#define BIT_PESOC_LX_MST_SWAP_SEL BIT(9) +#define BIT_PESOC_LX_WL_SWAP_SEL BIT(8) + +#define BIT_SHIFT_PESOC_SRAM_MUX_CFG 0 +#define BIT_MASK_PESOC_SRAM_MUX_CFG 0x7 +#define BIT_PESOC_SRAM_MUX_CFG(x) (((x) & BIT_MASK_PESOC_SRAM_MUX_CFG) << BIT_SHIFT_PESOC_SRAM_MUX_CFG) + + +//2 REG_PESOC_PERI_CTRL +#define BIT_SOC_FUNC_SPI_RN BIT(8) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_FW_CTRL_INT0 BIT(24) + +//2 REG_NOT_VALID + +//2 REG_GPIO_SHTDN_CTRL +#define BIT_GPIO_GPK_SHTDN_N BIT(10) +#define BIT_GPIO_GPJ_SHTDN_N BIT(9) +#define BIT_GPIO_GPI_SHTDN_N BIT(8) +#define BIT_GPIO_GPH_SHTDN_N BIT(7) +#define BIT_GPIO_GPG_SHTDN_N BIT(6) +#define BIT_GPIO_GPF_SHTDN_N BIT(5) +#define BIT_GPIO_GPE_SHTDN_N BIT(4) +#define BIT_GPIO_GPD_SHTDN_N BIT(3) +#define BIT_GPIO_GPC_SHTDN_N BIT(2) +#define BIT_GPIO_GPB_SHTDN_N BIT(1) +#define BIT_GPIO_GPA_SHTDN_N BIT(0) + +//2 REG_GPIO_DRIVING_CTRL +#define BIT_GPIO_GPK_DRV_SEL BIT(20) +#define BIT_GPIO_GPJ_DRV_SEL BIT(18) +#define BIT_GPIO_GPI_DRV_SEL BIT(16) +#define BIT_GPIO_GPH_DRV_SEL BIT(14) +#define BIT_GPIO_GPG_DRV_SEL BIT(12) +#define BIT_GPIO_GPF_DRV_SEL BIT(10) +#define BIT_GPIO_GPE_DRV_SEL BIT(8) +#define BIT_GPIO_GPD_DRV_SEL BIT(6) +#define BIT_GPIO_GPC_DRV_SEL BIT(4) +#define BIT_GPIO_GPB_DRV_SEL BIT(2) +#define BIT_GPIO_GPA_DRV_SEL BIT(0) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_GPIO_PULL_CTRL0 + +#define BIT_SHIFT_GPIO_GPB7_PULL_CTRL 30 +#define BIT_MASK_GPIO_GPB7_PULL_CTRL 0x3 +#define BIT_GPIO_GPB7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB7_PULL_CTRL) << BIT_SHIFT_GPIO_GPB7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPB6_PULL_CTRL 0x3 +#define BIT_GPIO_GPB6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB6_PULL_CTRL) << BIT_SHIFT_GPIO_GPB6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPB5_PULL_CTRL 0x3 +#define BIT_GPIO_GPB5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB5_PULL_CTRL) << BIT_SHIFT_GPIO_GPB5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPB4_PULL_CTRL 0x3 +#define BIT_GPIO_GPB4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB4_PULL_CTRL) << BIT_SHIFT_GPIO_GPB4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPB3_PULL_CTRL 0x3 +#define BIT_GPIO_GPB3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB3_PULL_CTRL) << BIT_SHIFT_GPIO_GPB3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPB2_PULL_CTRL 0x3 +#define BIT_GPIO_GPB2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB2_PULL_CTRL) << BIT_SHIFT_GPIO_GPB2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPB1_PULL_CTRL 0x3 +#define BIT_GPIO_GPB1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB1_PULL_CTRL) << BIT_SHIFT_GPIO_GPB1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPB0_PULL_CTRL 0x3 +#define BIT_GPIO_GPB0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB0_PULL_CTRL) << BIT_SHIFT_GPIO_GPB0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPA7_PULL_CTRL 0x3 +#define BIT_GPIO_GPA7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA7_PULL_CTRL) << BIT_SHIFT_GPIO_GPA7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPA6_PULL_CTRL 0x3 +#define BIT_GPIO_GPA6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA6_PULL_CTRL) << BIT_SHIFT_GPIO_GPA6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPA5_PULL_CTRL 0x3 +#define BIT_GPIO_GPA5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA5_PULL_CTRL) << BIT_SHIFT_GPIO_GPA5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPA4_PULL_CTRL 0x3 +#define BIT_GPIO_GPA4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA4_PULL_CTRL) << BIT_SHIFT_GPIO_GPA4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPA3_PULL_CTRL 0x3 +#define BIT_GPIO_GPA3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA3_PULL_CTRL) << BIT_SHIFT_GPIO_GPA3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPA2_PULL_CTRL 0x3 +#define BIT_GPIO_GPA2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA2_PULL_CTRL) << BIT_SHIFT_GPIO_GPA2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPA1_PULL_CTRL 0x3 +#define BIT_GPIO_GPA1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA1_PULL_CTRL) << BIT_SHIFT_GPIO_GPA1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPA0_PULL_CTRL 0x3 +#define BIT_GPIO_GPA0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA0_PULL_CTRL) << BIT_SHIFT_GPIO_GPA0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL1 + +#define BIT_SHIFT_GPIO_GPD7_PULL_CTRL 29 +#define BIT_MASK_GPIO_GPD7_PULL_CTRL 0x7 +#define BIT_GPIO_GPD7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD7_PULL_CTRL) << BIT_SHIFT_GPIO_GPD7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPD6_PULL_CTRL 0x3 +#define BIT_GPIO_GPD6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD6_PULL_CTRL) << BIT_SHIFT_GPIO_GPD6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPD5_PULL_CTRL 0x3 +#define BIT_GPIO_GPD5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD5_PULL_CTRL) << BIT_SHIFT_GPIO_GPD5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPD4_PULL_CTRL 0x3 +#define BIT_GPIO_GPD4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD4_PULL_CTRL) << BIT_SHIFT_GPIO_GPD4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPD3_PULL_CTRL 0x3 +#define BIT_GPIO_GPD3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD3_PULL_CTRL) << BIT_SHIFT_GPIO_GPD3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPD2_PULL_CTRL 0x3 +#define BIT_GPIO_GPD2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD2_PULL_CTRL) << BIT_SHIFT_GPIO_GPD2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPD1_PULL_CTRL 0x3 +#define BIT_GPIO_GPD1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD1_PULL_CTRL) << BIT_SHIFT_GPIO_GPD1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPD0_PULL_CTRL 0x3 +#define BIT_GPIO_GPD0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD0_PULL_CTRL) << BIT_SHIFT_GPIO_GPD0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPC7_PULL_CTRL 0x3 +#define BIT_GPIO_GPC7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC7_PULL_CTRL) << BIT_SHIFT_GPIO_GPC7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPC6_PULL_CTRL 0x3 +#define BIT_GPIO_GPC6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC6_PULL_CTRL) << BIT_SHIFT_GPIO_GPC6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPC5_PULL_CTRL 0x3 +#define BIT_GPIO_GPC5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC5_PULL_CTRL) << BIT_SHIFT_GPIO_GPC5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPC4_PULL_CTRL 0x3 +#define BIT_GPIO_GPC4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC4_PULL_CTRL) << BIT_SHIFT_GPIO_GPC4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPC3_PULL_CTRL 0x3 +#define BIT_GPIO_GPC3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC3_PULL_CTRL) << BIT_SHIFT_GPIO_GPC3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPC2_PULL_CTRL 0x3 +#define BIT_GPIO_GPC2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC2_PULL_CTRL) << BIT_SHIFT_GPIO_GPC2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPC1_PULL_CTRL 0x3 +#define BIT_GPIO_GPC1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC1_PULL_CTRL) << BIT_SHIFT_GPIO_GPC1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPC0_PULL_CTRL 0x3 +#define BIT_GPIO_GPC0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC0_PULL_CTRL) << BIT_SHIFT_GPIO_GPC0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL2 + +#define BIT_SHIFT_GPIO_GPF5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPF5_PULL_CTRL 0x3 +#define BIT_GPIO_GPF5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF5_PULL_CTRL) << BIT_SHIFT_GPIO_GPF5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPF4_PULL_CTRL 0x3 +#define BIT_GPIO_GPF4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF4_PULL_CTRL) << BIT_SHIFT_GPIO_GPF4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPF3_PULL_CTRL 0x3 +#define BIT_GPIO_GPF3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF3_PULL_CTRL) << BIT_SHIFT_GPIO_GPF3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPF2_PULL_CTRL 0x3 +#define BIT_GPIO_GPF2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF2_PULL_CTRL) << BIT_SHIFT_GPIO_GPF2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPF1_PULL_CTRL 0x3 +#define BIT_GPIO_GPF1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF1_PULL_CTRL) << BIT_SHIFT_GPIO_GPF1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPF0_PULL_CTRL 0x3 +#define BIT_GPIO_GPF0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF0_PULL_CTRL) << BIT_SHIFT_GPIO_GPF0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPE7_PULL_CTRL 0x3 +#define BIT_GPIO_GPE7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE7_PULL_CTRL) << BIT_SHIFT_GPIO_GPE7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPE6_PULL_CTRL 0x3 +#define BIT_GPIO_GPE6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE6_PULL_CTRL) << BIT_SHIFT_GPIO_GPE6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPE5_PULL_CTRL 0x3 +#define BIT_GPIO_GPE5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE5_PULL_CTRL) << BIT_SHIFT_GPIO_GPE5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPE4_PULL_CTRL 0x3 +#define BIT_GPIO_GPE4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE4_PULL_CTRL) << BIT_SHIFT_GPIO_GPE4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPE3_PULL_CTRL 0x3 +#define BIT_GPIO_GPE3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE3_PULL_CTRL) << BIT_SHIFT_GPIO_GPE3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPE2_PULL_CTRL 0x3 +#define BIT_GPIO_GPE2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE2_PULL_CTRL) << BIT_SHIFT_GPIO_GPE2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPE1_PULL_CTRL 0x3 +#define BIT_GPIO_GPE1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE1_PULL_CTRL) << BIT_SHIFT_GPIO_GPE1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPE0_PULL_CTRL 0x3 +#define BIT_GPIO_GPE0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE0_PULL_CTRL) << BIT_SHIFT_GPIO_GPE0_PULL_CTRL) + + +//2 REG_NOT_VALID + +#define BIT_SHIFT_GPIO_GPH7_PULL_CTRL 30 +#define BIT_MASK_GPIO_GPH7_PULL_CTRL 0x3 +#define BIT_GPIO_GPH7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH7_PULL_CTRL) << BIT_SHIFT_GPIO_GPH7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPH6_PULL_CTRL 0x3 +#define BIT_GPIO_GPH6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH6_PULL_CTRL) << BIT_SHIFT_GPIO_GPH6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPH5_PULL_CTRL 0x3 +#define BIT_GPIO_GPH5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH5_PULL_CTRL) << BIT_SHIFT_GPIO_GPH5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPH4_PULL_CTRL 0x3 +#define BIT_GPIO_GPH4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH4_PULL_CTRL) << BIT_SHIFT_GPIO_GPH4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPH3_PULL_CTRL 0x3 +#define BIT_GPIO_GPH3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH3_PULL_CTRL) << BIT_SHIFT_GPIO_GPH3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPH2_PULL_CTRL 0x3 +#define BIT_GPIO_GPH2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH2_PULL_CTRL) << BIT_SHIFT_GPIO_GPH2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPH1_PULL_CTRL 0x3 +#define BIT_GPIO_GPH1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH1_PULL_CTRL) << BIT_SHIFT_GPIO_GPH1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPH0_PULL_CTRL 0x3 +#define BIT_GPIO_GPH0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH0_PULL_CTRL) << BIT_SHIFT_GPIO_GPH0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPG7_PULL_CTRL 0x3 +#define BIT_GPIO_GPG7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG7_PULL_CTRL) << BIT_SHIFT_GPIO_GPG7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPG6_PULL_CTRL 0x3 +#define BIT_GPIO_GPG6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG6_PULL_CTRL) << BIT_SHIFT_GPIO_GPG6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPG5_PULL_CTRL 0x3 +#define BIT_GPIO_GPG5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG5_PULL_CTRL) << BIT_SHIFT_GPIO_GPG5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPG4_PULL_CTRL 0x3 +#define BIT_GPIO_GPG4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG4_PULL_CTRL) << BIT_SHIFT_GPIO_GPG4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPG3_PULL_CTRL 0x3 +#define BIT_GPIO_GPG3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG3_PULL_CTRL) << BIT_SHIFT_GPIO_GPG3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPG2_PULL_CTRL 0x3 +#define BIT_GPIO_GPG2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG2_PULL_CTRL) << BIT_SHIFT_GPIO_GPG2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPG1_PULL_CTRL 0x3 +#define BIT_GPIO_GPG1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG1_PULL_CTRL) << BIT_SHIFT_GPIO_GPG1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPG0_PULL_CTRL 0x3 +#define BIT_GPIO_GPG0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG0_PULL_CTRL) << BIT_SHIFT_GPIO_GPG0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL4 + +#define BIT_SHIFT_GPIO_GPJ6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPJ6_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ6_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPJ5_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ5_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPJ4_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ4_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPJ3_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ3_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPJ2_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ2_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPJ1_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ1_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPJ0_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ0_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPI7_PULL_CTRL 0x3 +#define BIT_GPIO_GPI7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI7_PULL_CTRL) << BIT_SHIFT_GPIO_GPI7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPI6_PULL_CTRL 0x3 +#define BIT_GPIO_GPI6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI6_PULL_CTRL) << BIT_SHIFT_GPIO_GPI6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPI5_PULL_CTRL 0x3 +#define BIT_GPIO_GPI5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI5_PULL_CTRL) << BIT_SHIFT_GPIO_GPI5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPI4_PULL_CTRL 0x3 +#define BIT_GPIO_GPI4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI4_PULL_CTRL) << BIT_SHIFT_GPIO_GPI4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPI3_PULL_CTRL 0x3 +#define BIT_GPIO_GPI3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI3_PULL_CTRL) << BIT_SHIFT_GPIO_GPI3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPI2_PULL_CTRL 0x3 +#define BIT_GPIO_GPI2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI2_PULL_CTRL) << BIT_SHIFT_GPIO_GPI2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPI1_PULL_CTRL 0x3 +#define BIT_GPIO_GPI1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI1_PULL_CTRL) << BIT_SHIFT_GPIO_GPI1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPI0_PULL_CTRL 0x3 +#define BIT_GPIO_GPI0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI0_PULL_CTRL) << BIT_SHIFT_GPIO_GPI0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL5 + +#define BIT_SHIFT_GPIO_GPEA_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPEA_PULL_CTRL 0x3 +#define BIT_GPIO_GPEA_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPEA_PULL_CTRL) << BIT_SHIFT_GPIO_GPEA_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE9_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPE9_PULL_CTRL 0x3 +#define BIT_GPIO_GPE9_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE9_PULL_CTRL) << BIT_SHIFT_GPIO_GPE9_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE8_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPE8_PULL_CTRL 0x3 +#define BIT_GPIO_GPE8_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE8_PULL_CTRL) << BIT_SHIFT_GPIO_GPE8_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK7_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPK7_PULL_CTRL 0x3 +#define BIT_GPIO_GPK7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK7_PULL_CTRL) << BIT_SHIFT_GPIO_GPK7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPK5_PULL_CTRL 0x3 +#define BIT_GPIO_GPK5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK5_PULL_CTRL) << BIT_SHIFT_GPIO_GPK5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPK4_PULL_CTRL 0x3 +#define BIT_GPIO_GPK4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK4_PULL_CTRL) << BIT_SHIFT_GPIO_GPK4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPK3_PULL_CTRL 0x3 +#define BIT_GPIO_GPK3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK3_PULL_CTRL) << BIT_SHIFT_GPIO_GPK3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPK2_PULL_CTRL 0x3 +#define BIT_GPIO_GPK2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK2_PULL_CTRL) << BIT_SHIFT_GPIO_GPK2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPK1_PULL_CTRL 0x3 +#define BIT_GPIO_GPK1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK1_PULL_CTRL) << BIT_SHIFT_GPIO_GPK1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPK0_PULL_CTRL 0x3 +#define BIT_GPIO_GPK0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK0_PULL_CTRL) << BIT_SHIFT_GPIO_GPK0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL6 + +#define BIT_SHIFT_GPIO_GPD9_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPD9_PULL_CTRL 0x3 +#define BIT_GPIO_GPD9_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD9_PULL_CTRL) << BIT_SHIFT_GPIO_GPD9_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD8_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPD8_PULL_CTRL 0x3 +#define BIT_GPIO_GPD8_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD8_PULL_CTRL) << BIT_SHIFT_GPIO_GPD8_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC9_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPC9_PULL_CTRL 0x3 +#define BIT_GPIO_GPC9_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC9_PULL_CTRL) << BIT_SHIFT_GPIO_GPC9_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC8_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPC8_PULL_CTRL 0x3 +#define BIT_GPIO_GPC8_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC8_PULL_CTRL) << BIT_SHIFT_GPIO_GPC8_PULL_CTRL) + + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_PERI_PWM0_CTRL +#define BIT_PERI_PWM0_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM0_GT_SEL 24 +#define BIT_MASK_PERI_PWM0_GT_SEL 0xf +#define BIT_PERI_PWM0_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM0_GT_SEL) << BIT_SHIFT_PERI_PWM0_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM0_DUTY 12 +#define BIT_MASK_PERI_PWM0_DUTY 0x3ff +#define BIT_PERI_PWM0_DUTY(x) (((x) & BIT_MASK_PERI_PWM0_DUTY) << BIT_SHIFT_PERI_PWM0_DUTY) + + +#define BIT_SHIFT_PERI_PWM0_PERIOD 0 +#define BIT_MASK_PERI_PWM0_PERIOD 0x3ff +#define BIT_PERI_PWM0_PERIOD(x) (((x) & BIT_MASK_PERI_PWM0_PERIOD) << BIT_SHIFT_PERI_PWM0_PERIOD) + + +//2 REG_PERI_PWM1_CTRL +#define BIT_PERI_PWM1_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM1_GT_SEL 24 +#define BIT_MASK_PERI_PWM1_GT_SEL 0xf +#define BIT_PERI_PWM1_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM1_GT_SEL) << BIT_SHIFT_PERI_PWM1_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM1_DUTY 12 +#define BIT_MASK_PERI_PWM1_DUTY 0x3ff +#define BIT_PERI_PWM1_DUTY(x) (((x) & BIT_MASK_PERI_PWM1_DUTY) << BIT_SHIFT_PERI_PWM1_DUTY) + + +#define BIT_SHIFT_PERI_PWM1_PERIOD 0 +#define BIT_MASK_PERI_PWM1_PERIOD 0x3ff +#define BIT_PERI_PWM1_PERIOD(x) (((x) & BIT_MASK_PERI_PWM1_PERIOD) << BIT_SHIFT_PERI_PWM1_PERIOD) + + +//2 REG_PERI_PWM2_CTRL +#define BIT_PERI_PWM2_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM2_GT_SEL 24 +#define BIT_MASK_PERI_PWM2_GT_SEL 0xf +#define BIT_PERI_PWM2_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM2_GT_SEL) << BIT_SHIFT_PERI_PWM2_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM2_DUTY 12 +#define BIT_MASK_PERI_PWM2_DUTY 0x3ff +#define BIT_PERI_PWM2_DUTY(x) (((x) & BIT_MASK_PERI_PWM2_DUTY) << BIT_SHIFT_PERI_PWM2_DUTY) + + +#define BIT_SHIFT_PERI_PWM2_PERIOD 0 +#define BIT_MASK_PERI_PWM2_PERIOD 0x3ff +#define BIT_PERI_PWM2_PERIOD(x) (((x) & BIT_MASK_PERI_PWM2_PERIOD) << BIT_SHIFT_PERI_PWM2_PERIOD) + + +//2 REG_PERI_PWM3_CTRL +#define BIT_PERI_PWM3_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM3_GT_SEL 24 +#define BIT_MASK_PERI_PWM3_GT_SEL 0xf +#define BIT_PERI_PWM3_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM3_GT_SEL) << BIT_SHIFT_PERI_PWM3_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM3_DUTY 12 +#define BIT_MASK_PERI_PWM3_DUTY 0x3ff +#define BIT_PERI_PWM3_DUTY(x) (((x) & BIT_MASK_PERI_PWM3_DUTY) << BIT_SHIFT_PERI_PWM3_DUTY) + + +#define BIT_SHIFT_PERI_PWM3_PERIOD 0 +#define BIT_MASK_PERI_PWM3_PERIOD 0x3ff +#define BIT_PERI_PWM3_PERIOD(x) (((x) & BIT_MASK_PERI_PWM3_PERIOD) << BIT_SHIFT_PERI_PWM3_PERIOD) + + +//2 REG_PERI_TIM_EVT_CTRL +#define BIT_PERI_GT_EVT3_EN BIT(31) + +#define BIT_SHIFT_PERI_GT_EVT3_SRC_SEL 28 +#define BIT_MASK_PERI_GT_EVT3_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT3_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT3_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT3_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT3_PULSE_DUR 24 +#define BIT_MASK_PERI_GT_EVT3_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT3_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT3_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT3_PULSE_DUR) + +#define BIT_PERI_GT_EVT2_EN BIT(23) + +#define BIT_SHIFT_PERI_GT_EVT2_SRC_SEL 20 +#define BIT_MASK_PERI_GT_EVT2_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT2_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT2_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT2_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT2_PULSE_DUR 16 +#define BIT_MASK_PERI_GT_EVT2_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT2_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT2_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT2_PULSE_DUR) + +#define BIT_PERI_GT_EVT1_EN BIT(15) + +#define BIT_SHIFT_PERI_GT_EVT1_SRC_SEL 12 +#define BIT_MASK_PERI_GT_EVT1_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT1_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT1_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT1_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT1_PULSE_DUR 8 +#define BIT_MASK_PERI_GT_EVT1_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT1_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT1_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT1_PULSE_DUR) + +#define BIT_PERI_GT_EVT0_EN BIT(7) + +#define BIT_SHIFT_PERI_GT_EVT0_SRC_SEL 4 +#define BIT_MASK_PERI_GT_EVT0_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT0_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT0_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT0_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT0_PULSE_DUR 0 +#define BIT_MASK_PERI_GT_EVT0_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT0_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT0_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT0_PULSE_DUR) + + +//2 REG_PERI_EGTIM_CTRL + +#define BIT_SHIFT_PERI_EGTIM_PIN_GROUP2_OPT_SEL 12 +#define BIT_MASK_PERI_EGTIM_PIN_GROUP2_OPT_SEL 0x3 +#define BIT_PERI_EGTIM_PIN_GROUP2_OPT_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_PIN_GROUP2_OPT_SEL) << BIT_SHIFT_PERI_EGTIM_PIN_GROUP2_OPT_SEL) + + +#define BIT_SHIFT_PERI_EGTIM_PIN_GROUP1_OPT_SEL 10 +#define BIT_MASK_PERI_EGTIM_PIN_GROUP1_OPT_SEL 0x3 +#define BIT_PERI_EGTIM_PIN_GROUP1_OPT_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_PIN_GROUP1_OPT_SEL) << BIT_SHIFT_PERI_EGTIM_PIN_GROUP1_OPT_SEL) + + +#define BIT_SHIFT_PERI_EGTIM_PIN_GROUP0_OPT_SEL 8 +#define BIT_MASK_PERI_EGTIM_PIN_GROUP0_OPT_SEL 0x3 +#define BIT_PERI_EGTIM_PIN_GROUP0_OPT_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_PIN_GROUP0_OPT_SEL) << BIT_SHIFT_PERI_EGTIM_PIN_GROUP0_OPT_SEL) + + +//2 REG_NOT_VALID + +#define BIT_SHIFT_PERI_EGTIM_REF_SIG_SEL 4 +#define BIT_MASK_PERI_EGTIM_REF_SIG_SEL 0x3 +#define BIT_PERI_EGTIM_REF_SIG_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_REF_SIG_SEL) << BIT_SHIFT_PERI_EGTIM_REF_SIG_SEL) + +#define BIT_PERI_EGTIM_EN BIT(0) + +//2 REG_NOT_VALID + +//2 REG_PEON_CFG + +//2 REG_PEON_STATUS +#define BIT_PEON_SDIO_ALDN BIT(0) + + +//========== Register Address Definition ==================// +#define REG_PEON_PWR_CTRL 0x0200 +#define REG_PON_ISO_CTRL 0x0204 +#define REG_SOC_FUNC_EN 0x0210 +#define REG_SOC_HCI_COM_FUNC_EN 0x0214 +#define REG_SOC_PERI_FUNC0_EN 0x0218 +#define REG_SOC_PERI_FUNC1_EN 0x021C +#define REG_SOC_PERI_BD_FUNC0_EN 0x0220 +#define REG_PESOC_CLK_CTRL 0x0230 +#define REG_PESOC_PERI_CLK_CTRL0 0x0234 +#define REG_PESOC_PERI_CLK_CTRL1 0x0238 +#define REG_PESOC_CLK_CTRL3 0x023C +#define REG_PESOC_HCI_CLK_CTRL0 0x0240 +#define REG_PESOC_COM_CLK_CTRL1 0x0244 +#define REG_PESOC_HW_ENG_CLK_CTRL 0x0248 +#define REG_PESOC_CLK_SEL 0x0250 +#define REG_SYS_ANACK_CAL_CTRL 0x026C +#define REG_OSC32K_CTRL 0x0270 +#define REG_OSC32K_REG_CTRL0 0x0274 +#define REG_OSC32K_REG_CTRL1 0x0278 +#define REG_THERMAL_METER_CTRL 0x027C +#define REG_UART_MUX_CTRL 0x0280 +#define REG_SPI_MUX_CTRL 0x0284 +#define REG_I2C_MUX_CTRL 0x0288 +#define REG_I2S_MUX_CTRL 0x028C +#define REG_HCI_PINMUX_CTRL 0x02A0 +#define REG_WL_PINMUX_CTRL 0x02A4 +#define REG_BT_PINMUX_CTRL 0x02A8 +#define REG_PWM_PINMUX_CTRL 0x02AC +#define REG_CPU_PERIPHERAL_CTRL 0x02C0 +#define REG_HCI_CTRL_STATUS_0 0x02E0 +#define REG_HCI_CTRL_STATUS_1 0x02E4 +#define REG_PESOC_MEM_CTRL 0x0300 +#define REG_PESOC_SOC_CTRL 0x0304 +#define REG_PESOC_PERI_CTRL 0x0308 +#define REG_GPIO_SHTDN_CTRL 0x0320 +#define REG_GPIO_DRIVING_CTRL 0x0324 +#define REG_GPIO_PULL_CTRL0 0x0330 +#define REG_GPIO_PULL_CTRL1 0x0334 +#define REG_GPIO_PULL_CTRL2 0x0338 +#define REG_GPIO_PULL_CTRL3 0x033C +#define REG_GPIO_PULL_CTRL4 0x0340 +#define REG_GPIO_PULL_CTRL5 0x0344 +#define REG_GPIO_PULL_CTRL6 0x0348 +#define REG_PERI_PWM0_CTRL 0x0360 +#define REG_PERI_PWM1_CTRL 0x0364 +#define REG_PERI_PWM2_CTRL 0x0368 +#define REG_PERI_PWM3_CTRL 0x036C +#define REG_PERI_TIM_EVT_CTRL 0x0370 +#define REG_PERI_EGTIM_CTRL 0x0374 +#define REG_PEON_CFG 0x03F0 +#define REG_PEON_STATUS 0x03F4 + + +#endif // end of "#ifndef __INC_RTL8195A_PERI_ON_H" diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_pwm.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_pwm.h new file mode 100644 index 0000000..ddf166b --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_pwm.h @@ -0,0 +1,37 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_PWM_H_ +#define _RTL8195A_PWM_H_ + +extern void +HAL_Pwm_SetDuty_8195a( + HAL_PWM_ADAPTER *pPwmAdapt, + u32 period, + u32 pulse_width +); + +extern HAL_Status +HAL_Pwm_Init_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +); + +extern void +HAL_Pwm_Enable_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +); + +extern void +HAL_Pwm_Disable_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +); + + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_spi_flash.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_spi_flash.h new file mode 100644 index 0000000..7f08939 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_spi_flash.h @@ -0,0 +1,1005 @@ +#ifndef _RTL8195A_SPI_FLASH_H +#define _RTL8195A_SPI_FLASH_H + +#define CPU_OPT_WIDTH 0x1F + +//2 REG_NOT_VALID + +//2 REG_SPIC_CTRLR0 + +#define BIT_SHIFT_CK_MTIMES 23 +#define BIT_MASK_CK_MTIMES 0x1f +#define BIT_CK_MTIMES(x) (((x) & BIT_MASK_CK_MTIMES) << BIT_SHIFT_CK_MTIMES) +#define BIT_CTRL_CK_MTIMES(x) (((x) & BIT_MASK_CK_MTIMES) << BIT_SHIFT_CK_MTIMES) +#define BIT_GET_CK_MTIMES(x) (((x) >> BIT_SHIFT_CK_MTIMES) & BIT_MASK_CK_MTIMES) + +#define BIT_FAST_RD BIT(22) +#define BIT_SHIFT_FAST_RD 22 +#define BIT_MASK_FAST_RD 0x1 +#define BIT_CTRL_FAST_RD(x) (((x) & BIT_MASK_FAST_RD) << BIT_SHIFT_FAST_RD) + + +#define BIT_SHIFT_CMD_CH 20 +#define BIT_MASK_CMD_CH 0x3 +#define BIT_CMD_CH(x) (((x) & BIT_MASK_CMD_CH) << BIT_SHIFT_CMD_CH) +#define BIT_CTRL_CMD_CH(x) (((x) & BIT_MASK_CMD_CH) << BIT_SHIFT_CMD_CH) +#define BIT_GET_CMD_CH(x) (((x) >> BIT_SHIFT_CMD_CH) & BIT_MASK_CMD_CH) + + +#define BIT_SHIFT_DATA_CH 18 +#define BIT_MASK_DATA_CH 0x3 +#define BIT_DATA_CH(x) (((x) & BIT_MASK_DATA_CH) << BIT_SHIFT_DATA_CH) +#define BIT_CTRL_DATA_CH(x) (((x) & BIT_MASK_DATA_CH) << BIT_SHIFT_DATA_CH) +#define BIT_GET_DATA_CH(x) (((x) >> BIT_SHIFT_DATA_CH) & BIT_MASK_DATA_CH) + + +#define BIT_SHIFT_ADDR_CH 16 +#define BIT_MASK_ADDR_CH 0x3 +#define BIT_ADDR_CH(x) (((x) & BIT_MASK_ADDR_CH) << BIT_SHIFT_ADDR_CH) +#define BIT_CTRL_ADDR_CH(x) (((x) & BIT_MASK_ADDR_CH) << BIT_SHIFT_ADDR_CH) +#define BIT_GET_ADDR_CH(x) (((x) >> BIT_SHIFT_ADDR_CH) & BIT_MASK_ADDR_CH) + + +#define BIT_SHIFT_TMOD 8 +#define BIT_MASK_TMOD 0x3 +#define BIT_TMOD(x) (((x) & BIT_MASK_TMOD) << BIT_SHIFT_TMOD) +#define BIT_CTRL_TMOD(x) (((x) & BIT_MASK_TMOD) << BIT_SHIFT_TMOD) +#define BIT_GET_TMOD(x) (((x) >> BIT_SHIFT_TMOD) & BIT_MASK_TMOD) + +#define BIT_SCPOL BIT(7) +#define BIT_SHIFT_SCPOL 7 +#define BIT_MASK_SCPOL 0x1 +#define BIT_CTRL_SCPOL(x) (((x) & BIT_MASK_SCPOL) << BIT_SHIFT_SCPOL) + +#define BIT_SCPH BIT(6) +#define BIT_SHIFT_SCPH 6 +#define BIT_MASK_SCPH 0x1 +#define BIT_CTRL_SCPH(x) (((x) & BIT_MASK_SCPH) << BIT_SHIFT_SCPH) + +//2 REG_SPIC_CTRLR1 + +#define BIT_SHIFT_NDF 0 +#define BIT_MASK_NDF 0xfff +#define BIT_NDF(x) (((x) & BIT_MASK_NDF) << BIT_SHIFT_NDF) +#define BIT_CTRL_NDF(x) (((x) & BIT_MASK_NDF) << BIT_SHIFT_NDF) +#define BIT_GET_NDF(x) (((x) >> BIT_SHIFT_NDF) & BIT_MASK_NDF) + + +//2 REG_SPIC_SSIENR +#define BIT_ATCK_CMD BIT(1) +#define BIT_SHIFT_ATCK_CMD 1 +#define BIT_MASK_ATCK_CMD 0x1 +#define BIT_CTRL_ATCK_CMD(x) (((x) & BIT_MASK_ATCK_CMD) << BIT_SHIFT_ATCK_CMD) + +#define BIT_SPIC_EN BIT(0) +#define BIT_SHIFT_SPIC_EN 0 +#define BIT_MASK_SPIC_EN 0x1 +#define BIT_CTRL_SPIC_EN(x) (((x) & BIT_MASK_SPIC_EN) << BIT_SHIFT_SPIC_EN) + +//2 REG_SPIC_MWCR + +//2 REG_SPIC_SER +#define BIT_SER BIT(0) +#define BIT_SHIFT_SER 0 +#define BIT_MASK_SER 0x1 +#define BIT_CTRL_SER(x) (((x) & BIT_MASK_SER) << BIT_SHIFT_SER) + +//2 REG_SPIC_BAUDR + +#define BIT_SHIFT_SCKDV 0 +#define BIT_MASK_SCKDV 0xffff +#define BIT_SCKDV(x) (((x) & BIT_MASK_SCKDV) << BIT_SHIFT_SCKDV) +#define BIT_CTRL_SCKDV(x) (((x) & BIT_MASK_SCKDV) << BIT_SHIFT_SCKDV) +#define BIT_GET_SCKDV(x) (((x) >> BIT_SHIFT_SCKDV) & BIT_MASK_SCKDV) + + +//2 REG_SPIC_TXFTLR + +#define BIT_SHIFT_TFT 0 +#define BIT_MASK_TFT 0x1f +#define BIT_TFT(x) (((x) & BIT_MASK_TFT) << BIT_SHIFT_TFT) +#define BIT_CTRL_TFT(x) (((x) & BIT_MASK_TFT) << BIT_SHIFT_TFT) +#define BIT_GET_TFT(x) (((x) >> BIT_SHIFT_TFT) & BIT_MASK_TFT) + + +//2 REG_SPIC_RXFTLR + +#define BIT_SHIFT_RFT 0 +#define BIT_MASK_RFT 0x1f +#define BIT_RFT(x) (((x) & BIT_MASK_RFT) << BIT_SHIFT_RFT) +#define BIT_CTRL_RFT(x) (((x) & BIT_MASK_RFT) << BIT_SHIFT_RFT) +#define BIT_GET_RFT(x) (((x) >> BIT_SHIFT_RFT) & BIT_MASK_RFT) + + +//2 REG_SPIC_TXFLR + +#define BIT_SHIFT_TXFL 0 +#define BIT_MASK_TXFL 0x3f +#define BIT_TXFL(x) (((x) & BIT_MASK_TXFL) << BIT_SHIFT_TXFL) +#define BIT_CTRL_TXFL(x) (((x) & BIT_MASK_TXFL) << BIT_SHIFT_TXFL) +#define BIT_GET_TXFL(x) (((x) >> BIT_SHIFT_TXFL) & BIT_MASK_TXFL) + + +//2 REG_SPIC_RXFLR + +#define BIT_SHIFT_RXFL 0 +#define BIT_MASK_RXFL 0x3f +#define BIT_RXFL(x) (((x) & BIT_MASK_RXFL) << BIT_SHIFT_RXFL) +#define BIT_CTRL_RXFL(x) (((x) & BIT_MASK_RXFL) << BIT_SHIFT_RXFL) +#define BIT_GET_RXFL(x) (((x) >> BIT_SHIFT_RXFL) & BIT_MASK_RXFL) + + +//2 REG_SPIC_SR +#define BIT_TXE BIT(5) +#define BIT_SHIFT_TXE 5 +#define BIT_MASK_TXE 0x1 +#define BIT_CTRL_TXE(x) (((x) & BIT_MASK_TXE) << BIT_SHIFT_TXE) + +#define BIT_RFF BIT(4) +#define BIT_SHIFT_RFF 4 +#define BIT_MASK_RFF 0x1 +#define BIT_CTRL_RFF(x) (((x) & BIT_MASK_RFF) << BIT_SHIFT_RFF) + +#define BIT_RFNE BIT(3) +#define BIT_SHIFT_RFNE 3 +#define BIT_MASK_RFNE 0x1 +#define BIT_CTRL_RFNE(x) (((x) & BIT_MASK_RFNE) << BIT_SHIFT_RFNE) + +#define BIT_TFE BIT(2) +#define BIT_SHIFT_TFE 2 +#define BIT_MASK_TFE 0x1 +#define BIT_CTRL_TFE(x) (((x) & BIT_MASK_TFE) << BIT_SHIFT_TFE) + +#define BIT_TFNF BIT(1) +#define BIT_SHIFT_TFNF 1 +#define BIT_MASK_TFNF 0x1 +#define BIT_CTRL_TFNF(x) (((x) & BIT_MASK_TFNF) << BIT_SHIFT_TFNF) + +#define BIT_BUSY BIT(0) +#define BIT_SHIFT_BUSY 0 +#define BIT_MASK_BUSY 0x1 +#define BIT_CTRL_BUSY(x) (((x) & BIT_MASK_BUSY) << BIT_SHIFT_BUSY) + +//2 REG_SPIC_IMR +#define BIT_TXSIM BIT(9) +#define BIT_SHIFT_TXSIM 9 +#define BIT_MASK_TXSIM 0x1 +#define BIT_CTRL_TXSIM(x) (((x) & BIT_MASK_TXSIM) << BIT_SHIFT_TXSIM) + +#define BIT_ACEIM BIT(8) +#define BIT_SHIFT_ACEIM 8 +#define BIT_MASK_ACEIM 0x1 +#define BIT_CTRL_ACEIM(x) (((x) & BIT_MASK_ACEIM) << BIT_SHIFT_ACEIM) + +#define BIT_BYEIM BIT(7) +#define BIT_SHIFT_BYEIM 7 +#define BIT_MASK_BYEIM 0x1 +#define BIT_CTRL_BYEIM(x) (((x) & BIT_MASK_BYEIM) << BIT_SHIFT_BYEIM) + +#define BIT_WBEIM BIT(6) +#define BIT_SHIFT_WBEIM 6 +#define BIT_MASK_WBEIM 0x1 +#define BIT_CTRL_WBEIM(x) (((x) & BIT_MASK_WBEIM) << BIT_SHIFT_WBEIM) + +#define BIT_FSEIM BIT(5) +#define BIT_SHIFT_FSEIM 5 +#define BIT_MASK_FSEIM 0x1 +#define BIT_CTRL_FSEIM(x) (((x) & BIT_MASK_FSEIM) << BIT_SHIFT_FSEIM) + +#define BIT_RXFIM BIT(4) +#define BIT_SHIFT_RXFIM 4 +#define BIT_MASK_RXFIM 0x1 +#define BIT_CTRL_RXFIM(x) (((x) & BIT_MASK_RXFIM) << BIT_SHIFT_RXFIM) + +#define BIT_RXOIM BIT(3) +#define BIT_SHIFT_RXOIM 3 +#define BIT_MASK_RXOIM 0x1 +#define BIT_CTRL_RXOIM(x) (((x) & BIT_MASK_RXOIM) << BIT_SHIFT_RXOIM) + +#define BIT_RXUIM BIT(2) +#define BIT_SHIFT_RXUIM 2 +#define BIT_MASK_RXUIM 0x1 +#define BIT_CTRL_RXUIM(x) (((x) & BIT_MASK_RXUIM) << BIT_SHIFT_RXUIM) + +#define BIT_TXOIM BIT(1) +#define BIT_SHIFT_TXOIM 1 +#define BIT_MASK_TXOIM 0x1 +#define BIT_CTRL_TXOIM(x) (((x) & BIT_MASK_TXOIM) << BIT_SHIFT_TXOIM) + +#define BIT_TXEIM BIT(0) +#define BIT_SHIFT_TXEIM 0 +#define BIT_MASK_TXEIM 0x1 +#define BIT_CTRL_TXEIM(x) (((x) & BIT_MASK_TXEIM) << BIT_SHIFT_TXEIM) + +//2 REG_SPIC_ISR +#define BIT_TXSIS BIT(9) +#define BIT_SHIFT_TXSIS 9 +#define BIT_MASK_TXSIS 0x1 +#define BIT_CTRL_TXSIS(x) (((x) & BIT_MASK_TXSIS) << BIT_SHIFT_TXSIS) + +#define BIT_ACEIS BIT(8) +#define BIT_SHIFT_ACEIS 8 +#define BIT_MASK_ACEIS 0x1 +#define BIT_CTRL_ACEIS(x) (((x) & BIT_MASK_ACEIS) << BIT_SHIFT_ACEIS) + +#define BIT_BYEIS BIT(7) +#define BIT_SHIFT_BYEIS 7 +#define BIT_MASK_BYEIS 0x1 +#define BIT_CTRL_BYEIS(x) (((x) & BIT_MASK_BYEIS) << BIT_SHIFT_BYEIS) + +#define BIT_WBEIS BIT(6) +#define BIT_SHIFT_WBEIS 6 +#define BIT_MASK_WBEIS 0x1 +#define BIT_CTRL_WBEIS(x) (((x) & BIT_MASK_WBEIS) << BIT_SHIFT_WBEIS) + +#define BIT_FSEIS BIT(5) +#define BIT_SHIFT_FSEIS 5 +#define BIT_MASK_FSEIS 0x1 +#define BIT_CTRL_FSEIS(x) (((x) & BIT_MASK_FSEIS) << BIT_SHIFT_FSEIS) + +#define BIT_RXFIS BIT(4) +#define BIT_SHIFT_RXFIS 4 +#define BIT_MASK_RXFIS 0x1 +#define BIT_CTRL_RXFIS(x) (((x) & BIT_MASK_RXFIS) << BIT_SHIFT_RXFIS) + +#define BIT_RXOIS BIT(3) +#define BIT_SHIFT_RXOIS 3 +#define BIT_MASK_RXOIS 0x1 +#define BIT_CTRL_RXOIS(x) (((x) & BIT_MASK_RXOIS) << BIT_SHIFT_RXOIS) + +#define BIT_RXUIS BIT(2) +#define BIT_SHIFT_RXUIS 2 +#define BIT_MASK_RXUIS 0x1 +#define BIT_CTRL_RXUIS(x) (((x) & BIT_MASK_RXUIS) << BIT_SHIFT_RXUIS) + +#define BIT_TXOIS BIT(1) +#define BIT_SHIFT_TXOIS 1 +#define BIT_MASK_TXOIS 0x1 +#define BIT_CTRL_TXOIS(x) (((x) & BIT_MASK_TXOIS) << BIT_SHIFT_TXOIS) + +#define BIT_TXEIS BIT(0) +#define BIT_SHIFT_TXEIS 0 +#define BIT_MASK_TXEIS 0x1 +#define BIT_CTRL_TXEIS(x) (((x) & BIT_MASK_TXEIS) << BIT_SHIFT_TXEIS) + +//2 REG_SPIC_RISR +#define BIT_ACEIR BIT(8) +#define BIT_SHIFT_ACEIR 8 +#define BIT_MASK_ACEIR 0x1 +#define BIT_CTRL_ACEIR(x) (((x) & BIT_MASK_ACEIR) << BIT_SHIFT_ACEIR) + +#define BIT_BYEIR BIT(7) +#define BIT_SHIFT_BYEIR 7 +#define BIT_MASK_BYEIR 0x1 +#define BIT_CTRL_BYEIR(x) (((x) & BIT_MASK_BYEIR) << BIT_SHIFT_BYEIR) + +#define BIT_WBEIR BIT(6) +#define BIT_SHIFT_WBEIR 6 +#define BIT_MASK_WBEIR 0x1 +#define BIT_CTRL_WBEIR(x) (((x) & BIT_MASK_WBEIR) << BIT_SHIFT_WBEIR) + +#define BIT_FSEIR BIT(5) +#define BIT_SHIFT_FSEIR 5 +#define BIT_MASK_FSEIR 0x1 +#define BIT_CTRL_FSEIR(x) (((x) & BIT_MASK_FSEIR) << BIT_SHIFT_FSEIR) + +#define BIT_RXFIR BIT(4) +#define BIT_SHIFT_RXFIR 4 +#define BIT_MASK_RXFIR 0x1 +#define BIT_CTRL_RXFIR(x) (((x) & BIT_MASK_RXFIR) << BIT_SHIFT_RXFIR) + +#define BIT_RXOIR BIT(3) +#define BIT_SHIFT_RXOIR 3 +#define BIT_MASK_RXOIR 0x1 +#define BIT_CTRL_RXOIR(x) (((x) & BIT_MASK_RXOIR) << BIT_SHIFT_RXOIR) + +#define BIT_RXUIR BIT(2) +#define BIT_SHIFT_RXUIR 2 +#define BIT_MASK_RXUIR 0x1 +#define BIT_CTRL_RXUIR(x) (((x) & BIT_MASK_RXUIR) << BIT_SHIFT_RXUIR) + +#define BIT_TXOIR BIT(1) +#define BIT_SHIFT_TXOIR 1 +#define BIT_MASK_TXOIR 0x1 +#define BIT_CTRL_TXOIR(x) (((x) & BIT_MASK_TXOIR) << BIT_SHIFT_TXOIR) + +#define BIT_TXEIR BIT(0) +#define BIT_SHIFT_TXEIR 0 +#define BIT_MASK_TXEIR 0x1 +#define BIT_CTRL_TXEIR(x) (((x) & BIT_MASK_TXEIR) << BIT_SHIFT_TXEIR) + +//2 REG_SPIC_TXOICR +#define BIT_TXOICR BIT(0) +#define BIT_SHIFT_TXOICR 0 +#define BIT_MASK_TXOICR 0x1 +#define BIT_CTRL_TXOICR(x) (((x) & BIT_MASK_TXOICR) << BIT_SHIFT_TXOICR) + +//2 REG_SPIC_RXOICR +#define BIT_RXOCIR BIT(0) +#define BIT_SHIFT_RXOCIR 0 +#define BIT_MASK_RXOCIR 0x1 +#define BIT_CTRL_RXOCIR(x) (((x) & BIT_MASK_RXOCIR) << BIT_SHIFT_RXOCIR) + +//2 REG_SPC_RXUICR +#define BIT_RXUICR BIT(0) +#define BIT_SHIFT_RXUICR 0 +#define BIT_MASK_RXUICR 0x1 +#define BIT_CTRL_RXUICR(x) (((x) & BIT_MASK_RXUICR) << BIT_SHIFT_RXUICR) + +//2 REG_SPIC_MSTICR +#define BIT_MSTICR BIT(0) +#define BIT_SHIFT_MSTICR 0 +#define BIT_MASK_MSTICR 0x1 +#define BIT_CTRL_MSTICR(x) (((x) & BIT_MASK_MSTICR) << BIT_SHIFT_MSTICR) + +//2 REG_SPIC_ICR + +#define BIT_SHIFT_ICR 0 +#define BIT_MASK_ICR 0xff +#define BIT_ICR(x) (((x) & BIT_MASK_ICR) << BIT_SHIFT_ICR) +#define BIT_CTRL_ICR(x) (((x) & BIT_MASK_ICR) << BIT_SHIFT_ICR) +#define BIT_GET_ICR(x) (((x) >> BIT_SHIFT_ICR) & BIT_MASK_ICR) + + +//2 REG_SPIC_DMACR + +//2 REG_SPIC_DMATDLR0 + +//2 REG_SPIC_DMATDLR1 + +//2 REG_SPIC_IDR + +#define BIT_SHIFT_IDCODE 0 +#define BIT_MASK_IDCODE 0xffffffffL +#define BIT_IDCODE(x) (((x) & BIT_MASK_IDCODE) << BIT_SHIFT_IDCODE) +#define BIT_CTRL_IDCODE(x) (((x) & BIT_MASK_IDCODE) << BIT_SHIFT_IDCODE) +#define BIT_GET_IDCODE(x) (((x) >> BIT_SHIFT_IDCODE) & BIT_MASK_IDCODE) + + +//2 REG_SPIC_VERSION + +#define BIT_SHIFT_SPIC_VERSION 0 +#define BIT_MASK_SPIC_VERSION 0xffffffffL +#define BIT_SPIC_VERSION(x) (((x) & BIT_MASK_SPIC_VERSION) << BIT_SHIFT_SPIC_VERSION) +#define BIT_CTRL_SPIC_VERSION(x) (((x) & BIT_MASK_SPIC_VERSION) << BIT_SHIFT_SPIC_VERSION) +#define BIT_GET_SPIC_VERSION(x) (((x) >> BIT_SHIFT_SPIC_VERSION) & BIT_MASK_SPIC_VERSION) + + +//2 REG_SPIC_DR0 + +#define BIT_SHIFT_DR0 0 +#define BIT_MASK_DR0 0xffffffffL +#define BIT_DR0(x) (((x) & BIT_MASK_DR0) << BIT_SHIFT_DR0) +#define BIT_CTRL_DR0(x) (((x) & BIT_MASK_DR0) << BIT_SHIFT_DR0) +#define BIT_GET_DR0(x) (((x) >> BIT_SHIFT_DR0) & BIT_MASK_DR0) + + +//2 REG_SPIC_DR1 + +#define BIT_SHIFT_DR1 0 +#define BIT_MASK_DR1 0xffffffffL +#define BIT_DR1(x) (((x) & BIT_MASK_DR1) << BIT_SHIFT_DR1) +#define BIT_CTRL_DR1(x) (((x) & BIT_MASK_DR1) << BIT_SHIFT_DR1) +#define BIT_GET_DR1(x) (((x) >> BIT_SHIFT_DR1) & BIT_MASK_DR1) + + +//2 REG_SPIC_DR2 + +#define BIT_SHIFT_DR2 0 +#define BIT_MASK_DR2 0xffffffffL +#define BIT_DR2(x) (((x) & BIT_MASK_DR2) << BIT_SHIFT_DR2) +#define BIT_CTRL_DR2(x) (((x) & BIT_MASK_DR2) << BIT_SHIFT_DR2) +#define BIT_GET_DR2(x) (((x) >> BIT_SHIFT_DR2) & BIT_MASK_DR2) + + +//2 REG_SPIC_DR3 + +#define BIT_SHIFT_DR3 0 +#define BIT_MASK_DR3 0xffffffffL +#define BIT_DR3(x) (((x) & BIT_MASK_DR3) << BIT_SHIFT_DR3) +#define BIT_CTRL_DR3(x) (((x) & BIT_MASK_DR3) << BIT_SHIFT_DR3) +#define BIT_GET_DR3(x) (((x) >> BIT_SHIFT_DR3) & BIT_MASK_DR3) + + +//2 REG_SPIC_DR4 + +#define BIT_SHIFT_DR4 0 +#define BIT_MASK_DR4 0xffffffffL +#define BIT_DR4(x) (((x) & BIT_MASK_DR4) << BIT_SHIFT_DR4) +#define BIT_CTRL_DR4(x) (((x) & BIT_MASK_DR4) << BIT_SHIFT_DR4) +#define BIT_GET_DR4(x) (((x) >> BIT_SHIFT_DR4) & BIT_MASK_DR4) + + +//2 REG_SPIC_DR5 + +#define BIT_SHIFT_DR5 0 +#define BIT_MASK_DR5 0xffffffffL +#define BIT_DR5(x) (((x) & BIT_MASK_DR5) << BIT_SHIFT_DR5) +#define BIT_CTRL_DR5(x) (((x) & BIT_MASK_DR5) << BIT_SHIFT_DR5) +#define BIT_GET_DR5(x) (((x) >> BIT_SHIFT_DR5) & BIT_MASK_DR5) + + +//2 REG_SPIC_DR6 + +#define BIT_SHIFT_DR6 0 +#define BIT_MASK_DR6 0xffffffffL +#define BIT_DR6(x) (((x) & BIT_MASK_DR6) << BIT_SHIFT_DR6) +#define BIT_CTRL_DR6(x) (((x) & BIT_MASK_DR6) << BIT_SHIFT_DR6) +#define BIT_GET_DR6(x) (((x) >> BIT_SHIFT_DR6) & BIT_MASK_DR6) + + +//2 REG_SPIC_DR7 + +#define BIT_SHIFT_DR7 0 +#define BIT_MASK_DR7 0xffffffffL +#define BIT_DR7(x) (((x) & BIT_MASK_DR7) << BIT_SHIFT_DR7) +#define BIT_CTRL_DR7(x) (((x) & BIT_MASK_DR7) << BIT_SHIFT_DR7) +#define BIT_GET_DR7(x) (((x) >> BIT_SHIFT_DR7) & BIT_MASK_DR7) + + +//2 REG_SPIC_DR8 + +#define BIT_SHIFT_DR8 0 +#define BIT_MASK_DR8 0xffffffffL +#define BIT_DR8(x) (((x) & BIT_MASK_DR8) << BIT_SHIFT_DR8) +#define BIT_CTRL_DR8(x) (((x) & BIT_MASK_DR8) << BIT_SHIFT_DR8) +#define BIT_GET_DR8(x) (((x) >> BIT_SHIFT_DR8) & BIT_MASK_DR8) + + +//2 REG_SPIC_DR9 + +#define BIT_SHIFT_DR9 0 +#define BIT_MASK_DR9 0xffffffffL +#define BIT_DR9(x) (((x) & BIT_MASK_DR9) << BIT_SHIFT_DR9) +#define BIT_CTRL_DR9(x) (((x) & BIT_MASK_DR9) << BIT_SHIFT_DR9) +#define BIT_GET_DR9(x) (((x) >> BIT_SHIFT_DR9) & BIT_MASK_DR9) + + +//2 REG_SPIC_DR10 + +#define BIT_SHIFT_DR10 0 +#define BIT_MASK_DR10 0xffffffffL +#define BIT_DR10(x) (((x) & BIT_MASK_DR10) << BIT_SHIFT_DR10) +#define BIT_CTRL_DR10(x) (((x) & BIT_MASK_DR10) << BIT_SHIFT_DR10) +#define BIT_GET_DR10(x) (((x) >> BIT_SHIFT_DR10) & BIT_MASK_DR10) + + +//2 REG_SPIC_DR11 + +#define BIT_SHIFT_DR11 0 +#define BIT_MASK_DR11 0xffffffffL +#define BIT_DR11(x) (((x) & BIT_MASK_DR11) << BIT_SHIFT_DR11) +#define BIT_CTRL_DR11(x) (((x) & BIT_MASK_DR11) << BIT_SHIFT_DR11) +#define BIT_GET_DR11(x) (((x) >> BIT_SHIFT_DR11) & BIT_MASK_DR11) + + +//2 REG_SPIC_DR12 + +#define BIT_SHIFT_DR12 0 +#define BIT_MASK_DR12 0xffffffffL +#define BIT_DR12(x) (((x) & BIT_MASK_DR12) << BIT_SHIFT_DR12) +#define BIT_CTRL_DR12(x) (((x) & BIT_MASK_DR12) << BIT_SHIFT_DR12) +#define BIT_GET_DR12(x) (((x) >> BIT_SHIFT_DR12) & BIT_MASK_DR12) + + +//2 REG_SPIC_DR13 + +#define BIT_SHIFT_DR13 0 +#define BIT_MASK_DR13 0xffffffffL +#define BIT_DR13(x) (((x) & BIT_MASK_DR13) << BIT_SHIFT_DR13) +#define BIT_CTRL_DR13(x) (((x) & BIT_MASK_DR13) << BIT_SHIFT_DR13) +#define BIT_GET_DR13(x) (((x) >> BIT_SHIFT_DR13) & BIT_MASK_DR13) + + +//2 REG_SPIC_DR14 + +#define BIT_SHIFT_DR14 0 +#define BIT_MASK_DR14 0xffffffffL +#define BIT_DR14(x) (((x) & BIT_MASK_DR14) << BIT_SHIFT_DR14) +#define BIT_CTRL_DR14(x) (((x) & BIT_MASK_DR14) << BIT_SHIFT_DR14) +#define BIT_GET_DR14(x) (((x) >> BIT_SHIFT_DR14) & BIT_MASK_DR14) + + +//2 REG_SPIC_DR15 + +#define BIT_SHIFT_DR15 0 +#define BIT_MASK_DR15 0xffffffffL +#define BIT_DR15(x) (((x) & BIT_MASK_DR15) << BIT_SHIFT_DR15) +#define BIT_CTRL_DR15(x) (((x) & BIT_MASK_DR15) << BIT_SHIFT_DR15) +#define BIT_GET_DR15(x) (((x) >> BIT_SHIFT_DR15) & BIT_MASK_DR15) + + +//2 REG_SPIC_DR16 + +#define BIT_SHIFT_DR16 0 +#define BIT_MASK_DR16 0xffffffffL +#define BIT_DR16(x) (((x) & BIT_MASK_DR16) << BIT_SHIFT_DR16) +#define BIT_CTRL_DR16(x) (((x) & BIT_MASK_DR16) << BIT_SHIFT_DR16) +#define BIT_GET_DR16(x) (((x) >> BIT_SHIFT_DR16) & BIT_MASK_DR16) + + +//2 REG_SPIC_DR17 + +#define BIT_SHIFT_DR17 0 +#define BIT_MASK_DR17 0xffffffffL +#define BIT_DR17(x) (((x) & BIT_MASK_DR17) << BIT_SHIFT_DR17) +#define BIT_CTRL_DR17(x) (((x) & BIT_MASK_DR17) << BIT_SHIFT_DR17) +#define BIT_GET_DR17(x) (((x) >> BIT_SHIFT_DR17) & BIT_MASK_DR17) + + +//2 REG_SPIC_DR18 + +#define BIT_SHIFT_DR18 0 +#define BIT_MASK_DR18 0xffffffffL +#define BIT_DR18(x) (((x) & BIT_MASK_DR18) << BIT_SHIFT_DR18) +#define BIT_CTRL_DR18(x) (((x) & BIT_MASK_DR18) << BIT_SHIFT_DR18) +#define BIT_GET_DR18(x) (((x) >> BIT_SHIFT_DR18) & BIT_MASK_DR18) + + +//2 REG_SPIC_DR19 + +#define BIT_SHIFT_DR19 0 +#define BIT_MASK_DR19 0xffffffffL +#define BIT_DR19(x) (((x) & BIT_MASK_DR19) << BIT_SHIFT_DR19) +#define BIT_CTRL_DR19(x) (((x) & BIT_MASK_DR19) << BIT_SHIFT_DR19) +#define BIT_GET_DR19(x) (((x) >> BIT_SHIFT_DR19) & BIT_MASK_DR19) + + +//2 REG_SPIC_DR20 + +#define BIT_SHIFT_DR20 0 +#define BIT_MASK_DR20 0xffffffffL +#define BIT_DR20(x) (((x) & BIT_MASK_DR20) << BIT_SHIFT_DR20) +#define BIT_CTRL_DR20(x) (((x) & BIT_MASK_DR20) << BIT_SHIFT_DR20) +#define BIT_GET_DR20(x) (((x) >> BIT_SHIFT_DR20) & BIT_MASK_DR20) + + +//2 REG_SPIC_DR21 + +#define BIT_SHIFT_DR21 0 +#define BIT_MASK_DR21 0xffffffffL +#define BIT_DR21(x) (((x) & BIT_MASK_DR21) << BIT_SHIFT_DR21) +#define BIT_CTRL_DR21(x) (((x) & BIT_MASK_DR21) << BIT_SHIFT_DR21) +#define BIT_GET_DR21(x) (((x) >> BIT_SHIFT_DR21) & BIT_MASK_DR21) + + +//2 REG_SPIC_DR22 + +#define BIT_SHIFT_DR22 0 +#define BIT_MASK_DR22 0xffffffffL +#define BIT_DR22(x) (((x) & BIT_MASK_DR22) << BIT_SHIFT_DR22) +#define BIT_CTRL_DR22(x) (((x) & BIT_MASK_DR22) << BIT_SHIFT_DR22) +#define BIT_GET_DR22(x) (((x) >> BIT_SHIFT_DR22) & BIT_MASK_DR22) + + +//2 REG_SPIC_DR23 + +#define BIT_SHIFT_DR23 0 +#define BIT_MASK_DR23 0xffffffffL +#define BIT_DR23(x) (((x) & BIT_MASK_DR23) << BIT_SHIFT_DR23) +#define BIT_CTRL_DR23(x) (((x) & BIT_MASK_DR23) << BIT_SHIFT_DR23) +#define BIT_GET_DR23(x) (((x) >> BIT_SHIFT_DR23) & BIT_MASK_DR23) + + +//2 REG_SPIC_DR24 + +#define BIT_SHIFT_DR24 0 +#define BIT_MASK_DR24 0xffffffffL +#define BIT_DR24(x) (((x) & BIT_MASK_DR24) << BIT_SHIFT_DR24) +#define BIT_CTRL_DR24(x) (((x) & BIT_MASK_DR24) << BIT_SHIFT_DR24) +#define BIT_GET_DR24(x) (((x) >> BIT_SHIFT_DR24) & BIT_MASK_DR24) + + +//2 REG_SPIC_DR25 + +#define BIT_SHIFT_DR25 0 +#define BIT_MASK_DR25 0xffffffffL +#define BIT_DR25(x) (((x) & BIT_MASK_DR25) << BIT_SHIFT_DR25) +#define BIT_CTRL_DR25(x) (((x) & BIT_MASK_DR25) << BIT_SHIFT_DR25) +#define BIT_GET_DR25(x) (((x) >> BIT_SHIFT_DR25) & BIT_MASK_DR25) + + +//2 REG_SPIC_DR26 + +#define BIT_SHIFT_DR26 0 +#define BIT_MASK_DR26 0xffffffffL +#define BIT_DR26(x) (((x) & BIT_MASK_DR26) << BIT_SHIFT_DR26) +#define BIT_CTRL_DR26(x) (((x) & BIT_MASK_DR26) << BIT_SHIFT_DR26) +#define BIT_GET_DR26(x) (((x) >> BIT_SHIFT_DR26) & BIT_MASK_DR26) + + +//2 REG_SPIC_DR27 + +#define BIT_SHIFT_DR27 0 +#define BIT_MASK_DR27 0xffffffffL +#define BIT_DR27(x) (((x) & BIT_MASK_DR27) << BIT_SHIFT_DR27) +#define BIT_CTRL_DR27(x) (((x) & BIT_MASK_DR27) << BIT_SHIFT_DR27) +#define BIT_GET_DR27(x) (((x) >> BIT_SHIFT_DR27) & BIT_MASK_DR27) + + +//2 REG_SPIC_DR28 + +#define BIT_SHIFT_DR28 0 +#define BIT_MASK_DR28 0xffffffffL +#define BIT_DR28(x) (((x) & BIT_MASK_DR28) << BIT_SHIFT_DR28) +#define BIT_CTRL_DR28(x) (((x) & BIT_MASK_DR28) << BIT_SHIFT_DR28) +#define BIT_GET_DR28(x) (((x) >> BIT_SHIFT_DR28) & BIT_MASK_DR28) + + +//2 REG_SPIC_DR29 + +#define BIT_SHIFT_DR29 0 +#define BIT_MASK_DR29 0xffffffffL +#define BIT_DR29(x) (((x) & BIT_MASK_DR29) << BIT_SHIFT_DR29) +#define BIT_CTRL_DR29(x) (((x) & BIT_MASK_DR29) << BIT_SHIFT_DR29) +#define BIT_GET_DR29(x) (((x) >> BIT_SHIFT_DR29) & BIT_MASK_DR29) + + +//2 REG_SPIC_DR30 + +#define BIT_SHIFT_DR30 0 +#define BIT_MASK_DR30 0xffffffffL +#define BIT_DR30(x) (((x) & BIT_MASK_DR30) << BIT_SHIFT_DR30) +#define BIT_CTRL_DR30(x) (((x) & BIT_MASK_DR30) << BIT_SHIFT_DR30) +#define BIT_GET_DR30(x) (((x) >> BIT_SHIFT_DR30) & BIT_MASK_DR30) + + +//2 REG_SPIC_DR31 + +#define BIT_SHIFT_DR31 0 +#define BIT_MASK_DR31 0xffffffffL +#define BIT_DR31(x) (((x) & BIT_MASK_DR31) << BIT_SHIFT_DR31) +#define BIT_CTRL_DR31(x) (((x) & BIT_MASK_DR31) << BIT_SHIFT_DR31) +#define BIT_GET_DR31(x) (((x) >> BIT_SHIFT_DR31) & BIT_MASK_DR31) + + +//2 REG_SPIC_READ_FAST_SINGLE + +#define BIT_SHIFT_FRD_CMD 0 +#define BIT_MASK_FRD_CMD 0xff +#define BIT_FRD_CMD(x) (((x) & BIT_MASK_FRD_CMD) << BIT_SHIFT_FRD_CMD) +#define BIT_CTRL_FRD_CMD(x) (((x) & BIT_MASK_FRD_CMD) << BIT_SHIFT_FRD_CMD) +#define BIT_GET_FRD_CMD(x) (((x) >> BIT_SHIFT_FRD_CMD) & BIT_MASK_FRD_CMD) + + +//2 REG_SPIC_READ_DUAL_DATA + +#define BIT_SHIFT_RD_DUAL_O_CMD 0 +#define BIT_MASK_RD_DUAL_O_CMD 0xff +#define BIT_RD_DUAL_O_CMD(x) (((x) & BIT_MASK_RD_DUAL_O_CMD) << BIT_SHIFT_RD_DUAL_O_CMD) +#define BIT_CTRL_RD_DUAL_O_CMD(x) (((x) & BIT_MASK_RD_DUAL_O_CMD) << BIT_SHIFT_RD_DUAL_O_CMD) +#define BIT_GET_RD_DUAL_O_CMD(x) (((x) >> BIT_SHIFT_RD_DUAL_O_CMD) & BIT_MASK_RD_DUAL_O_CMD) + + +//2 REG_SPIC_READ_DUAL_ADDR_DATA + +#define BIT_SHIFT_RD_DUAL_IO_CMD 0 +#define BIT_MASK_RD_DUAL_IO_CMD 0xff +#define BIT_RD_DUAL_IO_CMD(x) (((x) & BIT_MASK_RD_DUAL_IO_CMD) << BIT_SHIFT_RD_DUAL_IO_CMD) +#define BIT_CTRL_RD_DUAL_IO_CMD(x) (((x) & BIT_MASK_RD_DUAL_IO_CMD) << BIT_SHIFT_RD_DUAL_IO_CMD) +#define BIT_GET_RD_DUAL_IO_CMD(x) (((x) >> BIT_SHIFT_RD_DUAL_IO_CMD) & BIT_MASK_RD_DUAL_IO_CMD) + + +//2 REG_SPIC_READ_QUAD_DATA + +#define BIT_SHIFT_RD_QUAD_O_CMD 0 +#define BIT_MASK_RD_QUAD_O_CMD 0xff +#define BIT_RD_QUAD_O_CMD(x) (((x) & BIT_MASK_RD_QUAD_O_CMD) << BIT_SHIFT_RD_QUAD_O_CMD) +#define BIT_CTRL_RD_QUAD_O_CMD(x) (((x) & BIT_MASK_RD_QUAD_O_CMD) << BIT_SHIFT_RD_QUAD_O_CMD) +#define BIT_GET_RD_QUAD_O_CMD(x) (((x) >> BIT_SHIFT_RD_QUAD_O_CMD) & BIT_MASK_RD_QUAD_O_CMD) + + +//2 REG_SPIC_READ_QUAD_ADDR_DATA + +#define BIT_SHIFT_RD_QUAD_IO_CMD 0 +#define BIT_MASK_RD_QUAD_IO_CMD 0xff +#define BIT_RD_QUAD_IO_CMD(x) (((x) & BIT_MASK_RD_QUAD_IO_CMD) << BIT_SHIFT_RD_QUAD_IO_CMD) +#define BIT_CTRL_RD_QUAD_IO_CMD(x) (((x) & BIT_MASK_RD_QUAD_IO_CMD) << BIT_SHIFT_RD_QUAD_IO_CMD) +#define BIT_GET_RD_QUAD_IO_CMD(x) (((x) >> BIT_SHIFT_RD_QUAD_IO_CMD) & BIT_MASK_RD_QUAD_IO_CMD) + + +//2 REG_SPIC_WRITE_SIGNLE + +#define BIT_SHIFT_WR_CMD 0 +#define BIT_MASK_WR_CMD 0xff +#define BIT_WR_CMD(x) (((x) & BIT_MASK_WR_CMD) << BIT_SHIFT_WR_CMD) +#define BIT_CTRL_WR_CMD(x) (((x) & BIT_MASK_WR_CMD) << BIT_SHIFT_WR_CMD) +#define BIT_GET_WR_CMD(x) (((x) >> BIT_SHIFT_WR_CMD) & BIT_MASK_WR_CMD) + + +//2 REG_SPIC_WRITE_DUAL_DATA + +#define BIT_SHIFT_WR_DUAL_I_CMD 0 +#define BIT_MASK_WR_DUAL_I_CMD 0xff +#define BIT_WR_DUAL_I_CMD(x) (((x) & BIT_MASK_WR_DUAL_I_CMD) << BIT_SHIFT_WR_DUAL_I_CMD) +#define BIT_CTRL_WR_DUAL_I_CMD(x) (((x) & BIT_MASK_WR_DUAL_I_CMD) << BIT_SHIFT_WR_DUAL_I_CMD) +#define BIT_GET_WR_DUAL_I_CMD(x) (((x) >> BIT_SHIFT_WR_DUAL_I_CMD) & BIT_MASK_WR_DUAL_I_CMD) + + +//2 REG_SPIC_WRITE_DUAL_ADDR_DATA + +#define BIT_SHIFT_WR_DUAL_II_CMD 0 +#define BIT_MASK_WR_DUAL_II_CMD 0xff +#define BIT_WR_DUAL_II_CMD(x) (((x) & BIT_MASK_WR_DUAL_II_CMD) << BIT_SHIFT_WR_DUAL_II_CMD) +#define BIT_CTRL_WR_DUAL_II_CMD(x) (((x) & BIT_MASK_WR_DUAL_II_CMD) << BIT_SHIFT_WR_DUAL_II_CMD) +#define BIT_GET_WR_DUAL_II_CMD(x) (((x) >> BIT_SHIFT_WR_DUAL_II_CMD) & BIT_MASK_WR_DUAL_II_CMD) + + +//2 REG_SPIC_WRITE_QUAD_DATA + +#define BIT_SHIFT_WR_QUAD_I_CMD 0 +#define BIT_MASK_WR_QUAD_I_CMD 0xff +#define BIT_WR_QUAD_I_CMD(x) (((x) & BIT_MASK_WR_QUAD_I_CMD) << BIT_SHIFT_WR_QUAD_I_CMD) +#define BIT_CTRL_WR_QUAD_I_CMD(x) (((x) & BIT_MASK_WR_QUAD_I_CMD) << BIT_SHIFT_WR_QUAD_I_CMD) +#define BIT_GET_WR_QUAD_I_CMD(x) (((x) >> BIT_SHIFT_WR_QUAD_I_CMD) & BIT_MASK_WR_QUAD_I_CMD) + + +//2 REG_SPIC_WRITE_QUAD_ADDR_DATA + +#define BIT_SHIFT_WR_QUAD_II_CMD 0 +#define BIT_MASK_WR_QUAD_II_CMD 0xff +#define BIT_WR_QUAD_II_CMD(x) (((x) & BIT_MASK_WR_QUAD_II_CMD) << BIT_SHIFT_WR_QUAD_II_CMD) +#define BIT_CTRL_WR_QUAD_II_CMD(x) (((x) & BIT_MASK_WR_QUAD_II_CMD) << BIT_SHIFT_WR_QUAD_II_CMD) +#define BIT_GET_WR_QUAD_II_CMD(x) (((x) >> BIT_SHIFT_WR_QUAD_II_CMD) & BIT_MASK_WR_QUAD_II_CMD) + + +//2 REG_SPIC_WRITE_ENABLE + +#define BIT_SHIFT_WR_EN_CMD 0 +#define BIT_MASK_WR_EN_CMD 0xff +#define BIT_WR_EN_CMD(x) (((x) & BIT_MASK_WR_EN_CMD) << BIT_SHIFT_WR_EN_CMD) +#define BIT_CTRL_WR_EN_CMD(x) (((x) & BIT_MASK_WR_EN_CMD) << BIT_SHIFT_WR_EN_CMD) +#define BIT_GET_WR_EN_CMD(x) (((x) >> BIT_SHIFT_WR_EN_CMD) & BIT_MASK_WR_EN_CMD) + + +//2 REG_SPIC_READ_STATUS + +#define BIT_SHIFT_RD_ST_CMD 0 +#define BIT_MASK_RD_ST_CMD 0xff +#define BIT_RD_ST_CMD(x) (((x) & BIT_MASK_RD_ST_CMD) << BIT_SHIFT_RD_ST_CMD) +#define BIT_CTRL_RD_ST_CMD(x) (((x) & BIT_MASK_RD_ST_CMD) << BIT_SHIFT_RD_ST_CMD) +#define BIT_GET_RD_ST_CMD(x) (((x) >> BIT_SHIFT_RD_ST_CMD) & BIT_MASK_RD_ST_CMD) + + +//2 REG_SPIC_CTRLR2 + +#define BIT_SHIFT_FIFO_ENTRY 4 +#define BIT_MASK_FIFO_ENTRY 0xf +#define BIT_FIFO_ENTRY(x) (((x) & BIT_MASK_FIFO_ENTRY) << BIT_SHIFT_FIFO_ENTRY) +#define BIT_CTRL_FIFO_ENTRY(x) (((x) & BIT_MASK_FIFO_ENTRY) << BIT_SHIFT_FIFO_ENTRY) +#define BIT_GET_FIFO_ENTRY(x) (((x) >> BIT_SHIFT_FIFO_ENTRY) & BIT_MASK_FIFO_ENTRY) + +#define BIT_WR_SEQ BIT(3) +#define BIT_SHIFT_WR_SEQ 3 +#define BIT_MASK_WR_SEQ 0x1 +#define BIT_CTRL_WR_SEQ(x) (((x) & BIT_MASK_WR_SEQ) << BIT_SHIFT_WR_SEQ) + +#define BIT_WPN_DNUM BIT(2) +#define BIT_SHIFT_WPN_DNUM 2 +#define BIT_MASK_WPN_DNUM 0x1 +#define BIT_CTRL_WPN_DNUM(x) (((x) & BIT_MASK_WPN_DNUM) << BIT_SHIFT_WPN_DNUM) + +#define BIT_WPN_SET BIT(1) +#define BIT_SHIFT_WPN_SET 1 +#define BIT_MASK_WPN_SET 0x1 +#define BIT_CTRL_WPN_SET(x) (((x) & BIT_MASK_WPN_SET) << BIT_SHIFT_WPN_SET) + +#define BIT_SO_DUM BIT(0) +#define BIT_SHIFT_SO_DUM 0 +#define BIT_MASK_SO_DUM 0x1 +#define BIT_CTRL_SO_DUM(x) (((x) & BIT_MASK_SO_DUM) << BIT_SHIFT_SO_DUM) + +//2 REG_SPIC_FBAUDR + +#define BIT_SHIFT_FSCKDV 0 +#define BIT_MASK_FSCKDV 0xfff +#define BIT_FSCKDV(x) (((x) & BIT_MASK_FSCKDV) << BIT_SHIFT_FSCKDV) +#define BIT_CTRL_FSCKDV(x) (((x) & BIT_MASK_FSCKDV) << BIT_SHIFT_FSCKDV) +#define BIT_GET_FSCKDV(x) (((x) >> BIT_SHIFT_FSCKDV) & BIT_MASK_FSCKDV) + + +//2 REG_SPIC_ADDR_LENGTH + +#define BIT_SHIFT_ADDR_PHASE_LENGTH 0 +#define BIT_MASK_ADDR_PHASE_LENGTH 0x3 +#define BIT_ADDR_PHASE_LENGTH(x) (((x) & BIT_MASK_ADDR_PHASE_LENGTH) << BIT_SHIFT_ADDR_PHASE_LENGTH) +#define BIT_CTRL_ADDR_PHASE_LENGTH(x) (((x) & BIT_MASK_ADDR_PHASE_LENGTH) << BIT_SHIFT_ADDR_PHASE_LENGTH) +#define BIT_GET_ADDR_PHASE_LENGTH(x) (((x) >> BIT_SHIFT_ADDR_PHASE_LENGTH) & BIT_MASK_ADDR_PHASE_LENGTH) + + +//2 REG_SPIC_AUTO_LENGTH + +#define BIT_SHIFT_CS_H_WR_DUM_LEN 28 +#define BIT_MASK_CS_H_WR_DUM_LEN 0xf +#define BIT_CS_H_WR_DUM_LEN(x) (((x) & BIT_MASK_CS_H_WR_DUM_LEN) << BIT_SHIFT_CS_H_WR_DUM_LEN) +#define BIT_CTRL_CS_H_WR_DUM_LEN(x) (((x) & BIT_MASK_CS_H_WR_DUM_LEN) << BIT_SHIFT_CS_H_WR_DUM_LEN) +#define BIT_GET_CS_H_WR_DUM_LEN(x) (((x) >> BIT_SHIFT_CS_H_WR_DUM_LEN) & BIT_MASK_CS_H_WR_DUM_LEN) + + +#define BIT_SHIFT_CS_H_RD_DUM_LEN 26 +#define BIT_MASK_CS_H_RD_DUM_LEN 0x3 +#define BIT_CS_H_RD_DUM_LEN(x) (((x) & BIT_MASK_CS_H_RD_DUM_LEN) << BIT_SHIFT_CS_H_RD_DUM_LEN) +#define BIT_CTRL_CS_H_RD_DUM_LEN(x) (((x) & BIT_MASK_CS_H_RD_DUM_LEN) << BIT_SHIFT_CS_H_RD_DUM_LEN) +#define BIT_GET_CS_H_RD_DUM_LEN(x) (((x) >> BIT_SHIFT_CS_H_RD_DUM_LEN) & BIT_MASK_CS_H_RD_DUM_LEN) + + +#define BIT_SHIFT_AUTO_DUM_LEN 18 +#define BIT_MASK_AUTO_DUM_LEN 0xff +#define BIT_AUTO_DUM_LEN(x) (((x) & BIT_MASK_AUTO_DUM_LEN) << BIT_SHIFT_AUTO_DUM_LEN) +#define BIT_CTRL_AUTO_DUM_LEN(x) (((x) & BIT_MASK_AUTO_DUM_LEN) << BIT_SHIFT_AUTO_DUM_LEN) +#define BIT_GET_AUTO_DUM_LEN(x) (((x) >> BIT_SHIFT_AUTO_DUM_LEN) & BIT_MASK_AUTO_DUM_LEN) + + +#define BIT_SHIFT_AUTO_ADDR__LENGTH 16 +#define BIT_MASK_AUTO_ADDR__LENGTH 0x3 +#define BIT_AUTO_ADDR__LENGTH(x) (((x) & BIT_MASK_AUTO_ADDR__LENGTH) << BIT_SHIFT_AUTO_ADDR__LENGTH) +#define BIT_CTRL_AUTO_ADDR__LENGTH(x) (((x) & BIT_MASK_AUTO_ADDR__LENGTH) << BIT_SHIFT_AUTO_ADDR__LENGTH) +#define BIT_GET_AUTO_ADDR__LENGTH(x) (((x) >> BIT_SHIFT_AUTO_ADDR__LENGTH) & BIT_MASK_AUTO_ADDR__LENGTH) + + +#define BIT_SHIFT_RD_DUMMY_LENGTH 0 +#define BIT_MASK_RD_DUMMY_LENGTH 0xffff +#define BIT_RD_DUMMY_LENGTH(x) (((x) & BIT_MASK_RD_DUMMY_LENGTH) << BIT_SHIFT_RD_DUMMY_LENGTH) +#define BIT_CTRL_RD_DUMMY_LENGTH(x) (((x) & BIT_MASK_RD_DUMMY_LENGTH) << BIT_SHIFT_RD_DUMMY_LENGTH) +#define BIT_GET_RD_DUMMY_LENGTH(x) (((x) >> BIT_SHIFT_RD_DUMMY_LENGTH) & BIT_MASK_RD_DUMMY_LENGTH) + + +//2 REG_SPIC_VALID_CMD +#define BIT_WR_BLOCKING BIT(9) +#define BIT_SHIFT_WR_BLOCKING 9 +#define BIT_MASK_WR_BLOCKING 0x1 +#define BIT_CTRL_WR_BLOCKING(x) (((x) & BIT_MASK_WR_BLOCKING) << BIT_SHIFT_WR_BLOCKING) + +#define BIT_WR_QUAD_II BIT(8) +#define BIT_SHIFT_WR_QUAD_II 8 +#define BIT_MASK_WR_QUAD_II 0x1 +#define BIT_CTRL_WR_QUAD_II(x) (((x) & BIT_MASK_WR_QUAD_II) << BIT_SHIFT_WR_QUAD_II) + +#define BIT_WR_QUAD_I BIT(7) +#define BIT_SHIFT_WR_QUAD_I 7 +#define BIT_MASK_WR_QUAD_I 0x1 +#define BIT_CTRL_WR_QUAD_I(x) (((x) & BIT_MASK_WR_QUAD_I) << BIT_SHIFT_WR_QUAD_I) + +#define BIT_WR_DUAL_II BIT(6) +#define BIT_SHIFT_WR_DUAL_II 6 +#define BIT_MASK_WR_DUAL_II 0x1 +#define BIT_CTRL_WR_DUAL_II(x) (((x) & BIT_MASK_WR_DUAL_II) << BIT_SHIFT_WR_DUAL_II) + +#define BIT_WR_DUAL_I BIT(5) +#define BIT_SHIFT_WR_DUAL_I 5 +#define BIT_MASK_WR_DUAL_I 0x1 +#define BIT_CTRL_WR_DUAL_I(x) (((x) & BIT_MASK_WR_DUAL_I) << BIT_SHIFT_WR_DUAL_I) + +#define BIT_RD_QUAD_IO BIT(4) +#define BIT_SHIFT_RD_QUAD_IO 4 +#define BIT_MASK_RD_QUAD_IO 0x1 +#define BIT_CTRL_RD_QUAD_IO(x) (((x) & BIT_MASK_RD_QUAD_IO) << BIT_SHIFT_RD_QUAD_IO) + +#define BIT_RD_QUAD_O BIT(3) +#define BIT_SHIFT_RD_QUAD_O 3 +#define BIT_MASK_RD_QUAD_O 0x1 +#define BIT_CTRL_RD_QUAD_O(x) (((x) & BIT_MASK_RD_QUAD_O) << BIT_SHIFT_RD_QUAD_O) + +#define BIT_RD_DUAL_IO BIT(2) +#define BIT_SHIFT_RD_DUAL_IO 2 +#define BIT_MASK_RD_DUAL_IO 0x1 +#define BIT_CTRL_RD_DUAL_IO(x) (((x) & BIT_MASK_RD_DUAL_IO) << BIT_SHIFT_RD_DUAL_IO) + +#define BIT_RD_DUAL_I BIT(1) +#define BIT_SHIFT_RD_DUAL_I 1 +#define BIT_MASK_RD_DUAL_I 0x1 +#define BIT_CTRL_RD_DUAL_I(x) (((x) & BIT_MASK_RD_DUAL_I) << BIT_SHIFT_RD_DUAL_I) + +#define BIT_FRD_SINGEL BIT(0) +#define BIT_SHIFT_FRD_SINGEL 0 +#define BIT_MASK_FRD_SINGEL 0x1 +#define BIT_CTRL_FRD_SINGEL(x) (((x) & BIT_MASK_FRD_SINGEL) << BIT_SHIFT_FRD_SINGEL) + +//2 REG_SPIC_FLASE_SIZE + +#define BIT_SHIFT_FLASE_SIZE 0 +#define BIT_MASK_FLASE_SIZE 0xf +#define BIT_FLASE_SIZE(x) (((x) & BIT_MASK_FLASE_SIZE) << BIT_SHIFT_FLASE_SIZE) +#define BIT_CTRL_FLASE_SIZE(x) (((x) & BIT_MASK_FLASE_SIZE) << BIT_SHIFT_FLASE_SIZE) +#define BIT_GET_FLASE_SIZE(x) (((x) >> BIT_SHIFT_FLASE_SIZE) & BIT_MASK_FLASE_SIZE) + + +//2 REG_SPIC_FLUSH_FIFO +#define BIT_FLUSH_FIFO BIT(0) +#define BIT_SHIFT_FLUSH_FIFO 0 +#define BIT_MASK_FLUSH_FIFO 0x1 +#define BIT_CTRL_FLUSH_FIFO(x) (((x) & BIT_MASK_FLUSH_FIFO) << BIT_SHIFT_FLUSH_FIFO) + +//=================== Register Address Definition ============================// +#define REG_SPIC_CTRLR0 0x0000//O +#define REG_SPIC_CTRLR1 0x0004//O +#define REG_SPIC_SSIENR 0x0008//O +#define REG_SPIC_MWCR 0x000C +#define REG_SPIC_SER 0x0010//O +#define REG_SPIC_BAUDR 0x0014//O +#define REG_SPIC_TXFTLR 0x0018 +#define REG_SPIC_RXFTLR 0x001C//O +#define REG_SPIC_TXFLR 0x0020//O +#define REG_SPIC_RXFLR 0x0024 +#define REG_SPIC_SR 0x0028 +#define REG_SPIC_IMR 0x002C//O +#define REG_SPIC_ISR 0x0030 +#define REG_SPIC_RISR 0x0034 +#define REG_SPIC_TXOICR 0x0038 +#define REG_SPIC_RXOICR 0x003C +#define REG_SPC_RXUICR 0x0040 +#define REG_SPIC_MSTICR 0x0044 +#define REG_SPIC_ICR 0x0048 +#define REG_SPIC_DMACR 0x004C +#define REG_SPIC_DMATDLR0 0x0050 +#define REG_SPIC_DMATDLR1 0x0054 +#define REG_SPIC_IDR 0x0058 +#define REG_SPIC_VERSION 0x005C +#define REG_SPIC_DR0 0x0060 +#define REG_SPIC_DR1 0x0064 +#define REG_SPIC_DR2 0x0068 +#define REG_SPIC_DR3 0x006C +#define REG_SPIC_DR4 0x0070 +#define REG_SPIC_DR5 0x0074 +#define REG_SPIC_DR6 0x0078 +#define REG_SPIC_DR7 0x007C +#define REG_SPIC_DR8 0x0080 +#define REG_SPIC_DR9 0x0084 +#define REG_SPIC_DR10 0x0088 +#define REG_SPIC_DR11 0x008C +#define REG_SPIC_DR12 0x0090 +#define REG_SPIC_DR13 0x0094 +#define REG_SPIC_DR14 0x0098 +#define REG_SPIC_DR15 0x009C +#define REG_SPIC_DR16 0x00A0 +#define REG_SPIC_DR17 0x00A4 +#define REG_SPIC_DR18 0x00A8 +#define REG_SPIC_DR19 0x00AC +#define REG_SPIC_DR20 0x00B0 +#define REG_SPIC_DR21 0x00B4 +#define REG_SPIC_DR22 0x00B8 +#define REG_SPIC_DR23 0x00BC +#define REG_SPIC_DR24 0x00C0 +#define REG_SPIC_DR25 0x00C4 +#define REG_SPIC_DR26 0x00C8 +#define REG_SPIC_DR27 0x00CC +#define REG_SPIC_DR28 0x00D0 +#define REG_SPIC_DR29 0x00D4 +#define REG_SPIC_DR30 0x00D8 +#define REG_SPIC_DR31 0x00DC +#define REG_SPIC_READ_FAST_SINGLE 0x00E0//O +#define REG_SPIC_READ_DUAL_DATA 0x00E4//O +#define REG_SPIC_READ_DUAL_ADDR_DATA 0x00E8//O +#define REG_SPIC_READ_QUAD_DATA 0x00EC//O +#define REG_SPIC_READ_QUAD_ADDR_DATA 0x00F0//O +#define REG_SPIC_WRITE_SIGNLE 0x00F4//O +#define REG_SPIC_WRITE_DUAL_DATA 0x00F8//O +#define REG_SPIC_WRITE_DUAL_ADDR_DATA 0x00FC//O +#define REG_SPIC_WRITE_QUAD_DATA 0x0100//O +#define REG_SPIC_WRITE_QUAD_ADDR_DATA 0x0104//O +#define REG_SPIC_WRITE_ENABLE 0x0108//O +#define REG_SPIC_READ_STATUS 0x010C//O +#define REG_SPIC_CTRLR2 0x0110//O +#define REG_SPIC_FBAUDR 0x0114//O +#define REG_SPIC_ADDR_LENGTH 0x0118//O +#define REG_SPIC_AUTO_LENGTH 0x011C//O +#define REG_SPIC_VALID_CMD 0x0120//O +#define REG_SPIC_FLASE_SIZE 0x0124//O +#define REG_SPIC_FLUSH_FIFO 0x0128//O + +// +// Flash Map for System +// + +#define FLASH_SYS_DATA_BASE 0x7e000 + +#define FLASH_SYS_DATA_ADDR(_offset) (FLASH_SYS_DATA_BASE + _offset) + +#define FLASH_SYS_DATA_OFFSET_0 0x0 +#define FLASH_SYS_DATA_MAC_ADDR_LOW 0x0118 +#define FLASH_SYS_DATA_MAC_ADDR_HIGH 0x011c +#define FLASH_SYS_DATA_WAC_ADDR 0x0120 +#define FLASH_SYS_DATA_HAP_KEYPAIR_ADDR 0x0140 +#define FLASH_SYS_DATA_HAP_PAIRING_ADDR 0x0190 + +#endif // end of "#ifndef _RTL8195A_SPI_FLASH_H" diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_ssi.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_ssi.h new file mode 100644 index 0000000..4c7b337 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_ssi.h @@ -0,0 +1,474 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_SSI_H_ +#define _RTL8195A_SSI_H_ + + +/* Parameters of DW_apb_ssi for RTL8195A */ +#define SSI_TX_FIFO_DEPTH 64 +#define TX_ABW 6 // 1-8, log2(SSI_TX_FIFO_DEPTH) +#define SSI_RX_FIFO_DEPTH 64 +#define RX_ABW 6 // 1-8, log2(SSI_RX_FIFO_DEPTH) + +#define SSI0_REG_BASE 0x40042000 +#define SSI1_REG_BASE 0x40042400 +#define SSI2_REG_BASE 0x40042800 + +/* Memory Map of DW_apb_ssi */ +#define REG_DW_SSI_CTRLR0 0x00 // 16 bits +#define REG_DW_SSI_CTRLR1 0x04 // 16 bits +#define REG_DW_SSI_SSIENR 0x08 // 1 bit +#define REG_DW_SSI_MWCR 0x0C // 3 bits +#define REG_DW_SSI_SER 0x10 // +#define REG_DW_SSI_BAUDR 0x14 // 16 bits +#define REG_DW_SSI_TXFTLR 0x18 // TX_ABW +#define REG_DW_SSI_RXFTLR 0x1C // RX_ABW +#define REG_DW_SSI_TXFLR 0x20 // +#define REG_DW_SSI_RXFLR 0x24 // +#define REG_DW_SSI_SR 0x28 // 7 bits +#define REG_DW_SSI_IMR 0x2C // +#define REG_DW_SSI_ISR 0x30 // 6 bits +#define REG_DW_SSI_RISR 0x34 // 6 bits +#define REG_DW_SSI_TXOICR 0x38 // 1 bits +#define REG_DW_SSI_RXOICR 0x3C // 1 bits +#define REG_DW_SSI_RXUICR 0x40 // 1 bits +#define REG_DW_SSI_MSTICR 0x44 // 1 bits +#define REG_DW_SSI_ICR 0x48 // 1 bits +#define REG_DW_SSI_DMACR 0x4C // 2 bits +#define REG_DW_SSI_DMATDLR 0x50 // TX_ABW +#define REG_DW_SSI_DMARDLR 0x54 // RX_ABW +#define REG_DW_SSI_IDR 0x58 // 32 bits +#define REG_DW_SSI_COMP_VERSION 0x5C // 32 bits +#define REG_DW_SSI_DR 0x60 // 16 bits 0x60-0xEC +#define REG_DW_SSI_RX_SAMPLE_DLY 0xF0 // 8 bits +#define REG_DW_SSI_RSVD_0 0xF4 // 32 bits +#define REG_DW_SSI_RSVD_1 0xF8 // 32 bits +#define REG_DW_SSI_RSVD_2 0xFC // 32 bits + +// CTRLR0 0x00 // 16 bits, 6.2.1 +// DFS Reset Value: 0x7 +#define BIT_SHIFT_CTRLR0_DFS 0 +#define BIT_MASK_CTRLR0_DFS 0xF +#define BIT_CTRLR0_DFS(x)(((x) & BIT_MASK_CTRLR0_DFS) << BIT_SHIFT_CTRLR0_DFS) +#define BIT_INVC_CTRLR0_DFS (~(BIT_MASK_CTRLR0_DFS << BIT_SHIFT_CTRLR0_DFS)) + +#define BIT_SHIFT_CTRLR0_FRF 4 +#define BIT_MASK_CTRLR0_FRF 0x3 +#define BIT_CTRLR0_FRF(x)(((x) & BIT_MASK_CTRLR0_FRF) << BIT_SHIFT_CTRLR0_FRF) +#define BIT_INVC_CTRLR0_FRF (~(BIT_MASK_CTRLR0_FRF << BIT_SHIFT_CTRLR0_FRF)) + +#define BIT_SHIFT_CTRLR0_SCPH 6 +#define BIT_MASK_CTRLR0_SCPH 0x1 +#define BIT_CTRLR0_SCPH(x)(((x) & BIT_MASK_CTRLR0_SCPH) << BIT_SHIFT_CTRLR0_SCPH) +#define BIT_INVC_CTRLR0_SCPH (~(BIT_MASK_CTRLR0_SCPH << BIT_SHIFT_CTRLR0_SCPH)) + +#define BIT_SHIFT_CTRLR0_SCPOL 7 +#define BIT_MASK_CTRLR0_SCPOL 0x1 +#define BIT_CTRLR0_SCPOL(x)(((x) & BIT_MASK_CTRLR0_SCPOL) << BIT_SHIFT_CTRLR0_SCPOL) +#define BIT_INVC_CTRLR0_SCPOL (~(BIT_MASK_CTRLR0_SCPOL << BIT_SHIFT_CTRLR0_SCPOL)) + +#define BIT_SHIFT_CTRLR0_TMOD 8 +#define BIT_MASK_CTRLR0_TMOD 0x3 +#define BIT_CTRLR0_TMOD(x)(((x) & BIT_MASK_CTRLR0_TMOD) << BIT_SHIFT_CTRLR0_TMOD) +#define BIT_INVC_CTRLR0_TMOD (~(BIT_MASK_CTRLR0_TMOD << BIT_SHIFT_CTRLR0_TMOD)) + +#define BIT_SHIFT_CTRLR0_SLV_OE 10 +#define BIT_MASK_CTRLR0_SLV_OE 0x1 +#define BIT_CTRLR0_SLV_OE(x)(((x) & BIT_MASK_CTRLR0_SLV_OE) << BIT_SHIFT_CTRLR0_SLV_OE) +#define BIT_INVC_CTRLR0_SLV_OE (~(BIT_MASK_CTRLR0_SLV_OE << BIT_SHIFT_CTRLR0_SLV_OE)) + +#define BIT_SHIFT_CTRLR0_SRL 11 +#define BIT_MASK_CTRLR0_SRL 0x1 +#define BIT_CTRLR0_SRL(x)(((x) & BIT_MASK_CTRLR0_SRL) << BIT_SHIFT_CTRLR0_SRL) +#define BIT_INVC_CTRLR0_SRL (~(BIT_MASK_CTRLR0_SRL << BIT_SHIFT_CTRLR0_SRL)) + +#define BIT_SHIFT_CTRLR0_CFS 12 +#define BIT_MASK_CTRLR0_CFS 0xF +#define BIT_CTRLR0_CFS(x)(((x) & BIT_MASK_CTRLR0_CFS) << BIT_SHIFT_CTRLR0_CFS) +#define BIT_INVC_CTRLR0_CFS (~(BIT_MASK_CTRLR0_CFS << BIT_SHIFT_CTRLR0_CFS)) + +// CTRLR1 0x04 // 16 bits +#define BIT_SHIFT_CTRLR1_NDF 0 +#define BIT_MASK_CTRLR1_NDF 0xFFFF +#define BIT_CTRLR1_NDF(x)(((x) & BIT_MASK_CTRLR1_NDF) << BIT_SHIFT_CTRLR1_NDF) +#define BIT_INVC_CTRLR1_NDF (~(BIT_MASK_CTRLR1_NDF << BIT_SHIFT_CTRLR1_NDF)) + +// SSIENR 0x08 // 1 bit +#define BIT_SHIFT_SSIENR_SSI_EN 0 +#define BIT_MASK_SSIENR_SSI_EN 0x1 +#define BIT_SSIENR_SSI_EN(x)(((x) & BIT_MASK_SSIENR_SSI_EN) << BIT_SHIFT_SSIENR_SSI_EN) +#define BIT_INVC_SSIENR_SSI_EN (~(BIT_MASK_SSIENR_SSI_EN << BIT_SHIFT_SSIENR_SSI_EN)) + +// MWCR 0x0c // 3 bits +#define BIT_SHIFT_MWCR_MWMOD 0 +#define BIT_MASK_MWCR_MWMOD 0x1 +#define BIT_MWCR_MWMOD(x)(((x) & BIT_MASK_MWCR_MWMOD) << BIT_SHIFT_MWCR_MWMOD) +#define BIT_INVC_MWCR_MWMOD (~(BIT_MASK_MWCR_MWMOD << BIT_SHIFT_MWCR_MWMOD)) + +#define BIT_SHIFT_MWCR_MDD 1 +#define BIT_MASK_MWCR_MDD 0x1 +#define BIT_MWCR_MDD(x)(((x) & BIT_MASK_MWCR_MDD) << BIT_SHIFT_MWCR_MDD) +#define BIT_INVC_MWCR_MDD (~(BIT_MASK_MWCR_MDD << BIT_SHIFT_MWCR_MDD)) + +#define BIT_SHIFT_MWCR_MHS 2 +#define BIT_MASK_MWCR_MHS 0x1 +#define BIT_MWCR_MHS(x)(((x) & BIT_MASK_MWCR_MHS) << BIT_SHIFT_MWCR_MHS) +#define BIT_INVC_MWCR_MHS (~(BIT_MASK_MWCR_MHS << BIT_SHIFT_MWCR_MHS)) + +// SER 0x10 // Variable Length +#define BIT_SHIFT_SER_SER 0 +#define BIT_MASK_SER_SER 0xFF +#define BIT_SER_SER(x)(((x) & BIT_MASK_SER_SER) << BIT_SHIFT_SER_SER) +#define BIT_INVC_SER_SER (~(BIT_MASK_SER_SER << BIT_SHIFT_SER_SER)) + +// BAUDR 0x14 // 16 bits +#define BIT_SHIFT_BAUDR_SCKDV 0 +#define BIT_MASK_BAUDR_SCKDV 0xFFFF +#define BIT_BAUDR_SCKDV(x)(((x) & BIT_MASK_BAUDR_SCKDV) << BIT_SHIFT_BAUDR_SCKDV) +#define BIT_INVC_BAUDR_SCKDV (~(BIT_MASK_BAUDR_SCKDV << BIT_SHIFT_BAUDR_SCKDV)) + +// TXFLTR 0x18 // Variable Length +#define BIT_SHIFT_TXFTLR_TFT 0 +#define BIT_MASK_TXFTLR_TFT 0x3F // (TX_ABW-1):0 +#define BIT_TXFTLR_TFT(x)(((x) & BIT_MASK_TXFTLR_TFT) << BIT_SHIFT_TXFTLR_TFT) +#define BIT_INVC_TXFTLR_TFT (~(BIT_MASK_TXFTLR_TFT << BIT_SHIFT_TXFTLR_TFT)) + +// RXFLTR 0x1c // Variable Length +#define BIT_SHIFT_RXFTLR_RFT 0 +#define BIT_MASK_RXFTLR_RFT 0x3F // (RX_ABW-1):0 +#define BIT_RXFTLR_RFT(x)(((x) & BIT_MASK_RXFTLR_RFT) << BIT_SHIFT_RXFTLR_RFT) +#define BIT_INVC_RXFTLR_RFT (~(BIT_MASK_RXFTLR_RFT << BIT_SHIFT_RXFTLR_RFT)) + +// TXFLR 0x20 // see [READ ONLY] +#define BIT_MASK_TXFLR_TXTFL 0x7F // (TX_ABW):0 + +// RXFLR 0x24 // see [READ ONLY] +#define BIT_MASK_RXFLR_RXTFL 0x7F // (RX_ABW):0 + +// SR 0x28 // 7 bits [READ ONLY] +#define BIT_SR_BUSY BIT0 +#define BIT_SR_TFNF BIT1 +#define BIT_SR_TFE BIT2 +#define BIT_SR_RFNE BIT3 +#define BIT_SR_RFF BIT4 +#define BIT_SR_TXE BIT5 +#define BIT_SR_DCOL BIT6 + +// IMR 0x2c // see +#define BIT_SHIFT_IMR_TXEIM 0 +#define BIT_MASK_IMR_TXEIM 0x1 +// #define BIT_IMR_TXEIM(x)(((x) & BIT_MASK_IMR_TXEIM) << BIT_SHIFT_IMR_TXEIM) +#define BIT_INVC_IMR_TXEIM (~(BIT_MASK_IMR_TXEIM << BIT_SHIFT_IMR_TXEIM)) + +#define BIT_SHIFT_IMR_TXOIM 1 +#define BIT_MASK_IMR_TXOIM 0x1 +// #define BIT_IMR_TXOIM(x)(((x) & BIT_MASK_IMR_TXOIM) << BIT_SHIFT_IMR_TXOIM) +#define BIT_INVC_IMR_TXOIM (~(BIT_MASK_IMR_TXOIM << BIT_SHIFT_IMR_TXOIM)) + +#define BIT_SHIFT_IMR_RXUIM 2 +#define BIT_MASK_IMR_RXUIM 0x1 +// #define BIT_IMR_RXUIM(x)(((x) & BIT_MASK_IMR_RXUIM) << BIT_SHIFT_IMR_RXUIM) +#define BIT_INVC_IMR_RXUIM (~(BIT_MASK_IMR_RXUIM << BIT_SHIFT_IMR_RXUIM)) + +#define BIT_SHIFT_IMR_RXOIM 3 +#define BIT_MASK_IMR_RXOIM 0x1 +// #define BIT_IMR_RXOIM(x)(((x) & BIT_MASK_IMR_RXOIM) << BIT_SHIFT_IMR_RXOIM) +#define BIT_INVC_IMR_RXOIM (~(BIT_MASK_IMR_RXOIM << BIT_SHIFT_IMR_RXOIM)) + +#define BIT_SHIFT_IMR_RXFIM 4 +#define BIT_MASK_IMR_RXFIM 0x1 +// #define BIT_IMR_RXFIM(x)(((x) & BIT_MASK_IMR_RXFIM) << BIT_SHIFT_IMR_RXFIM) +#define BIT_INVC_IMR_RXFIM (~(BIT_MASK_IMR_RXFIM << BIT_SHIFT_IMR_RXFIM)) + +#define BIT_SHIFT_IMR_MSTIM 5 +#define BIT_MASK_IMR_MSTIM 0x1 +// #define BIT_IMR_MSTIM(x)(((x) & BIT_MASK_IMR_MSTIM) << BIT_SHIFT_IMR_MSTIM) +#define BIT_INVC_IMR_MSTIM (~(BIT_MASK_IMR_MSTIM << BIT_SHIFT_IMR_MSTIM)) + +#define BIT_IMR_TXEIM BIT0 +#define BIT_IMR_TXOIM BIT1 +#define BIT_IMR_RXUIM BIT2 +#define BIT_IMR_RXOIM BIT3 +#define BIT_IMR_RXFIM BIT4 +#define BIT_IMR_MSTIM BIT5 + +// ISR 0x30 // 6 bits [READ ONLY] +#define BIT_ISR_TXEIS BIT0 +#define BIT_ISR_TXOIS BIT1 +#define BIT_ISR_RXUIS BIT2 +#define BIT_ISR_RXOIS BIT3 +#define BIT_ISR_RXFIS BIT4 +#define BIT_ISR_MSTIS BIT5 + +// RISR 0x34 // 6 bits [READ ONLY] +#define BIT_RISR_TXEIR BIT0 +#define BIT_RISR_TXOIR BIT1 +#define BIT_RISR_RXUIR BIT2 +#define BIT_RISR_RXOIR BIT3 +#define BIT_RISR_RXFIR BIT4 +#define BIT_RISR_MSTIR BIT5 + +// TXOICR 0x38 // 1 bits [READ ONLY] +// RXOICR 0x3c // 1 bits [READ ONLY] +// RXUICR 0x40 // 1 bits [READ ONLY] +// MSTICR 0x44 // 1 bits [READ ONLY] +// ICR 0x48 // 1 bits [READ ONLY] + +// DMACR 0x4c // 2 bits +#define BIT_SHIFT_DMACR_RDMAE 0 +#define BIT_MASK_DMACR_RDMAE 0x1 +#define BIT_DMACR_RDMAE(x)(((x) & BIT_MASK_DMACR_RDMAE) << BIT_SHIFT_DMACR_RDMAE) +#define BIT_INVC_DMACR_RDMAE (~(BIT_MASK_DMACR_RDMAE << BIT_SHIFT_DMACR_RDMAE)) + +#define BIT_SHIFT_DMACR_TDMAE 1 +#define BIT_MASK_DMACR_TDMAE 0x1 +#define BIT_DMACR_TDMAE(x)(((x) & BIT_MASK_DMACR_TDMAE) << BIT_SHIFT_DMACR_TDMAE) +#define BIT_INVC_DMACR_TDMAE (~(BIT_MASK_DMACR_TDMAE << BIT_SHIFT_DMACR_TDMAE)) + +// DMATDLR 0x50 +#define BIT_SHIFT_DMATDLR_DMATDL 0 +#define BIT_MASK_DMATDLR_DMATDL 0x3F // (TX_ABW-1):0 +#define BIT_DMATDLR_DMATDL(x)(((x) & BIT_MASK_DMATDLR_DMATDL) << BIT_SHIFT_DMATDLR_DMATDL) +#define BIT_INVC_DMATDLR_DMATDL (~(BIT_MASK_DMATDLR_DMATDL << BIT_SHIFT_DMATDLR_DMATDL)) + +// DMARDLR 0x54 +#define BIT_SHIFT_DMARDLR_DMARDL 0 +#define BIT_MASK_DMARDLR_DMARDL 0x3F // (RX_ABW-1):0 +#define BIT_DMARDLR_DMARDL(x)(((x) & BIT_MASK_DMARDLR_DMARDL) << BIT_SHIFT_DMARDLR_DMARDL) +#define BIT_INVC_DMARDLR_DMARDL (~(BIT_MASK_DMARDLR_DMARDL << BIT_SHIFT_DMARDLR_DMARDL)) + +// IDR 0x58 // 32 bits [READ ONLY] +// COMP_VERSION 0x5c // 32 bits [READ ONLY] + +// DR 0x60 // 16 bits 0x60-0xEC +#define BIT_SHIFT_DR_DR 0 +#define BIT_MASK_DR_DR 0xFFFF +#define BIT_DR_DR(x)(((x) & BIT_MASK_DR_DR) << BIT_SHIFT_DR_DR) +#define BIT_INVC_DR_DR (~(BIT_MASK_DR_DR << BIT_SHIFT_DR_DR)) + +// RX_SAMPLE_DLY 0xF0 // 8 bits +#define BIT_SHIFT_RX_SAMPLE_DLY_RSD 0 +#define BIT_MASK_RX_SAMPLE_DLY_RSD 0xFFFF +#define BIT_RX_SAMPLE_DLY_RSD(x)(((x) & BIT_MASK_RX_SAMPLE_DLY_RSD) << BIT_SHIFT_RX_SAMPLE_DLY_RSD) +#define BIT_INVC_RX_SAMPLE_DLY_RSD (~(BIT_MASK_RX_SAMPLE_DLY_RSD << BIT_SHIFT_RX_SAMPLE_DLY_RSD)) + +// RSVD_0 0xF4 // 32 bits +// RSVD_1 0xF8 // 32 bits +// RSVD_2 0xFC // 32 bits + +// SSI0 Pinmux +#define BIT_SHIFT_SSI0_PIN_EN 0 +#define BIT_MASK_SSI0_PIN_EN 0x1 +#define BIT_SSI0_PIN_EN(x)(((x) & BIT_MASK_SSI0_PIN_EN) << BIT_SHIFT_SSI0_PIN_EN) +#define BIT_INVC_SSI0_PIN_EN (~(BIT_MASK_SSI0_PIN_EN << BIT_SHIFT_SSI0_PIN_EN)) + +#define BIT_SHIFT_SSI0_PIN_SEL 1 +#define BIT_MASK_SSI0_PIN_SEL 0x7 +#define BIT_SSI0_PIN_SEL(x)(((x) & BIT_MASK_SSI0_PIN_SEL) << BIT_SHIFT_SSI0_PIN_SEL) +#define BIT_INVC_SSI0_PIN_SEL (~(BIT_MASK_SSI0_PIN_SEL << BIT_SHIFT_SSI0_PIN_SEL)) + +// SSI1 Pinmux +#define BIT_SHIFT_SSI1_PIN_EN 4 +#define BIT_MASK_SSI1_PIN_EN 0x1 +#define BIT_SSI1_PIN_EN(x)(((x) & BIT_MASK_SSI1_PIN_EN) << BIT_SHIFT_SSI1_PIN_EN) +#define BIT_INVC_SSI1_PIN_EN (~(BIT_MASK_SSI1_PIN_EN << BIT_SHIFT_SSI1_PIN_EN)) + +#define BIT_SHIFT_SSI1_PIN_SEL 5 +#define BIT_MASK_SSI1_PIN_SEL 0x7 +#define BIT_SSI1_PIN_SEL(x)(((x) & BIT_MASK_SSI1_PIN_SEL) << BIT_SHIFT_SSI1_PIN_SEL) +#define BIT_INVC_SSI1_PIN_SEL (~(BIT_MASK_SSI1_PIN_SEL << BIT_SHIFT_SSI1_PIN_SEL)) + +// SSI2 Pinmux +#define BIT_SHIFT_SSI2_PIN_EN 8 +#define BIT_MASK_SSI2_PIN_EN 0x1 +#define BIT_SSI2_PIN_EN(x)(((x) & BIT_MASK_SSI2_PIN_EN) << BIT_SHIFT_SSI2_PIN_EN) +#define BIT_INVC_SSI2_PIN_EN (~(BIT_MASK_SSI2_PIN_EN << BIT_SHIFT_SSI2_PIN_EN)) + +#define BIT_SHIFT_SSI2_PIN_SEL 9 +#define BIT_MASK_SSI2_PIN_SEL 0x7 +#define BIT_SSI2_PIN_SEL(x)(((x) & BIT_MASK_SSI2_PIN_SEL) << BIT_SHIFT_SSI2_PIN_SEL) +#define BIT_INVC_SSI2_PIN_SEL (~(BIT_MASK_SSI2_PIN_SEL << BIT_SHIFT_SSI2_PIN_SEL)) + +// SSI0 Multiple Chip Selection (Pinmux Select is controlled by BIT_SSI0_PIN_SEL) +#define BIT_SHIFT_SSI0_MULTI_CS_EN 28 +#define BIT_MASK_SSI0_MULTI_CS_EN 0x1 +#define BIT_SSI0_MULTI_CS_EN(x)(((x) & BIT_MASK_SSI0_MULTI_CS_EN) << BIT_SHIFT_SSI0_MULTI_CS_EN) +#define BIT_INVC_SSI0_MULTI_CS_EN (~(BIT_MASK_SSI0_MULTI_CS_EN << BIT_SHIFT_SSI0_MULTI_CS_EN)) + + +#define HAL_SSI_READ32(SsiIndex, addr) \ + HAL_READ32(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr) +#define HAL_SSI_WRITE32(SsiIndex, addr, value) \ + HAL_WRITE32(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr, value) +#define HAL_SSI_READ16(SsiIndex, addr) \ + HAL_READ16(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr) +#define HAL_SSI_WRITE16(SsiIndex, addr, value) \ + HAL_WRITE16(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr, value) +#define HAL_SSI_READ8(SsiIndex, addr) \ + HAL_READ8(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr) +#define HAL_SSI_WRITE8(SsiIndex, addr, value) \ + HAL_WRITE8(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr, value) + + +// SSI Pinmux Select +typedef enum _SSI0_PINMUX_SELECT_ { + SSI0_MUX_TO_GPIOE = S0, + SSI0_MUX_TO_GPIOC = S1 +}SSI0_PINMUX_SELECT, *PSSI0_PINMUX_SELECT; + +typedef enum _SSI1_PINMUX_SELECT_ { + SSI1_MUX_TO_GPIOA = S0, + SSI1_MUX_TO_GPIOB = S1, + SSI1_MUX_TO_GPIOD = S2 +}SSI1_PINMUX_SELECT, *PSSI1_PINMUX_SELECT; + +typedef enum _SSI2_PINMUX_SELECT_ { + SSI2_MUX_TO_GPIOG = S0, + SSI2_MUX_TO_GPIOE = S1, + SSI2_MUX_TO_GPIOD = S2 +}SSI2_PINMUX_SELECT, *PSSI2_PINMUX_SELECT; + +typedef enum _SSI0_MULTI_CS_PINMUX_SELECT_ { + SSI0_CS_MUX_TO_GPIOE = S0, + SSI0_CS_MUX_TO_GPIOC = S1 +}SSI0_MULTI_CS_PINMUX_SELECT, *PSSI0_MULTI_CS_PINMUX_SELECT; + +typedef enum _SSI_CTRLR0_TMOD_ { + TMOD_TR = 0, + TMOD_TO = 1, + TMOD_RO = 2, + TMOD_EEPROM_R = 3 +}SSI_CTRLR0_TMOD, *PSSI_CTRLR0_TMOD; + +typedef enum _SSI_CTRLR0_SCPOL_ { + SCPOL_INACTIVE_IS_LOW = 0, + SCPOL_INACTIVE_IS_HIGH = 1 +}SSI_CTRLR0_SCPOL, *PSSI_CTRLR0_SCPOL; + +typedef enum _SSI_CTRLR0_SCPH_ { + SCPH_TOGGLES_IN_MIDDLE = 0, + SCPH_TOGGLES_AT_START = 1 +}SSI_CTRLR0_SCPH, *PSSI_CTRLR0_SCPH; + +typedef enum _SSI_CTRLR0_DFS_ { + DFS_4_BITS = 3, + DFS_5_BITS = 4, + DFS_6_BITS = 5, + DFS_7_BITS = 6, + DFS_8_BITS = 7, + DFS_9_BITS = 8, + DFS_10_BITS = 9, + DFS_11_BITS = 10, + DFS_12_BITS = 11, + DFS_13_BITS = 12, + DFS_14_BITS = 13, + DFS_15_BITS = 14, + DFS_16_BITS = 15, +}SSI_CTRLR0_DFS, *PSSI_CTRLR0_DFS; + +typedef enum _SSI_CTRLR0_CFS_ { + CFS_1_BIT = 0, + CFS_2_BITS = 1, + CFS_3_BITS = 2, + CFS_4_BITS = 3, + CFS_5_BITS = 4, + CFS_6_BITS = 5, + CFS_7_BITS = 6, + CFS_8_BITS = 7, + CFS_9_BITS = 8, + CFS_10_BITS = 9, + CFS_11_BITS = 10, + CFS_12_BITS = 11, + CFS_13_BITS = 12, + CFS_14_BITS = 13, + CFS_15_BITS = 14, + CFS_16_BITS = 15 +}SSI_CTRLR0_CFS, *PSSI_CTRLR0_CFS; + +typedef enum _SSI_CTRLR0_SLV_OE_ { + SLV_TXD_ENABLE = 0, + SLV_TXD_DISABLE = 1 +}SSI_CTRLR0_SLV_OE, *PSSI_CTRLR0_SLV_OE; + +typedef enum _SSI_ROLE_SELECT_ { + SSI_SLAVE = 0, + SSI_MASTER = 1 +}SSI_ROLE_SELECT, *PSSI_ROLE_SELECT; + +typedef enum _SSI_FRAME_FORMAT_ { + FRF_MOTOROLA_SPI = 0, + FRF_TI_SSP = 1, + FRF_NS_MICROWIRE = 2, + FRF_RSVD = 3 +}SSI_FRAME_FORMAT, *PSSI_FRAME_FORMAT; + +typedef enum _SSI_DMACR_ENABLE_ { + SSI_NODMA = 0, + SSI_RXDMA_ENABLE = 1, + SSI_TXDMA_ENABLE = 2, + SSI_TRDMA_ENABLE = 3 +}SSI_DMACR_ENABLE, *PSSI_DMACR_ENABLE; + +typedef enum _SSI_MWCR_HANDSHAKE_ { + MW_HANDSHAKE_DISABLE = 0, + MW_HANDSHAKE_ENABLE = 1 +}SSI_MWCR_HANDSHAKE, *PSSI_MWCR_HANDSHAKE; + +typedef enum _SSI_MWCR_DIRECTION_ { + MW_DIRECTION_SLAVE_TO_MASTER = 0, + MW_DIRECTION_MASTER_TO_SLAVE = 1 +}SSI_MWCR_DIRECTION, *PSSI_MWCR_DIRECTION; + +typedef enum _SSI_MWCR_TMOD_ { + MW_TMOD_NONSEQUENTIAL = 0, + MW_TMOD_SEQUENTIAL = 1 +}SSI_MWCR_TMOD, *PSSI_MWCR_TMOD; + +typedef enum _SSI_DATA_TRANSFER_MECHANISM_ { + SSI_DTM_BASIC, + SSI_DTM_INTERRUPT, + SSI_DTM_DMA +}SSI_DATA_TRANSFER_MECHANISM, *PSSI_DATA_TRANSFER_MECHANISM; + + +_LONG_CALL_ HAL_Status HalSsiPinmuxEnableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiEnableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiDisableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiInitRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetSclkPolarityRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetSclkPhaseRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiWriteRtl8195a(VOID *Adaptor, u32 value); +_LONG_CALL_ HAL_Status HalSsiLoadSettingRtl8195a(VOID *Adaptor, VOID *Setting); +_LONG_CALL_ HAL_Status HalSsiSetInterruptMaskRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetDeviceRoleRtl8195a(VOID *Adaptor, u32 Role); +_LONG_CALL_ HAL_Status HalSsiInterruptEnableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiInterruptDisableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiReadInterruptRtl8195a(VOID *Adaptor, VOID *RxData, u32 Length); +_LONG_CALL_ HAL_Status HalSsiSetRxFifoThresholdLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetTxFifoThresholdLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiWriteInterruptRtl8195a(VOID *Adaptor, VOID *TxData, u32 Length); +_LONG_CALL_ HAL_Status HalSsiSetSlaveEnableRegisterRtl8195a(VOID *Adaptor, u32 SlaveIndex); +_LONG_CALL_ u32 HalSsiBusyRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiWriteableRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiReadableRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetInterruptMaskRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetRxFifoLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetTxFifoLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetStatusRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetInterruptStatusRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiReadRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetRawInterruptStatusRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetSlaveEnableRegisterRtl8195a(VOID *Adaptor); + +_LONG_CALL_ VOID _SsiReadInterrupt(VOID *Adaptor); +_LONG_CALL_ VOID _SsiWriteInterrupt(VOID *Adaptor); +_LONG_CALL_ u32 _SsiIrqHandle(VOID *Adaptor); + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_sys_on.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_sys_on.h new file mode 100644 index 0000000..2c5ef62 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_sys_on.h @@ -0,0 +1,1093 @@ +#ifndef __INC_RTL8195A_SYS_ON_BIT_H +#define __INC_RTL8195A_SYS_ON_BIT_H + +#define CPU_OPT_WIDTH 0x1F + +//2 REG_NOT_VALID + +//2 REG_SYS_PWR_CTRL + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_PWR_SOC_EN BIT(2) +#define BIT_SYS_PWR_RET_MEM_EN BIT(1) +#define BIT_SYS_PWR_PEON_EN BIT(0) + +//2 REG_SYS_ISO_CTRL + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_ISO_SYSPLL BIT(7) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_ISO_SOC BIT(2) +#define BIT_SYS_ISO_RET_MEM BIT(1) +#define BIT_SYS_ISO_PEON BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_FUNC_EN +#define BIT_SYS_AMACRO_EN BIT(31) +#define BIT_SYS_PWRON_TRAP_SHTDN_N BIT(30) +#define BIT_SYS_FEN_SIC_MST BIT(25) +#define BIT_SYS_FEN_SIC BIT(24) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SOC_SYSPEON_EN BIT(4) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_FEN_EELDR BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_CLK_CTRL0 + +//2 REG_NOT_VALID +#define BIT_SOC_OCP_IOBUS_CK_EN BIT(2) +#define BIT_SYSON_CK_EELDR_EN BIT(1) +#define BIT_SYSON_CK_SYSREG_EN BIT(0) + +//2 REG_SYS_CLK_CTRL1 + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +#define BIT_SHIFT_PESOC_OCP_CPU_CK_SEL 4 +#define BIT_MASK_PESOC_OCP_CPU_CK_SEL 0x7 +#define BIT_PESOC_OCP_CPU_CK_SEL(x) (((x) & BIT_MASK_PESOC_OCP_CPU_CK_SEL) << BIT_SHIFT_PESOC_OCP_CPU_CK_SEL) + + +//2 REG_NOT_VALID +#define BIT_PESOC_EELDR_CK_SEL BIT(0) + +//2 REG_SYS_SWR_CTRL3 + +//2 REG_RSV_CTRL + +//2 REG_RF_CTRL + +//2 REG_SYS_EFUSE_SYSCFG0 + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_05_00 24 +#define BIT_MASK_SYS_EEROM_SWR_PAR_05_00 0x3f +#define BIT_SYS_EEROM_SWR_PAR_05_00(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_05_00) << BIT_SHIFT_SYS_EEROM_SWR_PAR_05_00) + + +#define BIT_SHIFT_SYS_EEROM_LDO_PAR_07_04 20 +#define BIT_MASK_SYS_EEROM_LDO_PAR_07_04 0xf +#define BIT_SYS_EEROM_LDO_PAR_07_04(x) (((x) & BIT_MASK_SYS_EEROM_LDO_PAR_07_04) << BIT_SHIFT_SYS_EEROM_LDO_PAR_07_04) + +#define BIT_SYS_CHIPPDN_EN BIT(17) +#define BIT_SYS_EEROM_B12V_EN BIT(16) + +#define BIT_SHIFT_SYS_EEROM_VID1 8 +#define BIT_MASK_SYS_EEROM_VID1 0xff +#define BIT_SYS_EEROM_VID1(x) (((x) & BIT_MASK_SYS_EEROM_VID1) << BIT_SHIFT_SYS_EEROM_VID1) + + +#define BIT_SHIFT_SYS_EEROM_VID0 0 +#define BIT_MASK_SYS_EEROM_VID0 0xff +#define BIT_SYS_EEROM_VID0(x) (((x) & BIT_MASK_SYS_EEROM_VID0) << BIT_SHIFT_SYS_EEROM_VID0) + + +//2 REG_SYS_EFUSE_SYSCFG1 + +#define BIT_SHIFT_SYS_PDSPL_STL 24 +#define BIT_MASK_SYS_PDSPL_STL 0x3 +#define BIT_SYS_PDSPL_STL(x) (((x) & BIT_MASK_SYS_PDSPL_STL) << BIT_SHIFT_SYS_PDSPL_STL) + + +#define BIT_SHIFT_SYS_PDSOC_STL 22 +#define BIT_MASK_SYS_PDSOC_STL 0x3 +#define BIT_SYS_PDSOC_STL(x) (((x) & BIT_MASK_SYS_PDSOC_STL) << BIT_SHIFT_SYS_PDSOC_STL) + + +#define BIT_SHIFT_SYS_PDPON_STL 20 +#define BIT_MASK_SYS_PDPON_STL 0x3 +#define BIT_SYS_PDPON_STL(x) (((x) & BIT_MASK_SYS_PDPON_STL) << BIT_SHIFT_SYS_PDPON_STL) + + +#define BIT_SHIFT_SYS_SWREG_XRT 18 +#define BIT_MASK_SYS_SWREG_XRT 0x3 +#define BIT_SYS_SWREG_XRT(x) (((x) & BIT_MASK_SYS_SWREG_XRT) << BIT_SHIFT_SYS_SWREG_XRT) + + +#define BIT_SHIFT_SYS_SWSLC_STL 16 +#define BIT_MASK_SYS_SWSLC_STL 0x3 +#define BIT_SYS_SWSLC_STL(x) (((x) & BIT_MASK_SYS_SWSLC_STL) << BIT_SHIFT_SYS_SWSLC_STL) + + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_46_45 14 +#define BIT_MASK_SYS_EEROM_SWR_PAR_46_45 0x3 +#define BIT_SYS_EEROM_SWR_PAR_46_45(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_46_45) << BIT_SHIFT_SYS_EEROM_SWR_PAR_46_45) + + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_40_39 12 +#define BIT_MASK_SYS_EEROM_SWR_PAR_40_39 0x3 +#define BIT_SYS_EEROM_SWR_PAR_40_39(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_40_39) << BIT_SHIFT_SYS_EEROM_SWR_PAR_40_39) + + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_33_26 4 +#define BIT_MASK_SYS_EEROM_SWR_PAR_33_26 0xff +#define BIT_SYS_EEROM_SWR_PAR_33_26(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_33_26) << BIT_SHIFT_SYS_EEROM_SWR_PAR_33_26) + + +#define BIT_SHIFT_SYS_EEROM_SWSLD_VOL 0 +#define BIT_MASK_SYS_EEROM_SWSLD_VOL 0x7 +#define BIT_SYS_EEROM_SWSLD_VOL(x) (((x) & BIT_MASK_SYS_EEROM_SWSLD_VOL) << BIT_SHIFT_SYS_EEROM_SWSLD_VOL) + + +//2 REG_SYS_EFUSE_SYSCFG2 + +#define BIT_SHIFT_SYS_EERROM_ANAPAR_SPLL_24_15 21 +#define BIT_MASK_SYS_EERROM_ANAPAR_SPLL_24_15 0x3ff +#define BIT_SYS_EERROM_ANAPAR_SPLL_24_15(x) (((x) & BIT_MASK_SYS_EERROM_ANAPAR_SPLL_24_15) << BIT_SHIFT_SYS_EERROM_ANAPAR_SPLL_24_15) + + +#define BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_05_02 16 +#define BIT_MASK_SYS_EEROM_ANAPAR_SPLL_05_02 0xf +#define BIT_SYS_EEROM_ANAPAR_SPLL_05_02(x) (((x) & BIT_MASK_SYS_EEROM_ANAPAR_SPLL_05_02) << BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_05_02) + + +#define BIT_SHIFT_SYS_EEROM_XTAL_STEL_SEL 12 +#define BIT_MASK_SYS_EEROM_XTAL_STEL_SEL 0x3 +#define BIT_SYS_EEROM_XTAL_STEL_SEL(x) (((x) & BIT_MASK_SYS_EEROM_XTAL_STEL_SEL) << BIT_SHIFT_SYS_EEROM_XTAL_STEL_SEL) + + +#define BIT_SHIFT_SYS_EEROM_XTAL_FREQ_SEL 8 +#define BIT_MASK_SYS_EEROM_XTAL_FREQ_SEL 0xf +#define BIT_SYS_EEROM_XTAL_FREQ_SEL(x) (((x) & BIT_MASK_SYS_EEROM_XTAL_FREQ_SEL) << BIT_SHIFT_SYS_EEROM_XTAL_FREQ_SEL) + + +//2 REG_SYS_EFUSE_SYSCFG3 + +#define BIT_SHIFT_SYS_DBG_PINGP_EN 28 +#define BIT_MASK_SYS_DBG_PINGP_EN 0xf +#define BIT_SYS_DBG_PINGP_EN(x) (((x) & BIT_MASK_SYS_DBG_PINGP_EN) << BIT_SHIFT_SYS_DBG_PINGP_EN) + + +#define BIT_SHIFT_SYS_DBG_SEL 16 +#define BIT_MASK_SYS_DBG_SEL 0xfff +#define BIT_SYS_DBG_SEL(x) (((x) & BIT_MASK_SYS_DBG_SEL) << BIT_SHIFT_SYS_DBG_SEL) + + +#define BIT_SHIFT_SYS_DBGBY3_LOC_SEL 14 +#define BIT_MASK_SYS_DBGBY3_LOC_SEL 0x3 +#define BIT_SYS_DBGBY3_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY3_LOC_SEL) << BIT_SHIFT_SYS_DBGBY3_LOC_SEL) + + +#define BIT_SHIFT_SYS_DBGBY2_LOC_SEL 12 +#define BIT_MASK_SYS_DBGBY2_LOC_SEL 0x3 +#define BIT_SYS_DBGBY2_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY2_LOC_SEL) << BIT_SHIFT_SYS_DBGBY2_LOC_SEL) + + +#define BIT_SHIFT_SYS_DBGBY1_LOC_SEL 10 +#define BIT_MASK_SYS_DBGBY1_LOC_SEL 0x3 +#define BIT_SYS_DBGBY1_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY1_LOC_SEL) << BIT_SHIFT_SYS_DBGBY1_LOC_SEL) + + +#define BIT_SHIFT_SYS_DBGBY0_LOC_SEL 8 +#define BIT_MASK_SYS_DBGBY0_LOC_SEL 0x3 +#define BIT_SYS_DBGBY0_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY0_LOC_SEL) << BIT_SHIFT_SYS_DBGBY0_LOC_SEL) + +#define BIT_SYS_EEROM_ANAPAR_SPLL_49 BIT(3) + +#define BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_27_25 0 +#define BIT_MASK_SYS_EEROM_ANAPAR_SPLL_27_25 0x7 +#define BIT_SYS_EEROM_ANAPAR_SPLL_27_25(x) (((x) & BIT_MASK_SYS_EEROM_ANAPAR_SPLL_27_25) << BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_27_25) + + +//2 REG_SYS_EFUSE_SYSCFG4 + +#define BIT_SHIFT_SYS_GPIOA_E2 1 +#define BIT_MASK_SYS_GPIOA_E2 0x7 +#define BIT_SYS_GPIOA_E2(x) (((x) & BIT_MASK_SYS_GPIOA_E2) << BIT_SHIFT_SYS_GPIOA_E2) + +#define BIT_SYS_GPIOA_H3L1 BIT(0) + +//2 REG_SYS_EFUSE_SYSCFG5 + +//2 REG_NOT_VALID + +//2 REG_SYS_EFUSE_SYSCFG6 + +#define BIT_SHIFT_SYS_SPIC_INIT_BAUD_RATE_SEL 26 +#define BIT_MASK_SYS_SPIC_INIT_BAUD_RATE_SEL 0x3 +#define BIT_SYS_SPIC_INIT_BAUD_RATE_SEL(x) (((x) & BIT_MASK_SYS_SPIC_INIT_BAUD_RATE_SEL) << BIT_SHIFT_SYS_SPIC_INIT_BAUD_RATE_SEL) + + +#define BIT_SHIFT_SYS_CPU_CLK_SEL 24 +#define BIT_MASK_SYS_CPU_CLK_SEL 0x3 +#define BIT_SYS_CPU_CLK_SEL(x) (((x) & BIT_MASK_SYS_CPU_CLK_SEL) << BIT_SHIFT_SYS_CPU_CLK_SEL) + + +//2 REG_SYS_EFUSE_SYSCFG7 +#define BIT_SYS_MEM_RMV_SIGN BIT(31) +#define BIT_SYS_MEM_RMV_1PRF1 BIT(29) +#define BIT_SYS_MEM_RMV_1PRF0 BIT(28) +#define BIT_SYS_MEM_RMV_1PSR BIT(27) +#define BIT_SYS_MEM_RMV_1PHSR BIT(26) +#define BIT_SYS_MEM_RMV_ROM BIT(25) + +#define BIT_SHIFT_SYS_MEM_RME_CPU 22 +#define BIT_MASK_SYS_MEM_RME_CPU 0x7 +#define BIT_SYS_MEM_RME_CPU(x) (((x) & BIT_MASK_SYS_MEM_RME_CPU) << BIT_SHIFT_SYS_MEM_RME_CPU) + + +#define BIT_SHIFT_SYS_MEM_RME_WLAN 19 +#define BIT_MASK_SYS_MEM_RME_WLAN 0x7 +#define BIT_SYS_MEM_RME_WLAN(x) (((x) & BIT_MASK_SYS_MEM_RME_WLAN) << BIT_SHIFT_SYS_MEM_RME_WLAN) + +#define BIT_SYS_MEM_RME_USB BIT(18) +#define BIT_SYS_MEM_RME_SDIO BIT(17) + +//2 REG_SYS_REGU_CTRL0 + +#define BIT_SHIFT_SYS_REGU_LDO25M_ADJ 20 +#define BIT_MASK_SYS_REGU_LDO25M_ADJ 0xf +#define BIT_SYS_REGU_LDO25M_ADJ(x) (((x) & BIT_MASK_SYS_REGU_LDO25M_ADJ) << BIT_SHIFT_SYS_REGU_LDO25M_ADJ) + +#define BIT_SYS_REGU_ANACK_4M_EN BIT(19) +#define BIT_SYS_REGU_ANACK_4M_SEL BIT(18) +#define BIT_SYS_REGU_PC_EF_EN BIT(17) +#define BIT_SYS_REGU_LDOH12_SLP_EN BIT(16) + +#define BIT_SHIFT_SYS_REGU_LDOH12_ADJ 12 +#define BIT_MASK_SYS_REGU_LDOH12_ADJ 0xf +#define BIT_SYS_REGU_LDOH12_ADJ(x) (((x) & BIT_MASK_SYS_REGU_LDOH12_ADJ) << BIT_SHIFT_SYS_REGU_LDOH12_ADJ) + + +#define BIT_SHIFT_SYS_REGU_LDO25E_ADJ 8 +#define BIT_MASK_SYS_REGU_LDO25E_ADJ 0xf +#define BIT_SYS_REGU_LDO25E_ADJ(x) (((x) & BIT_MASK_SYS_REGU_LDO25E_ADJ) << BIT_SHIFT_SYS_REGU_LDO25E_ADJ) + +#define BIT_SYS_REGU_DSLEPM_EN BIT(7) +#define BIT_SYS_REGU_PC_33V_EN BIT(3) +#define BIT_SYS_REGU_PC_EF25_EN BIT(2) +#define BIT_SYS_REGU_LDO25M_EN BIT(1) +#define BIT_SYS_REGU_LDO25E_EN BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_SWR_CTRL0 + +#define BIT_SHIFT_SYS_SWR12_COMP_R2 30 +#define BIT_MASK_SYS_SWR12_COMP_R2 0x3 +#define BIT_SYS_SWR12_COMP_R2(x) (((x) & BIT_MASK_SYS_SWR12_COMP_R2) << BIT_SHIFT_SYS_SWR12_COMP_R2) + + +#define BIT_SHIFT_SYS_SWR12_COMP_R1 28 +#define BIT_MASK_SYS_SWR12_COMP_R1 0x3 +#define BIT_SYS_SWR12_COMP_R1(x) (((x) & BIT_MASK_SYS_SWR12_COMP_R1) << BIT_SHIFT_SYS_SWR12_COMP_R1) + + +#define BIT_SHIFT_SYS_SWR12_COMP_C3 26 +#define BIT_MASK_SYS_SWR12_COMP_C3 0x3 +#define BIT_SYS_SWR12_COMP_C3(x) (((x) & BIT_MASK_SYS_SWR12_COMP_C3) << BIT_SHIFT_SYS_SWR12_COMP_C3) + + +#define BIT_SHIFT_SYS_SWR12_COMP_C2 24 +#define BIT_MASK_SYS_SWR12_COMP_C2 0x3 +#define BIT_SYS_SWR12_COMP_C2(x) (((x) & BIT_MASK_SYS_SWR12_COMP_C2) << BIT_SHIFT_SYS_SWR12_COMP_C2) + + +#define BIT_SHIFT_SYS_SWR12_COMP_C1 22 +#define BIT_MASK_SYS_SWR12_COMP_C1 0x3 +#define BIT_SYS_SWR12_COMP_C1(x) (((x) & BIT_MASK_SYS_SWR12_COMP_C1) << BIT_SHIFT_SYS_SWR12_COMP_C1) + +#define BIT_SYS_SWR12_COMP_TYPE_L BIT(21) +#define BIT_SYS_SWR12_FPWM_MD BIT(20) + +#define BIT_SHIFT_SYS_SPSLDO_VOL 17 +#define BIT_MASK_SYS_SPSLDO_VOL 0x7 +#define BIT_SYS_SPSLDO_VOL(x) (((x) & BIT_MASK_SYS_SPSLDO_VOL) << BIT_SHIFT_SYS_SPSLDO_VOL) + + +#define BIT_SHIFT_SYS_SWR12_IN 14 +#define BIT_MASK_SYS_SWR12_IN 0x7 +#define BIT_SYS_SWR12_IN(x) (((x) & BIT_MASK_SYS_SWR12_IN) << BIT_SHIFT_SYS_SWR12_IN) + + +#define BIT_SHIFT_SYS_SWR12_STD 12 +#define BIT_MASK_SYS_SWR12_STD 0x3 +#define BIT_SYS_SWR12_STD(x) (((x) & BIT_MASK_SYS_SWR12_STD) << BIT_SHIFT_SYS_SWR12_STD) + + +#define BIT_SHIFT_SYS_SWR12_VOL 8 +#define BIT_MASK_SYS_SWR12_VOL 0xf +#define BIT_SYS_SWR12_VOL(x) (((x) & BIT_MASK_SYS_SWR12_VOL) << BIT_SHIFT_SYS_SWR12_VOL) + + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_SWR_EN BIT(1) +#define BIT_SYS_SWR_LDO_EN BIT(0) + +//2 REG_SYS_SWR_CTRL1 +#define BIT_SYS_SW12_PFM_SEL BIT(25) +#define BIT_SYS_SW12_AUTO_ZCD_L BIT(24) +#define BIT_SYS_SW12_AUTO_MODE BIT(23) +#define BIT_SYS_SW12_LDOF_L BIT(22) +#define BIT_SYS_SW12_OCPS_L BIT(21) + +#define BIT_SHIFT_SYS_SW12_TBOX 17 +#define BIT_MASK_SYS_SW12_TBOX 0x3 +#define BIT_SYS_SW12_TBOX(x) (((x) & BIT_MASK_SYS_SW12_TBOX) << BIT_SHIFT_SYS_SW12_TBOX) + + +#define BIT_SHIFT_SYS_SW12_NONOVRLAP_DLY 15 +#define BIT_MASK_SYS_SW12_NONOVRLAP_DLY 0x3 +#define BIT_SYS_SW12_NONOVRLAP_DLY(x) (((x) & BIT_MASK_SYS_SW12_NONOVRLAP_DLY) << BIT_SHIFT_SYS_SW12_NONOVRLAP_DLY) + +#define BIT_SYS_SW12_CLAMP_DUTY BIT(14) +#define BIT_SYS_SWR12_BYPASS_SSR BIT(13) +#define BIT_SYS_SWR12_ZCDOUT_EN BIT(12) +#define BIT_SYS_SWR12_POW_ZCD BIT(11) +#define BIT_SYS_SW12_AREN BIT(10) + +#define BIT_SHIFT_SYS_SWR12_OCP_CUR 7 +#define BIT_MASK_SYS_SWR12_OCP_CUR 0x7 +#define BIT_SYS_SWR12_OCP_CUR(x) (((x) & BIT_MASK_SYS_SWR12_OCP_CUR) << BIT_SHIFT_SYS_SWR12_OCP_CUR) + +#define BIT_SYS_SWR12_OCP_EN BIT(6) + +#define BIT_SHIFT_SYS_SWR12_SAWTOOTH_CF_L 4 +#define BIT_MASK_SYS_SWR12_SAWTOOTH_CF_L 0x3 +#define BIT_SYS_SWR12_SAWTOOTH_CF_L(x) (((x) & BIT_MASK_SYS_SWR12_SAWTOOTH_CF_L) << BIT_SHIFT_SYS_SWR12_SAWTOOTH_CF_L) + + +#define BIT_SHIFT_SYS_SWR12_SAWTOOTH_CFC_L 2 +#define BIT_MASK_SYS_SWR12_SAWTOOTH_CFC_L 0x3 +#define BIT_SYS_SWR12_SAWTOOTH_CFC_L(x) (((x) & BIT_MASK_SYS_SWR12_SAWTOOTH_CFC_L) << BIT_SHIFT_SYS_SWR12_SAWTOOTH_CFC_L) + + +#define BIT_SHIFT_SYS_SWR12_COMP_R3 0 +#define BIT_MASK_SYS_SWR12_COMP_R3 0x3 +#define BIT_SYS_SWR12_COMP_R3(x) (((x) & BIT_MASK_SYS_SWR12_COMP_R3) << BIT_SHIFT_SYS_SWR12_COMP_R3) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_SYS_XTAL_CTRL0 +#define BIT_SYS_XTAL_XQSEL BIT(31) +#define BIT_SYS_XTAL_XQSEL_RF BIT(30) + +#define BIT_SHIFT_SYS_XTAL_SC_XO 24 +#define BIT_MASK_SYS_XTAL_SC_XO 0x3f +#define BIT_SYS_XTAL_SC_XO(x) (((x) & BIT_MASK_SYS_XTAL_SC_XO) << BIT_SHIFT_SYS_XTAL_SC_XO) + + +#define BIT_SHIFT_SYS_XTAL_SC_XI 18 +#define BIT_MASK_SYS_XTAL_SC_XI 0x3f +#define BIT_SYS_XTAL_SC_XI(x) (((x) & BIT_MASK_SYS_XTAL_SC_XI) << BIT_SHIFT_SYS_XTAL_SC_XI) + + +#define BIT_SHIFT_SYS_XTAL_GMN 13 +#define BIT_MASK_SYS_XTAL_GMN 0x1f +#define BIT_SYS_XTAL_GMN(x) (((x) & BIT_MASK_SYS_XTAL_GMN) << BIT_SHIFT_SYS_XTAL_GMN) + + +#define BIT_SHIFT_SYS_XTAL_GMP 8 +#define BIT_MASK_SYS_XTAL_GMP 0x1f +#define BIT_SYS_XTAL_GMP(x) (((x) & BIT_MASK_SYS_XTAL_GMP) << BIT_SHIFT_SYS_XTAL_GMP) + +#define BIT_SYS_XTAL_EN BIT(1) +#define BIT_SYS_XTAL_BGMB_EN BIT(0) + +//2 REG_SYS_XTAL_CTRL1 + +#define BIT_SHIFT_SYS_XTAL_COUNTER_MUX 25 +#define BIT_MASK_SYS_XTAL_COUNTER_MUX 0x3 +#define BIT_SYS_XTAL_COUNTER_MUX(x) (((x) & BIT_MASK_SYS_XTAL_COUNTER_MUX) << BIT_SHIFT_SYS_XTAL_COUNTER_MUX) + +#define BIT_SYS_XTAL_DELAY_SYSPLL BIT(24) +#define BIT_SYS_XTAL_DELAY_USB BIT(23) +#define BIT_SYS_XTAL_DELAY_WLAFE BIT(22) +#define BIT_SYS_XTAL_AGPIO_SEL BIT(21) + +#define BIT_SHIFT_SYS_XTAL_DRV_AGPIO 19 +#define BIT_MASK_SYS_XTAL_DRV_AGPIO 0x3 +#define BIT_SYS_XTAL_DRV_AGPIO(x) (((x) & BIT_MASK_SYS_XTAL_DRV_AGPIO) << BIT_SHIFT_SYS_XTAL_DRV_AGPIO) + + +#define BIT_SHIFT_SYS_XTAL_AGPIO 16 +#define BIT_MASK_SYS_XTAL_AGPIO 0x7 +#define BIT_SYS_XTAL_AGPIO(x) (((x) & BIT_MASK_SYS_XTAL_AGPIO) << BIT_SHIFT_SYS_XTAL_AGPIO) + + +#define BIT_SHIFT_SYS_XTAL_DRV_SYSPLL 14 +#define BIT_MASK_SYS_XTAL_DRV_SYSPLL 0x3 +#define BIT_SYS_XTAL_DRV_SYSPLL(x) (((x) & BIT_MASK_SYS_XTAL_DRV_SYSPLL) << BIT_SHIFT_SYS_XTAL_DRV_SYSPLL) + +#define BIT_SYS_XTAL_GATE_SYSPLL BIT(13) + +#define BIT_SHIFT_SYS_XTAL_DRV_USB 11 +#define BIT_MASK_SYS_XTAL_DRV_USB 0x3 +#define BIT_SYS_XTAL_DRV_USB(x) (((x) & BIT_MASK_SYS_XTAL_DRV_USB) << BIT_SHIFT_SYS_XTAL_DRV_USB) + +#define BIT_SYS_XTAL_GATE_USB BIT(10) + +#define BIT_SHIFT_SYS_XTAL_DRV_WLAFE 8 +#define BIT_MASK_SYS_XTAL_DRV_WLAFE 0x3 +#define BIT_SYS_XTAL_DRV_WLAFE(x) (((x) & BIT_MASK_SYS_XTAL_DRV_WLAFE) << BIT_SHIFT_SYS_XTAL_DRV_WLAFE) + +#define BIT_SYS_XTAL_GATE_WLAFE BIT(7) + +#define BIT_SHIFT_SYS_XTAL_DRV_RF2 5 +#define BIT_MASK_SYS_XTAL_DRV_RF2 0x3 +#define BIT_SYS_XTAL_DRV_RF2(x) (((x) & BIT_MASK_SYS_XTAL_DRV_RF2) << BIT_SHIFT_SYS_XTAL_DRV_RF2) + +#define BIT_SYS_XTAL_GATE_RF2 BIT(4) + +#define BIT_SHIFT_SYS_XTAL_DRV_RF1 3 +#define BIT_MASK_SYS_XTAL_DRV_RF1 0x3 +#define BIT_SYS_XTAL_DRV_RF1(x) (((x) & BIT_MASK_SYS_XTAL_DRV_RF1) << BIT_SHIFT_SYS_XTAL_DRV_RF1) + +#define BIT_SYS_XTAL_GATE_RF1 BIT(1) + +#define BIT_SHIFT_SYS_XTAL_LDO 0 +#define BIT_MASK_SYS_XTAL_LDO 0x3 +#define BIT_SYS_XTAL_LDO(x) (((x) & BIT_MASK_SYS_XTAL_LDO) << BIT_SHIFT_SYS_XTAL_LDO) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_SYS_SYSPLL_CTRL0 + +#define BIT_SHIFT_SYS_SYSPLL_LPF_R3 29 +#define BIT_MASK_SYS_SYSPLL_LPF_R3 0x7 +#define BIT_SYS_SYSPLL_LPF_R3(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_R3) << BIT_SHIFT_SYS_SYSPLL_LPF_R3) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_CS 27 +#define BIT_MASK_SYS_SYSPLL_LPF_CS 0x3 +#define BIT_SYS_SYSPLL_LPF_CS(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_CS) << BIT_SHIFT_SYS_SYSPLL_LPF_CS) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_CP 25 +#define BIT_MASK_SYS_SYSPLL_LPF_CP 0x3 +#define BIT_SYS_SYSPLL_LPF_CP(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_CP) << BIT_SHIFT_SYS_SYSPLL_LPF_CP) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_C3 23 +#define BIT_MASK_SYS_SYSPLL_LPF_C3 0x3 +#define BIT_SYS_SYSPLL_LPF_C3(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_C3) << BIT_SHIFT_SYS_SYSPLL_LPF_C3) + +#define BIT_SYS_SYSPLL_WDOG_ENB BIT(22) +#define BIT_SYS_SYSPLL_CKTST_EN BIT(21) + +#define BIT_SHIFT_SYS_SYSPLL_MONCK_SEL 18 +#define BIT_MASK_SYS_SYSPLL_MONCK_SEL 0x7 +#define BIT_SYS_SYSPLL_MONCK_SEL(x) (((x) & BIT_MASK_SYS_SYSPLL_MONCK_SEL) << BIT_SHIFT_SYS_SYSPLL_MONCK_SEL) + + +#define BIT_SHIFT_SYS_SYSPLL_CP_IOFFSET 13 +#define BIT_MASK_SYS_SYSPLL_CP_IOFFSET 0x1f +#define BIT_SYS_SYSPLL_CP_IOFFSET(x) (((x) & BIT_MASK_SYS_SYSPLL_CP_IOFFSET) << BIT_SHIFT_SYS_SYSPLL_CP_IOFFSET) + +#define BIT_SYS_SYSPLL_CP_IDOUBLE BIT(12) + +#define BIT_SHIFT_SYS_SYSPLL_CP_BIAS 9 +#define BIT_MASK_SYS_SYSPLL_CP_BIAS 0x7 +#define BIT_SYS_SYSPLL_CP_BIAS(x) (((x) & BIT_MASK_SYS_SYSPLL_CP_BIAS) << BIT_SHIFT_SYS_SYSPLL_CP_BIAS) + +#define BIT_SYS_SYSPLL_FREF_EDGE BIT(8) +#define BIT_SYS_SYSPLL_EN BIT(1) +#define BIT_SYS_SYSPLL_LVPC_EN BIT(0) + +//2 REG_SYS_SYSPLL_CTRL1 +#define BIT_SYS_SYSPLL_CK500K_SEL BIT(15) +#define BIT_SYS_SYSPLL_CK200M_EN BIT(14) +#define BIT_SYS_SYSPLL_CKSDR_EN BIT(13) + +#define BIT_SHIFT_SYS_SYSPLL_CKSDR_DIV 11 +#define BIT_MASK_SYS_SYSPLL_CKSDR_DIV 0x3 +#define BIT_SYS_SYSPLL_CKSDR_DIV(x) (((x) & BIT_MASK_SYS_SYSPLL_CKSDR_DIV) << BIT_SHIFT_SYS_SYSPLL_CKSDR_DIV) + +#define BIT_SYS_SYSPLL_CK24P576_EN BIT(9) +#define BIT_SYS_SYSPLL_CK22P5792_EN BIT(8) +#define BIT_SYS_SYSPLL_CK_PS_EN BIT(6) + +#define BIT_SHIFT_SYS_SYSPLL_CK_PS_SEL 3 +#define BIT_MASK_SYS_SYSPLL_CK_PS_SEL 0x7 +#define BIT_SYS_SYSPLL_CK_PS_SEL(x) (((x) & BIT_MASK_SYS_SYSPLL_CK_PS_SEL) << BIT_SHIFT_SYS_SYSPLL_CK_PS_SEL) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_RS 0 +#define BIT_MASK_SYS_SYSPLL_LPF_RS 0x7 +#define BIT_SYS_SYSPLL_LPF_RS(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_RS) << BIT_SHIFT_SYS_SYSPLL_LPF_RS) + + +//2 REG_SYS_SYSPLL_CTRL2 + +#define BIT_SHIFT_XTAL_DRV_RF_LATCH 0 +#define BIT_MASK_XTAL_DRV_RF_LATCH 0xffffffffL +#define BIT_XTAL_DRV_RF_LATCH(x) (((x) & BIT_MASK_XTAL_DRV_RF_LATCH) << BIT_SHIFT_XTAL_DRV_RF_LATCH) + + +//2 REG_RSVD + +//2 REG_RSVD + +#define BIT_SHIFT_PESOC_CPU_OCP_CK_SEL 0 +#define BIT_MASK_PESOC_CPU_OCP_CK_SEL 0x7 +#define BIT_PESOC_CPU_OCP_CK_SEL(x) (((x) & BIT_MASK_PESOC_CPU_OCP_CK_SEL) << BIT_SHIFT_PESOC_CPU_OCP_CK_SEL) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_ + +//2 REG_SYS_ANA_TIM_CTRL + +#define BIT_SHIFT_SYS_ANACK_TU_TIME 16 +#define BIT_MASK_SYS_ANACK_TU_TIME 0x3f +#define BIT_SYS_ANACK_TU_TIME(x) (((x) & BIT_MASK_SYS_ANACK_TU_TIME) << BIT_SHIFT_SYS_ANACK_TU_TIME) + +#define BIT_SYS_DSBYCNT_EN BIT(15) + +#define BIT_SHIFT_SYS_DSTDY_TIM_SCAL 8 +#define BIT_MASK_SYS_DSTDY_TIM_SCAL 0xf +#define BIT_SYS_DSTDY_TIM_SCAL(x) (((x) & BIT_MASK_SYS_DSTDY_TIM_SCAL) << BIT_SHIFT_SYS_DSTDY_TIM_SCAL) + + +#define BIT_SHIFT_SYS_DSTBY_TIM_PERIOD 0 +#define BIT_MASK_SYS_DSTBY_TIM_PERIOD 0xff +#define BIT_SYS_DSTBY_TIM_PERIOD(x) (((x) & BIT_MASK_SYS_DSTBY_TIM_PERIOD) << BIT_SHIFT_SYS_DSTBY_TIM_PERIOD) + + +//2 REG_SYS_DSLP_TIM_CTRL + +#define BIT_SHIFT_SYS_REGU_ASIF_EN 24 +#define BIT_MASK_SYS_REGU_ASIF_EN 0xff +#define BIT_SYS_REGU_ASIF_EN(x) (((x) & BIT_MASK_SYS_REGU_ASIF_EN) << BIT_SHIFT_SYS_REGU_ASIF_EN) + + +#define BIT_SHIFT_SYS_REGU_ASIF_THP_DA 20 +#define BIT_MASK_SYS_REGU_ASIF_THP_DA 0x3 +#define BIT_SYS_REGU_ASIF_THP_DA(x) (((x) & BIT_MASK_SYS_REGU_ASIF_THP_DA) << BIT_SHIFT_SYS_REGU_ASIF_THP_DA) + + +#define BIT_SHIFT_SYS_REGU_ASIF_TPD_CK 18 +#define BIT_MASK_SYS_REGU_ASIF_TPD_CK 0x3 +#define BIT_SYS_REGU_ASIF_TPD_CK(x) (((x) & BIT_MASK_SYS_REGU_ASIF_TPD_CK) << BIT_SHIFT_SYS_REGU_ASIF_TPD_CK) + + +#define BIT_SHIFT_SYS_REGU_ASIF_TSP_DA 16 +#define BIT_MASK_SYS_REGU_ASIF_TSP_DA 0x3 +#define BIT_SYS_REGU_ASIF_TSP_DA(x) (((x) & BIT_MASK_SYS_REGU_ASIF_TSP_DA) << BIT_SHIFT_SYS_REGU_ASIF_TSP_DA) + +#define BIT_SYS_REGU_ASIF_POLL BIT(15) +#define BIT_SYS_REGU_ASIF_MODE BIT(14) +#define BIT_SYS_REGU_ASIF_WE BIT(12) + +#define BIT_SHIFT_SYS_REGU_ASIF_AD 8 +#define BIT_MASK_SYS_REGU_ASIF_AD 0xf +#define BIT_SYS_REGU_ASIF_AD(x) (((x) & BIT_MASK_SYS_REGU_ASIF_AD) << BIT_SHIFT_SYS_REGU_ASIF_AD) + + +#define BIT_SHIFT_SYS_REGU_ASIF_WD 0 +#define BIT_MASK_SYS_REGU_ASIF_WD 0xff +#define BIT_SYS_REGU_ASIF_WD(x) (((x) & BIT_MASK_SYS_REGU_ASIF_WD) << BIT_SHIFT_SYS_REGU_ASIF_WD) + + +//2 REG_SYS_DSLP_TIM_CAL_CTRL +#define BIT_SYS_DSLP_TIM_EN BIT(24) + +#define BIT_SHIFT_SYS_DSLP_TIM_PERIOD 0 +#define BIT_MASK_SYS_DSLP_TIM_PERIOD 0x7fffff +#define BIT_SYS_DSLP_TIM_PERIOD(x) (((x) & BIT_MASK_SYS_DSLP_TIM_PERIOD) << BIT_SHIFT_SYS_DSLP_TIM_PERIOD) + + +//2 REG_RSVD + +//2 REG_SYS_DEBUG_CTRL +#define BIT_SYS_DBG_PIN_EN BIT(0) + +//2 REG_SYS_PINMUX_CTRL +#define BIT_EEPROM_PIN_EN BIT(4) +#define BIT_SIC_PIN_EN BIT(0) + +//2 REG_SYS_GPIO_DSTBY_WAKE_CTRL0 +#define BIT_SYS_GPIOE3_WEVENT_STS BIT(27) +#define BIT_SYS_GPIOD5_WEVENT_STS BIT(26) +#define BIT_SYS_GPIOC7_WEVENT_STS BIT(25) +#define BIT_SYS_GPIOA5_WEVENT_STS BIT(24) +#define BIT_SYS_GPIO_GPE3_PULL_CTRL_EN BIT(19) +#define BIT_SYS_GPIO_GPD5_PULL_CTRL_EN BIT(18) +#define BIT_SYS_GPIO_GPC7_PULL_CTRL_EN BIT(17) +#define BIT_SYS_GPIO_GPA5_PULL_CTRL_EN BIT(16) +#define BIT_SYS_GPIOE3_WINT_MODE BIT(11) +#define BIT_SYS_GPIOD5_WINT_MODE BIT(10) +#define BIT_SYS_GPIOC7_WINT_MODE BIT(9) +#define BIT_SYS_GPIOA5_WINT_MODE BIT(8) +#define BIT_SYS_GPIOE3_PIN_EN BIT(3) +#define BIT_SYS_GPIOD5_PIN_EN BIT(2) +#define BIT_SYS_GPIOC7_PIN_EN BIT(1) +#define BIT_SYS_GPIOA5_PIN_EN BIT(0) + +//2 REG_SYS_GPIO_DSTBY_WAKE_CTRL1 +#define BIT_SYS_GPIOE3_SHTDN_N BIT(19) +#define BIT_SYS_GPIOD5_SHTDN_N BIT(18) +#define BIT_SYS_GPIOC7_SHTDN_N BIT(17) +#define BIT_SYS_GPIOA5_SHTDN_N BIT(16) + +#define BIT_SHIFT_SYS_WINT_DEBOUNCE_TIM_SCAL 8 +#define BIT_MASK_SYS_WINT_DEBOUNCE_TIM_SCAL 0x3 +#define BIT_SYS_WINT_DEBOUNCE_TIM_SCAL(x) (((x) & BIT_MASK_SYS_WINT_DEBOUNCE_TIM_SCAL) << BIT_SHIFT_SYS_WINT_DEBOUNCE_TIM_SCAL) + +#define BIT_SYS_GPIOE3_WINT_DEBOUNCE_EN BIT(3) +#define BIT_SYS_GPIOD5_WINT_DEBOUNCE_EN BIT(2) +#define BIT_SYS_GPIOC7_WINT_DEBOUNCE_EN BIT(1) +#define BIT_SYS_GPIOA5_WINT_DEBOUNCE_EN BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_DEBUG_REG + +#define BIT_SHIFT_SYS_DBG_VALUE 0 +#define BIT_MASK_SYS_DBG_VALUE 0xffffffffL +#define BIT_SYS_DBG_VALUE(x) (((x) & BIT_MASK_SYS_DBG_VALUE) << BIT_SHIFT_SYS_DBG_VALUE) + + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_EEPROM_CTRL0 + +#define BIT_SHIFT_EFUSE_UNLOCK 24 +#define BIT_MASK_EFUSE_UNLOCK 0xff +#define BIT_EFUSE_UNLOCK(x) (((x) & BIT_MASK_EFUSE_UNLOCK) << BIT_SHIFT_EFUSE_UNLOCK) + + +//2 REG_NOT_VALID +#define BIT_SYS_EFUSE_LDALL BIT(16) + +#define BIT_SHIFT_SYS_EEPROM_VPDIDX 8 +#define BIT_MASK_SYS_EEPROM_VPDIDX 0xff +#define BIT_SYS_EEPROM_VPDIDX(x) (((x) & BIT_MASK_SYS_EEPROM_VPDIDX) << BIT_SHIFT_SYS_EEPROM_VPDIDX) + + +#define BIT_SHIFT_SYS_EEPROM_MD 6 +#define BIT_MASK_SYS_EEPROM_MD 0x3 +#define BIT_SYS_EEPROM_MD(x) (((x) & BIT_MASK_SYS_EEPROM_MD) << BIT_SHIFT_SYS_EEPROM_MD) + +#define BIT_SYS_AUTOLOAD_SUS BIT(5) +#define BIT_SYS_EEPROM_SEL BIT(4) +#define BIT_SYS_EEPROM_EECS BIT(3) +#define BIT_SYS_EEPROM_EESK BIT(2) +#define BIT_SYS_EEPROM_EEDI BIT(1) +#define BIT_SYS_EEPROM_EEDO BIT(0) + +//2 REG_SYS_EEPROM_CTRL1 + +#define BIT_SHIFT_SYS_EEPROM_VPD 0 +#define BIT_MASK_SYS_EEPROM_VPD 0xffffffffL +#define BIT_SYS_EEPROM_VPD(x) (((x) & BIT_MASK_SYS_EEPROM_VPD) << BIT_SHIFT_SYS_EEPROM_VPD) + + +//2 REG_SYS_EFUSE_CTRL +#define BIT_SYS_EF_RWFLAG BIT(31) + +#define BIT_SHIFT_SYS_EF_PGPD 28 +#define BIT_MASK_SYS_EF_PGPD 0x7 +#define BIT_SYS_EF_PGPD(x) (((x) & BIT_MASK_SYS_EF_PGPD) << BIT_SHIFT_SYS_EF_PGPD) + + +#define BIT_SHIFT_SYS_EF_RDT 24 +#define BIT_MASK_SYS_EF_RDT 0xf +#define BIT_SYS_EF_RDT(x) (((x) & BIT_MASK_SYS_EF_RDT) << BIT_SHIFT_SYS_EF_RDT) + + +#define BIT_SHIFT_SYS_EF_PGTS 20 +#define BIT_MASK_SYS_EF_PGTS 0xf +#define BIT_SYS_EF_PGTS(x) (((x) & BIT_MASK_SYS_EF_PGTS) << BIT_SHIFT_SYS_EF_PGTS) + +#define BIT_SYS_EF_PDWN BIT(19) +#define BIT_SYS_EF_ALDEN BIT(18) + +#define BIT_SHIFT_SYS_EF_ADDR 8 +#define BIT_MASK_SYS_EF_ADDR 0x3ff +#define BIT_SYS_EF_ADDR(x) (((x) & BIT_MASK_SYS_EF_ADDR) << BIT_SHIFT_SYS_EF_ADDR) + + +#define BIT_SHIFT_SYS_EF_DATA 0 +#define BIT_MASK_SYS_EF_DATA 0xff +#define BIT_SYS_EF_DATA(x) (((x) & BIT_MASK_SYS_EF_DATA) << BIT_SHIFT_SYS_EF_DATA) + + +//2 REG_SYS_EFUSE_TEST +#define BIT_SYS_EF_CRES_SEL BIT(26) + +#define BIT_SHIFT_SYS_EF_SCAN_START 16 +#define BIT_MASK_SYS_EF_SCAN_START 0x1ff +#define BIT_SYS_EF_SCAN_START(x) (((x) & BIT_MASK_SYS_EF_SCAN_START) << BIT_SHIFT_SYS_EF_SCAN_START) + + +#define BIT_SHIFT_SYS_EF_SCAN_END 12 +#define BIT_MASK_SYS_EF_SCAN_END 0xf +#define BIT_SYS_EF_SCAN_END(x) (((x) & BIT_MASK_SYS_EF_SCAN_END) << BIT_SHIFT_SYS_EF_SCAN_END) + +#define BIT_SYS_EF_FORCE_PGMEN BIT(11) + +#define BIT_SHIFT_SYS_EF_CELL_SEL 8 +#define BIT_MASK_SYS_EF_CELL_SEL 0x3 +#define BIT_SYS_EF_CELL_SEL(x) (((x) & BIT_MASK_SYS_EF_CELL_SEL) << BIT_SHIFT_SYS_EF_CELL_SEL) + +#define BIT_SYS_EF_TRPT BIT(7) + +#define BIT_SHIFT_SYS_EF_SCAN_TTHD 0 +#define BIT_MASK_SYS_EF_SCAN_TTHD 0x7f +#define BIT_SYS_EF_SCAN_TTHD(x) (((x) & BIT_MASK_SYS_EF_SCAN_TTHD) << BIT_SHIFT_SYS_EF_SCAN_TTHD) + + +//2 REG_SYS_DSTBY_INFO0 + +//2 REG_NOT_VALID + +//2 REG_SYS_DSTBY_INFO1 + +//2 REG_SYS_DSTBY_INFO2 + +//2 REG_NOT_VALID + +//2 REG_SYS_DSTBY_INFO3 + +//2 REG_SYS_SLP_WAKE_EVENT_MSK0 +#define BIT_SYSON_WEVT_GPIO_DSTBY_MSK BIT(29) +#define BIT_SYSON_WEVT_A33_MSK BIT(28) +#define BIT_SYSON_WEVT_ADC_MSK BIT(26) +#define BIT_SYSON_WEVT_I2C_MSK BIT(24) +#define BIT_SYSON_WEVT_SPI_MSK BIT(22) +#define BIT_SYSON_WEVT_UART_MSK BIT(20) +#define BIT_SYSON_WEVT_USB_MSK BIT(16) +#define BIT_SYSON_WEVT_SDIO_MSK BIT(14) +#define BIT_SYSON_WEVT_NFC_MSK BIT(9) +#define BIT_SYSON_WEVT_WLAN_MSK BIT(8) +#define BIT_SYSON_WEVT_GPIO_MSK BIT(4) +#define BIT_SYSON_WEVT_CHIP_EN_MSK BIT(3) +#define BIT_SYSON_WEVT_OVER_CURRENT_MSK BIT(2) +#define BIT_SYSON_WEVT_GTIM_MSK BIT(1) +#define BIT_SYSON_WEVT_SYSTIM_MSK BIT(0) + +//2 REG_SYS_SLP_WAKE_EVENT_MSK1 + +//2 REG_SYS_SLP_WAKE_EVENT_STATUS0 +#define BIT_SYSON_WEVT_GPIO_DSTBY_STS BIT(29) +#define BIT_SYSON_WEVT_A33_STS BIT(28) +#define BIT_SYSON_WEVT_ADC_STS BIT(26) +#define BIT_SYSON_WEVT_I2C_STS BIT(24) +#define BIT_SYSON_WEVT_SPI_STS BIT(22) +#define BIT_SYSON_WEVT_UART_STS BIT(20) +#define BIT_SYSON_WEVT_USB_STS BIT(16) +#define BIT_SYSON_WEVT_SDIO_STS BIT(14) +#define BIT_SYSON_WEVT_NFC_STS BIT(9) +#define BIT_SYSON_WEVT_WLAN_STS BIT(8) +#define BIT_SYSON_WEVT_GPIO_STS BIT(4) +#define BIT_SYSON_WEVT_CHIP_EN_STS BIT(3) +#define BIT_SYSON_WEVT_OVER_CURRENT_STS BIT(2) +#define BIT_SYSON_WEVT_GTIM_STS BIT(1) +#define BIT_SYSON_WEVT_SYSTIM_STS BIT(0) + +//2 REG_SYS_SLP_WAKE_EVENT_STATUS1 + +//2 REG_SYS_SNF_WAKE_EVENT_MSK0 + +#define BIT_SHIFT_SYS_WKPERI_IMR0 1 +#define BIT_MASK_SYS_WKPERI_IMR0 0x7fffffffL +#define BIT_SYS_WKPERI_IMR0(x) (((x) & BIT_MASK_SYS_WKPERI_IMR0) << BIT_SHIFT_SYS_WKPERI_IMR0) + +#define BIT_SYSON_SNFEVT_ADC_MSK BIT(0) + +//2 REG_SYS_SNF_WAKE_EVENT_STATUS + +#define BIT_SHIFT_SYS_WKPERI_ISR0 1 +#define BIT_MASK_SYS_WKPERI_ISR0 0x7fffffffL +#define BIT_SYS_WKPERI_ISR0(x) (((x) & BIT_MASK_SYS_WKPERI_ISR0) << BIT_SHIFT_SYS_WKPERI_ISR0) + +#define BIT_SYSON_SNFEVT_ADC_STS BIT(0) + +//2 REG_SYS_PWRMGT_CTRL +#define BIT_SYSON_REGU_DSLP BIT(7) + +//2 REG_NOT_VALID +#define BIT_SYSON_PM_CMD_SLP BIT(2) +#define BIT_SYSON_PM_CMD_DSTBY BIT(1) +#define BIT_SYSON_PM_CMD_DSLP BIT(0) + +//2 REG_RSVD + +//2 REG_SYS_PWRMGT_OPTION +#define BIT_SYSON_PMOPT_NORM_SYSCLK_SEL BIT(30) +#define BIT_SYSON_PMOPT_NORM_SYSPLL_EN BIT(29) +#define BIT_SYSON_PMOPT_NORM_XTAL_EN BIT(28) +#define BIT_SYSON_PMOPT_NORM_EN_SOC BIT(27) +#define BIT_SYSON_PMOPT_NORM_EN_PWM BIT(26) +#define BIT_SYSON_PMOPT_NORM_EN_SWR BIT(25) +#define BIT_SYSON_PMOPT_NORM_LPLDO_SEL BIT(24) +#define BIT_SYSON_PMOPT_SNZ_SYSCLK_SEL BIT(22) +#define BIT_SYSON_PMOPT_SNZ_SYSPLL_EN BIT(21) +#define BIT_SYSON_PMOPT_SNZ_XTAL_EN BIT(20) +#define BIT_SYSON_PMOPT_SNZ_EN_SOC BIT(19) +#define BIT_SYSON_PMOPT_SNZ_EN_PWM BIT(18) +#define BIT_SYSON_PMOPT_SNZ_EN_SWR BIT(17) +#define BIT_SYSON_PMOPT_SNZ_LPLDO_SEL BIT(16) +#define BIT_SYSON_PMOPT_SLP_SYSCLK_SEL BIT(14) +#define BIT_SYSON_PMOPT_SLP_SYSPLL_EN BIT(13) +#define BIT_SYSON_PMOPT_SLP_XTAL_EN BIT(12) +#define BIT_SYSON_PMOPT_SLP_EN_SOC BIT(11) +#define BIT_SYSON_PMOPT_SLP_EN_PWM BIT(10) +#define BIT_SYSON_PMOPT_SLP_EN_SWR BIT(9) +#define BIT_SYSON_PMOPT_SLP_LPLDO_SEL BIT(8) +#define BIT_SYSON_PMOPT_DSTBY_SYSCLK_SEL BIT(6) +#define BIT_SYSON_PMOPT_DSTBY_SYSPLL_EN BIT(5) +#define BIT_SYSON_PMOPT_DSTBY_XTAL_EN BIT(4) +#define BIT_SYSON_PMOPT_DSTBY_EN_SOC BIT(3) +#define BIT_SYSON_PMOPT_DSTBY_EN_PWM BIT(2) +#define BIT_SYSON_PMOPT_DSTBY_EN_SWR BIT(1) +#define BIT_SYSON_PMOPT_DSTBY_LPLDO_SEL BIT(0) + +//2 REG_SYS_PWRMGT_OPTION_EXT +#define BIT_SYSON_PMOPT_SLP_ANACK_SEL BIT(2) +#define BIT_SYSON_PMOPT_SLP_ANACK_EN BIT(1) +#define BIT_SYSON_PMOPT_SLP_SWR_ADJ BIT(0) + +//2 REG_SYS_DSLP_WEVENT +#define BIT_SYSON_DSLP_GPIO BIT(2) +#define BIT_SYSON_DSLP_NFC BIT(1) +#define BIT_SYSON_DSLP_WTIMER33 BIT(0) + +//2 REG_SYS_PERI_MONITOR +#define BIT_SYSON_ISO33_NFC BIT(0) + +//2 REG_SYS_SYSTEM_CFG0 +#define BIT_SYSCFG_BD_PKG_SEL BIT(31) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +#define BIT_SHIFT_VENDOR_ID 8 +#define BIT_MASK_VENDOR_ID 0xf +#define BIT_VENDOR_ID(x) (((x) & BIT_MASK_VENDOR_ID) << BIT_SHIFT_VENDOR_ID) + + +#define BIT_SHIFT_CHIP_VER 4 +#define BIT_MASK_CHIP_VER 0xf +#define BIT_CHIP_VER(x) (((x) & BIT_MASK_CHIP_VER) << BIT_SHIFT_CHIP_VER) + + +#define BIT_SHIFT_RF_RL_ID 0 +#define BIT_MASK_RF_RL_ID 0xf +#define BIT_RF_RL_ID(x) (((x) & BIT_MASK_RF_RL_ID) << BIT_SHIFT_RF_RL_ID) + + +//2 REG_SYS_SYSTEM_CFG1 + +#define BIT_SHIFT_SYSCFG_TRP_ICFG 28 +#define BIT_MASK_SYSCFG_TRP_ICFG 0xf +#define BIT_SYSCFG_TRP_ICFG(x) (((x) & BIT_MASK_SYSCFG_TRP_ICFG) << BIT_SHIFT_SYSCFG_TRP_ICFG) + +#define BIT_SYSCFG_TRP_BOOT_SEL_ BIT(27) +#define BIT_SysCFG_TRP_SPSLDO_SEL BIT(26) +#define BIT_V15_VLD BIT(16) +#define BIT_SYS_SYSPLL_CLK_RDY BIT(9) +#define BIT_SYS_XCLK_VLD BIT(8) +#define BIT_SYSCFG_ALDN_STS BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + + +//================= Register Address Definition =====================// +#define REG_SYS_PWR_CTRL 0x0000 +#define REG_SYS_ISO_CTRL 0x0002 +#define REG_SYS_FUNC_EN 0x0008 +#define REG_SYS_CLK_CTRL0 0x0010 +#define REG_SYS_CLK_CTRL1 0x0014 +#define REG_SYS_EFUSE_SYSCFG0 0x0020 +#define REG_SYS_EFUSE_SYSCFG1 0x0024 +#define REG_SYS_EFUSE_SYSCFG2 0x0028 +#define REG_SYS_EFUSE_SYSCFG3 0x002C +#define REG_SYS_EFUSE_SYSCFG4 0x0030 +#define REG_SYS_EFUSE_SYSCFG5 0x0034 +#define REG_SYS_EFUSE_SYSCFG6 0x0038 +#define REG_SYS_EFUSE_SYSCFG7 0x003C +#define REG_SYS_REGU_CTRL0 0x0040 +#define REG_SYS_SWR_CTRL0 0x0048 +#define REG_SYS_SWR_CTRL1 0x004C +#define REG_SYS_XTAL_CTRL0 0x0060 +#define REG_SYS_XTAL_CTRL1 0x0064 +#define REG_SYS_SYSPLL_CTRL0 0x0070 +#define REG_SYS_SYSPLL_CTRL1 0x0074 +#define REG_SYS_SYSPLL_CTRL2 0x0078 +#define REG_SYS_ANA_TIM_CTRL 0x0090 +#define REG_SYS_DSLP_TIM_CTRL 0x0094 +#define REG_SYS_DSLP_TIM_CAL_CTRL 0x0098 +#define REG_SYS_DEBUG_CTRL 0x00A0 +#define REG_SYS_PINMUX_CTRL 0x00A4 +#define REG_SYS_GPIO_DSTBY_WAKE_CTRL0 0x00A8 +#define REG_SYS_GPIO_DSTBY_WAKE_CTRL1 0x00AC +#define REG_SYS_DEBUG_REG 0x00BC +#define REG_SYS_EEPROM_CTRL0 0x00E0 +#define REG_SYS_EEPROM_CTRL1 0x00E4 +#define REG_SYS_EFUSE_CTRL 0x00E8 +#define REG_SYS_EFUSE_TEST 0x00EC +#define REG_SYS_DSTBY_INFO0 0x00F0 +#define REG_SYS_DSTBY_INFO1 0x00F4 +#define REG_SYS_DSTBY_INFO2 0x00F8 +#define REG_SYS_DSTBY_INFO3 0x00FC +#define REG_SYS_SLP_WAKE_EVENT_MSK0 0x0100 +#define REG_SYS_SLP_WAKE_EVENT_MSK1 0x0104 +#define REG_SYS_SLP_WAKE_EVENT_STATUS0 0x0108 +#define REG_SYS_SLP_WAKE_EVENT_STATUS1 0x010C +#define REG_SYS_SNF_WAKE_EVENT_MSK0 0x0110 +#define REG_SYS_SNF_WAKE_EVENT_STATUS 0x0114 +#define REG_SYS_PWRMGT_CTRL 0x0118 +#define REG_SYS_PWRMGT_OPTION 0x0120 +#define REG_SYS_PWRMGT_OPTION_EXT 0x0124 +#define REG_SYS_DSLP_WEVENT 0x0130 +#define REG_SYS_PERI_MONITOR 0x0134 +#define REG_SYS_SYSTEM_CFG0 0x01F0 +#define REG_SYS_SYSTEM_CFG1 0x01F4 +#define REG_SYS_SYSTEM_CFG2 0x01F8 + +#endif diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_timer.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_timer.h new file mode 100644 index 0000000..bf0d3b0 --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_timer.h @@ -0,0 +1,75 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_TIMER_H_ +#define _RTL8195A_TIMER_H_ + + +#define TIMER_TICK_US 31 + +#define TIMER_LOAD_COUNT_OFF 0x00 +#define TIMER_CURRENT_VAL_OFF 0x04 +#define TIMER_CTL_REG_OFF 0x08 +#define TIMER_EOI_OFF 0x0c +#define TIMER_INT_STATUS_OFF 0x10 +#define TIMER_INTERVAL 0x14 +#define TIMERS_INT_STATUS_OFF 0xa0 +#define TIMERS_EOI_OFF 0xa4 +#define TIMERS_RAW_INT_STATUS_OFF 0xa8 +#define TIMERS_COMP_VER_OFF 0xac + +#define HAL_TIMER_READ32(addr) (*((volatile u32*)(TIMER_REG_BASE + addr)))//HAL_READ32(TIMER_REG_BASE, addr) +#define HAL_TIMER_WRITE32(addr, value) ((*((volatile u32*)(TIMER_REG_BASE + addr))) = value)//HAL_WRITE32(TIMER_REG_BASE, addr, value) +#define HAL_TIMER_READ16(addr) (*((volatile u16*)(TIMER_REG_BASE + addr)))//HAL_READ16(TIMER_REG_BASE, addr) +#define HAL_TIMER_WRITE16(addr, value) ((*((volatile u16*)(TIMER_REG_BASE + addr))) = value)//HAL_WRITE16(TIMER_REG_BASE, addr, value) +#define HAL_TIMER_READ8(addr) (*((volatile u8*)(TIMER_REG_BASE + addr)))//HAL_READ8(TIMER_REG_BASE, addr) +#define HAL_TIMER_WRITE8(addr, value) ((*((volatile u8*)(TIMER_REG_BASE + addr))) = value)//HAL_WRITE8(TIMER_REG_BASE, addr, value) + +u32 +HalGetTimerIdRtl8195a( + IN u32 *TimerID +); + +BOOL +HalTimerInitRtl8195a( + IN VOID *Data +); + +u32 +HalTimerReadCountRtl8195a( + IN u32 TimerId +); + +VOID +HalTimerIrqClearRtl8195a( + IN u32 TimerId +); + +VOID +HalTimerDisRtl8195a( + IN u32 TimerId +); + +VOID +HalTimerEnRtl8195a( + IN u32 TimerId +); + +VOID +HalTimerDumpRegRtl8195a( + IN u32 TimerId +); + + +u32 +HalTimerReadCountRamRtl8195a( + IN u32 TimerId +); + +#endif //_RTL8195A_TIMER_H_ diff --git a/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_uart.h b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_uart.h new file mode 100644 index 0000000..24f4aad --- /dev/null +++ b/sdk/src/targets/hal/target_rtk/target_8195a/rtl8195a/rtl8195a_uart.h @@ -0,0 +1,380 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_UART_H_ +#define _RTL8195A_UART_H_ + + +#define RUART_DLL_OFF 0x00 +#define RUART_DLM_OFF 0x04 //RW, DLAB = 1 +#define RUART_INTERRUPT_EN_REG_OFF 0x04 +#define RUART_IER_ERBI 0x01 //BIT0, Enable Received Data Available Interrupt (rx trigger) +#define RUART_IER_ETBEI (1<<1) //BIT1, Enable Transmitter FIFO Empty Interrupt (tx fifo empty) +#define RUART_IER_ELSI (1<<2) //BIT2, Enable Receiver Line Status Interrupt (receiver line status) +#define RUART_IER_EDSSI (1<<3) //BIT3, Enable Modem Status Interrupt (modem status transition) + +#define RUART_INT_ID_REG_OFF 0x08 //[R] +#define RUART_IIR_INT_PEND 0x01 +#define RUART_IIR_INT_ID (0x07<<1) //011(3), 010(2), 110(6), 001(1), 000(0) +#define RUART_FIFO_CTL_REG_OFF 0x08 //[W] +#define RUART_FIFO_CTL_REG_CLEAR_RXFIFO (1<<1) //BIT1, 0x02, Write 1 clear +#define RUART_FIFO_CTL_REG_DMA_ENABLE 0x08 //BIT3 + +#define FIFO_CTL_DEFAULT_WITH_FIFO_DMA 0xC9 +#define FIFO_CTL_DEFAULT_WITH_FIFO 0xC1 + +#define RUART_MODEM_CTL_REG_OFF 0x10 +#define RUART_MCR_RTS BIT1 +#define RUART_MCL_AUTOFLOW_ENABLE (1<<5) //BIT5, 0x20 + +#define RUART_LINE_CTL_REG_OFF 0x0C +#define RUART_LINE_CTL_REG_DLAB_ENABLE (1<<7) //BIT7, 0x80 + +#define RUART_LINE_STATUS_REG_OFF 0x14 +#define RUART_LINE_STATUS_REG_DR 0x01 //BIT0, Data Ready indicator +#define RUART_LINE_STATUS_ERR_OVERRUN (1<<1) //BIT1, Over Run +#define RUART_LINE_STATUS_ERR_PARITY (1<<2) //BIT2, Parity error +#define RUART_LINE_STATUS_ERR_FRAMING (1<<3) //BIT3, Framing error +#define RUART_LINE_STATUS_ERR_BREAK (1<<4) //BIT4, Break interrupt error +#define RUART_LINE_STATUS_REG_THRE (1<<5) //BIT5, 0x20, Transmit Holding Register Empty Interrupt enable +#define RUART_LINE_STATUS_REG_TEMT (1<<6) //BIT6, 0x40, Transmitter Empty indicator(bit) +#define RUART_LINE_STATUS_ERR_RXFIFO (1<<7) //BIT7, RX FIFO error +#define RUART_LINE_STATUS_ERR (RUART_LINE_STATUS_ERR_OVERRUN|RUART_LINE_STATUS_ERR_PARITY| \ + RUART_LINE_STATUS_ERR_FRAMING|RUART_LINE_STATUS_ERR_BREAK| \ + RUART_LINE_STATUS_ERR_RXFIFO) //Line status error + +#define RUART_MODEM_STATUS_REG_OFF 0x18 //Modem Status Register +#define RUART_SCRATCH_PAD_REG_OFF 0x1C //Scratch Pad Register +#define RUART_SP_REG_RXBREAK_INT_STATUS (1<<7) //BIT7, 0x80, Write 1 clear +#define RUART_SP_REG_DBG_SEL 0x0F<<8 //[11:8], Debug port selection +#define RUART_SP_REG_XFACTOR_ADJ 0x7FF<<16 //[26:16] + +#define RUART_STS_REG_OFF 0x20 +#define RUART_STS_REG_RESET_RCV (1<<3) //BIT3, 0x08, Reset Uart Receiver +#define RUART_STS_REG_XFACTOR 0xF<<4 + +#define RUART_REV_BUF_REG_OFF 0x24 //Receiver Buffer Register +#define RUART_TRAN_HOLD_REG_OFF 0x24 //Transmitter Holding Register + +#define RUART_MISC_CTL_REG_OFF 0x28 +#define RUART_TXDMA_BURSTSIZE_MASK 0xF8 //7:3 +#define RUART_RXDMA_BURSTSIZE_MASK 0x1F00 //12:8 + +#define RUART_DEBUG_REG_OFF 0x3C + +// RUART_LINE_CTL_REG_OFF (0x0C) +#define BIT_SHIFT_LCR_WLS 0 // word length select: 0: 7 bits, 1: 8bits +#define BIT_MASK_LCR_WLS_8BITS 0x1 +#define BIT_LCR_WLS(x)(((x) & BIT_MASK_LCR_WLS_8BITS) << BIT_SHIFT_LCR_WLS) +#define BIT_CLR_LCR_WLS (~(BIT_MASK_LCR_WLS_8BITS << BIT_SHIFT_LCR_WLS)) + +#define BIT_SHIFT_LCR_STB 2 // Stop bit select: 0: no stop bit, 1: 1 stop bit +#define BIT_MASK_LCR_STB_EN 0x1 +#define BIT_LCR_STB_EN(x)(((x) & BIT_MASK_LCR_STB_EN) << BIT_SHIFT_LCR_STB) +#define BIT_INVC_LCR_STB_EN (~(BIT_MASK_LCR_STB_EN << BIT_SHIFT_LCR_STB)) + +#define BIT_SHIFT_LCR_PARITY_EN 3 +#define BIT_MASK_LCR_PARITY_EN 0x1 +#define BIT_LCR_PARITY_EN(x)(((x) & BIT_MASK_LCR_PARITY_EN) << BIT_SHIFT_LCR_PARITY_EN) +#define BIT_INVC_LCR_PARITY_EN (~(BIT_MASK_LCR_PARITY_EN << BIT_SHIFT_LCR_PARITY_EN)) + +#define BIT_SHIFT_LCR_PARITY_TYPE 4 +#define BIT_MASK_LCR_PARITY_TYPE 0x1 +#define BIT_LCR_PARITY_TYPE(x)(((x) & BIT_MASK_LCR_PARITY_TYPE) << BIT_SHIFT_LCR_PARITY_TYPE) +#define BIT_INVC_LCR_PARITY_TYPE (~(BIT_MASK_LCR_PARITY_TYPE << BIT_SHIFT_LCR_PARITY_TYPE)) + +#define BIT_SHIFT_LCR_STICK_PARITY_EN 5 +#define BIT_MASK_LCR_STICK_PARITY_EN 0x1 +#define BIT_LCR_STICK_PARITY_EN(x)(((x) & BIT_MASK_LCR_STICK_PARITY_EN) << BIT_SHIFT_LCR_STICK_PARITY_EN) +#define BIT_INVC_LCR_STICK_PARITY_EN (~(BIT_MASK_LCR_STICK_PARITY_EN << BIT_SHIFT_LCR_STICK_PARITY_EN)) + +#define BIT_SHIFT_LCR_BREAK_CTRL 6 +#define BIT_MASK_LCR_BREAK_CTRL 0x1 +#define BIT_UART_LCR_BREAK_CTRL ((BIT_MASK_LCR_BREAK_CTRL) << BIT_SHIFT_LCR_BREAK_CTRL) + +#define RUART_BAUD_RATE_2400 2400 +#define RUART_BAUD_RATE_4800 4800 +#define RUART_BAUD_RATE_9600 9600 +#define RUART_BAUD_RATE_19200 19200 +#define RUART_BAUD_RATE_38400 38400 +#define RUART_BAUD_RATE_57600 57600 +#define RUART_BAUD_RATE_115200 115200 +#define RUART_BAUD_RATE_921600 921600 +#define RUART_BAUD_RATE_1152000 1152000 + +#define HAL_RUART_READ32(UartIndex, addr) \ + HAL_READ32(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr) +#define HAL_RUART_WRITE32(UartIndex, addr, value) \ + HAL_WRITE32(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr, value) +#define HAL_RUART_READ16(UartIndex, addr) \ + HAL_READ16(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr) +#define HAL_RUART_WRITE16(UartIndex, addr, value) \ + HAL_WRITE16(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr, value) +#define HAL_RUART_READ8(UartIndex, addr) \ + HAL_READ8(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr) +#define HAL_RUART_WRITE8(UartIndex, addr, value) \ + HAL_WRITE8(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr, value) + +typedef struct _RUART_SPEED_SETTING_ { + u32 BaudRate; + u32 Ovsr; + u32 Div; + u32 Ovsr_adj; +}RUART_SPEED_SETTING, *PRUART_SPEED_SETTING; + +typedef enum _UART_RXFIFO_TRIGGER_LEVEL_ { + OneByte = 0x00, + FourBytes = 0x01, + EightBytes = 0x10, + FourteenBytes = 0x11 +}UART_RXFIFO_TRIGGER_LEVEL, *PUART_RXFIFO_TRIGGER_LEVEL; + +typedef enum _RUART0_PINMUX_SELECT_ { + RUART0_MUX_TO_GPIOC = S0, + RUART0_MUX_TO_GPIOE = S1, + RUART0_MUX_TO_GPIOA = S2 +}RUART0_PINMUX_SELECT, *PRUART0_PINMUX_SELECT; + +typedef enum _RUART1_PINMUX_SELECT_ { + RUART1_MUX_TO_GPIOD = S0, + RUART1_MUX_TO_GPIOE = S1, + RUART1_MUX_TO_GPIOB = S2 +}RUART1_PINMUX_SELECT, *PRUART1_PINMUX_SELECT; + +typedef enum _RUART2_PINMUX_SELECT_ { + RUART2_MUX_TO_GPIOA = S0, + RUART2_MUX_TO_GPIOC = S1, + RUART2_MUX_TO_GPIOD = S2 +}RUART2_PINMUX_SELECT, *PRUART2_PINMUX_SELECT; + +typedef enum _RUART_FLOW_CONTROL_ { + AUTOFLOW_DISABLE = 0, + AUTOFLOW_ENABLE = 1 +}RUART_FLOW_CONTROL, *PRUART_FLOW_CONTROL; + +typedef enum _RUART_WORD_LEN_SEL_ { + RUART_WLS_7BITS = 0, + RUART_WLS_8BITS = 1 +}RUART_WORD_LEN_SEL, *PRUART_WORD_LEN_SEL; + +typedef enum _RUART_STOP_BITS_ { + RUART_NO_STOP_BIT = 0, + RUART_1_STOP_BIT = 1 +}RUART_STOP_BITS, *PRUART_STOP_BITS; + +typedef enum _RUART_PARITY_CONTROL_ { + RUART_PARITY_DISABLE = 0, + RUART_PARITY_ENABLE = 1 +}RUART_PARITY_CONTROL, *PRUART_PARITY_CONTROL; + +typedef enum _RUART_PARITY_TYPE_ { + RUART_ODD_PARITY = 0, + RUART_EVEN_PARITY = 1 +}RUART_PARITY_TYPE, *PRUART_PARITY_TYPE; + +typedef enum _RUART_STICK_PARITY_CONTROL_ { + RUART_STICK_PARITY_DISABLE = 0, + RUART_STICK_PARITY_ENABLE = 1 +}RUART_STICK_PARITY_CONTROL, *PRUART_STICK_PARITY_CONTROL; + +typedef enum _UART_INT_ID_ { + ModemStatus = 0, + TxFifoEmpty = 1, + ReceiverDataAvailable = 2, + ReceivLineStatus = 3, + TimeoutIndication = 6 +}UART_INT_ID, *PUART_INT_ID; + +typedef enum _HAL_UART_State_ +{ + HAL_UART_STATE_NULL = 0x00, // UART hardware not been initial yet + HAL_UART_STATE_READY = 0x10, // UART is initialed, ready to use + HAL_UART_STATE_BUSY = 0x20, // UART hardware is busy on configuration + HAL_UART_STATE_BUSY_TX = 0x21, // UART is buzy on TX + HAL_UART_STATE_BUSY_RX = 0x22, // UART is busy on RX + HAL_UART_STATE_BUSY_TX_RX = 0x23, // UART is busy on TX an RX + HAL_UART_STATE_TIMEOUT = 0x30, // Transfer timeout + HAL_UART_STATE_ERROR = 0x40 // UART Error +}HAL_UART_State, *PHAL_UART_State; + +typedef enum _HAL_UART_Status_ +{ + HAL_UART_STATUS_OK = 0x00, // Transfer OK + HAL_UART_STATUS_TIMEOUT = 0x01, // Transfer Timeout + HAL_UART_STATUS_ERR_OVERRUN = 0x02, // RX Over run + HAL_UART_STATUS_ERR_PARITY = 0x04, // Parity error + HAL_UART_STATUS_ERR_FRAM = 0x08, // Framing Error + HAL_UART_STATUS_ERR_BREAK = 0x10, // Break Interrupt + HAL_UART_STATUS_ERR_PARA = 0x20, // Parameter error + HAL_UART_STATUS_ERR_RXFIFO = 0x80, // RX FIFO error +}HAL_UART_Status, *PHAL_UART_Status; + +u32 +HalRuartGetDebugValueRtl8195a( + IN VOID* Data, + IN u32 DbgSel + ); + +#if 0 +u32 +FindElementIndex( + u32 Element, + u32* Array + ); +#endif + +VOID +RuartResetRxFifoRtl8195a( + IN u8 UartIndex + ); +#if 0 +VOID +RuartBusDomainEnableRtl8195a( + IN u8 UartIndex + ); +#endif + +HAL_Status +HalRuartResetRxFifoRtl8195a( + IN VOID *Data + ); + +HAL_Status +HalRuartInitRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartDeInitRtl8195a( + IN VOID *Data ///< RUART Adapter + ); + +HAL_Status +HalRuartPutCRtl8195a( + IN VOID *Data, + IN u8 TxData + ); + +u32 +HalRuartSendRtl8195a( + IN VOID *Data, + IN u8 *pTxData, + IN u32 Length, + IN u32 Timeout + ); + +HAL_Status +HalRuartIntSendRtl8195a( + IN VOID *Data, // PHAL_RUART_ADAPTER + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send + ); + +HAL_Status +HalRuartDmaSendRtl8195a( + IN VOID *Data, // PHAL_RUART_ADAPTER + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send +); + +HAL_Status +HalRuartStopSendRtl8195a( + IN VOID *Data // PHAL_RUART_ADAPTER +); + +HAL_Status +HalRuartGetCRtl8195a( + IN VOID *Data, + OUT u8 *pRxByte + ); + +u32 +HalRuartRecvRtl8195a( + IN VOID *Data, + IN u8 *pRxData, + IN u32 Length, + IN u32 Timeout + ); + +HAL_Status +HalRuartIntRecvRtl8195a( + IN VOID *Data, ///< RUART Adapter + IN u8 *pRxData, ///< Rx buffer + IN u32 Length // buffer length + ); + +HAL_Status +HalRuartDmaRecvRtl8195a( + IN VOID *Data, ///< RUART Adapter + IN u8 *pRxData, ///< Rx buffer + IN u32 Length // buffer length + ); + +HAL_Status +HalRuartStopRecvRtl8195a( + IN VOID *Data // PHAL_RUART_ADAPTER +); + +u8 +HalRuartGetIMRRtl8195a( + IN VOID *Data + ); + +_LONG_CALL_ VOID +HalRuartSetIMRRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartDmaInitRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartRTSCtrlRtl8195a( + IN VOID *Data, + IN BOOLEAN RtsCtrl + ); + +VOID +HalRuartRegIrqRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartIntEnableRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartIntDisableRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartAdapterLoadDefRtl8195a( + IN VOID *pAdp, + IN u8 UartIdx +); + +VOID +HalRuartTxGdmaLoadDefRtl8195a( + IN VOID *pAdp, + IN VOID *pCfg +); + +VOID +HalRuartRxGdmaLoadDefRtl8195a( + IN VOID *pAdp, + IN VOID *pCfg +); + +#endif + diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..2efd8ea --- /dev/null +++ b/src/main.c @@ -0,0 +1,12 @@ +#include "rtl8195a.h" + +int main(void) +{ + int i=0; + + while (1) { + DiagPrintf("Hello World : %d %d\r\n", i++); + HalDelayUs(1000000); + } +} +