From d4d57ed7feec9e6c0bc797d66be7a5b303e79831 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Fri, 17 Jan 2020 10:41:41 -0800 Subject: [PATCH] bring over scripts --- scripts/__init__.py | 0 scripts/clwaste | Bin 0 -> 155368 bytes scripts/dump_pll.c | 59 ++++++++++++++++++++++++++++ scripts/get_fan_control_type.py | 41 ++++++++++++++++++++ scripts/internet.sh | 1 + scripts/panda_gcc/.gitignore | 3 ++ scripts/panda_gcc/build_gcc.sh | 66 ++++++++++++++++++++++++++++++++ scripts/phone_nat.sh | 17 ++++++++ scripts/stop_updater.sh | 7 ++++ scripts/throttling.sh | 16 ++++++++ scripts/update_now.sh | 4 ++ scripts/waste | Bin 0 -> 8568 bytes scripts/waste.c | 52 +++++++++++++++++++++++++ scripts/waste.py | 35 +++++++++++++++++ 14 files changed, 301 insertions(+) create mode 100644 scripts/__init__.py create mode 100755 scripts/clwaste create mode 100644 scripts/dump_pll.c create mode 100755 scripts/get_fan_control_type.py create mode 100755 scripts/internet.sh create mode 100644 scripts/panda_gcc/.gitignore create mode 100755 scripts/panda_gcc/build_gcc.sh create mode 100755 scripts/phone_nat.sh create mode 100755 scripts/stop_updater.sh create mode 100755 scripts/throttling.sh create mode 100755 scripts/update_now.sh create mode 100755 scripts/waste create mode 100644 scripts/waste.c create mode 100755 scripts/waste.py diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/scripts/clwaste b/scripts/clwaste new file mode 100755 index 0000000000000000000000000000000000000000..51770f0e372cbd3bc08867bc329c756aca237973 GIT binary patch literal 155368 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

$AF0$A8gSe_=53Y^hl1-J8YG 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 WDe4c+|Ls&p{rhLqU;kCQ_5OdRM!_cl literal 0 HcmV?d00001 diff --git a/scripts/dump_pll.c b/scripts/dump_pll.c new file mode 100644 index 000000000..325ee2b4c --- /dev/null +++ b/scripts/dump_pll.c @@ -0,0 +1,59 @@ +#include +#include +#include + +void hexdump(uint32_t *d, int l) { + for (int i = 0; i < l; i++) { + if (i%0x10 == 0 && i != 0) printf("\n"); + printf("%8x ", d[i]); + } + printf("\n"); +} + +/* Power cluster primary PLL */ +#define C0_PLL_MODE 0x0 +#define C0_PLL_L_VAL 0x4 +#define C0_PLL_ALPHA 0x8 +#define C0_PLL_USER_CTL 0x10 +#define C0_PLL_CONFIG_CTL 0x18 +#define C0_PLL_CONFIG_CTL_HI 0x1C +#define C0_PLL_STATUS 0x28 +#define C0_PLL_TEST_CTL_LO 0x20 +#define C0_PLL_TEST_CTL_HI 0x24 + +/* Power cluster alt PLL */ +#define C0_PLLA_MODE 0x100 +#define C0_PLLA_L_VAL 0x104 +#define C0_PLLA_ALPHA 0x108 +#define C0_PLLA_USER_CTL 0x110 +#define C0_PLLA_CONFIG_CTL 0x118 +#define C0_PLLA_STATUS 0x128 +#define C0_PLLA_TEST_CTL_LO 0x120 + +#define APC_DIAG_OFFSET 0x48 +#define CLK_CTL_OFFSET 0x44 +#define MUX_OFFSET 0x40 +#define MDD_DROOP_CODE 0x7c +#define SSSCTL_OFFSET 0x160 +#define PSCTL_OFFSET 0x164 + +int main() { + int fd = open("/dev/mem", O_RDWR); + volatile uint32_t *mb = (uint32_t*)mmap(0,0x1000,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0x06400000); + volatile uint32_t *mc = (uint32_t*)mmap(0,0x1000,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0x06480000); + volatile uint32_t *md = (uint32_t*)mmap(0,0x1000,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0x09A20000); + while (1) { + printf("PLL MODE:%x L_VAL:%x ALPHA:%x USER_CTL:%x CONFIG_CTL:%x CONFIG_CTL_HI:%x STATUS:%x TEST_CTL_LO:%x TEST_CTL_HI:%x\n", + mb[C0_PLL_MODE/4], mb[C0_PLL_L_VAL/4], mb[C0_PLL_ALPHA/4], + mb[C0_PLL_USER_CTL/4], mb[C0_PLL_CONFIG_CTL/4], mb[C0_PLL_CONFIG_CTL_HI/4], + mb[C0_PLL_STATUS/4], mb[C0_PLL_TEST_CTL_LO/4], mb[C0_PLL_TEST_CTL_HI/4]); + printf(" MUX_OFFSET:%x CLK_CTL_OFFSET:%x APC_DIAG_OFFSET:%x MDD_DROOP_CODE:%x\n", + mb[MUX_OFFSET/4], mb[CLK_CTL_OFFSET/4], mb[APC_DIAG_OFFSET/4], mb[MDD_DROOP_CODE/4]); + printf(" PLLA MODE:%x L_VAL:%x ALPHA:%x USER_CTL:%x CONFIG_CTL:%x STATUS:%x TEST_CTL_LO:%x SSSCTL_OFFSET:%x PSCTL_OFFSET:%x\n", + mb[C0_PLLA_MODE/4], mb[C0_PLLA_L_VAL/4], mb[C0_PLLA_ALPHA/4], mb[C0_PLLA_USER_CTL/4], + mb[C0_PLLA_CONFIG_CTL/4], mb[C0_PLLA_STATUS/4], mb[C0_PLLA_TEST_CTL_LO/4], + mb[SSSCTL_OFFSET/4], mb[PSCTL_OFFSET/4]); + usleep(1000*100); + } +} + diff --git a/scripts/get_fan_control_type.py b/scripts/get_fan_control_type.py new file mode 100755 index 000000000..cc1b99296 --- /dev/null +++ b/scripts/get_fan_control_type.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3.7 +import os +from smbus2 import SMBus + +def setup_fan(): + os.system("echo 2 > /sys/module/dwc3_msm/parameters/otg_switch") + + bus = SMBus(7, force=True) + try: + bus.write_byte_data(0x21, 0x10, 0xf) # mask all interrupts + bus.write_byte_data(0x21, 0x03, 0x1) # set drive current and global interrupt disable + bus.write_byte_data(0x21, 0x02, 0x2) # needed? + bus.write_byte_data(0x21, 0x04, 0x4) # manual override source + print("OP detected") + return False + except IOError: + print("LEON detected") + return True + bus.close() + +def get_fan_type(): + if not setup_fan(): + return + + bus = SMBus(7, force=True) + try: + # alternate type + bus.write_i2c_block_data(0x3d, 0, [0x1]) + print("Alternate type detected") + return + except IOError: + # tusb320 type + print("tusb320 type detected") + bus.close() + + +def main(gctx=None): + get_fan_type() + +if __name__ == "__main__": + main() diff --git a/scripts/internet.sh b/scripts/internet.sh new file mode 100755 index 000000000..c89dff604 --- /dev/null +++ b/scripts/internet.sh @@ -0,0 +1 @@ +route add default gw 192.168.5.1 && ndc network create 100 && ndc network interface add 100 eth0 && ndc resolver setnetdns 100 localdomain 8.8.8.8 8.8.4.4 && ndc network default set 100 diff --git a/scripts/panda_gcc/.gitignore b/scripts/panda_gcc/.gitignore new file mode 100644 index 000000000..d1fca437f --- /dev/null +++ b/scripts/panda_gcc/.gitignore @@ -0,0 +1,3 @@ +build +out +src diff --git a/scripts/panda_gcc/build_gcc.sh b/scripts/panda_gcc/build_gcc.sh new file mode 100755 index 000000000..f03f451ab --- /dev/null +++ b/scripts/panda_gcc/build_gcc.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# https://blog.tan-ce.com/gcc-bare-metal/ +# https://imvoid.wordpress.com/2013/05/01/building-the-gnu-arm-toolchain-for-bare-metal/ +set -e + +BINUTILS=binutils-2.32 +GCC=gcc-4.7.1 + +mkdir -p src +pushd src +if [ ! -d $BINUTILS ]; then + wget ftp://ftp.gnu.org/gnu/binutils/$BINUTILS.tar.bz2 + tar -xf $BINUTILS.tar.bz2 +fi +popd + +# TODO: replace with /usr +mkdir -p out +PREFIX=$PWD/out + +mkdir -p build/$BINUTILS +pushd build/$BINUTILS +../../src/$BINUTILS/configure --target=arm-none-eabi \ + --build=aarch64-unknown-linux-gnu \ + --prefix=$PREFIX --with-cpu=cortex-m4 \ + --with-mode=thumb \ + --disable-nls \ + --disable-werror +make -j4 all +make install +popd + +mkdir -p src +pushd src +if [ ! -d $GCC ]; then + wget ftp://ftp.gnu.org/gnu/gcc/$GCC/$GCC.tar.bz2 + tar -xf $GCC.tar.bz2 + + cd $GCC + contrib/download_prerequisites +fi + +popd + +export PATH="$PREFIX/bin:$PATH" + +mkdir -p build/$GCC +pushd build/$GCC +../../src/$GCC/configure --target=arm-none-eabi \ + --build=aarch64-unknown-linux-gnu \ + --disable-libssp --disable-gomp --disable-libstcxx-pch --enable-threads \ + --disable-shared --disable-libmudflap \ + --prefix=$PREFIX --with-cpu=cortex-m4 \ + --with-mode=thumb --disable-multilib \ + --enable-interwork \ + --enable-languages="c" \ + --disable-nls \ + --disable-libgcc +make -j4 all-gcc +make install-gcc +popd + +# replace stdint.h with stdint-gcc.h for Android compatibility +mv $PREFIX/lib/gcc/arm-none-eabi/4.7.1/include/stdint-gcc.h $PREFIX/lib/gcc/arm-none-eabi/4.7.1/include/stdint.h + + diff --git a/scripts/phone_nat.sh b/scripts/phone_nat.sh new file mode 100755 index 000000000..2a6e432c9 --- /dev/null +++ b/scripts/phone_nat.sh @@ -0,0 +1,17 @@ +#!/bin/sh +echo 1 > /proc/sys/net/ipv4/ip_forward +#iptables -t nat --delete-chain +iptables --flush +iptables -t nat --flush + +# could be either one +iptables -t nat -A POSTROUTING -o v4-rmnet_data0 -j MASQUERADE +iptables -t nat -A POSTROUTING -o rmnet_data0 -j MASQUERADE + +#iptables --delete-chain +#iptables -A INPUT -i eth0 -j ACCEPT +#iptables -A INPUT -i v4-rmnet_data0 -m state --state RELATED,ESTABLISHED -j ACCEPT +#iptables -A OUTPUT -j ACCEPT +#iptables -A FORWARD -i rmnet_data0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT +#iptables -A FORWARD -i eth0 -o v4-rmnet_data0 -j ACCEPT + diff --git a/scripts/stop_updater.sh b/scripts/stop_updater.sh new file mode 100755 index 000000000..4243d30e9 --- /dev/null +++ b/scripts/stop_updater.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env sh + +# Stop updater +pkill -2 -f selfdrive.updated + +# Remove pending update +rm -f /data/safe_staging/finalized/.overlay_consistent diff --git a/scripts/throttling.sh b/scripts/throttling.sh new file mode 100755 index 000000000..d100c5f5a --- /dev/null +++ b/scripts/throttling.sh @@ -0,0 +1,16 @@ +#!/data/data/com.termux/files/usr/bin/bash +watch -n1 ' + cat /sys/kernel/debug/clk/pwrcl_clk/measure + cat /sys/kernel/debug/clk/perfcl_clk/measure + cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq + cat /sys/class/kgsl/kgsl-3d0/gpuclk + echo + echo -n "CPU0 " ; cat /sys/devices/virtual/thermal/thermal_zone5/temp + echo -n "CPU1 " ; cat /sys/devices/virtual/thermal/thermal_zone7/temp + echo -n "CPU2 " ; cat /sys/devices/virtual/thermal/thermal_zone10/temp + echo -n "CPU3 " ; cat /sys/devices/virtual/thermal/thermal_zone12/temp + echo -n "MEM " ; cat /sys/devices/virtual/thermal/thermal_zone2/temp + echo -n "GPU " ; cat /sys/devices/virtual/thermal/thermal_zone16/temp + echo -n "BAT " ; cat /sys/devices/virtual/thermal/thermal_zone29/temp +' + diff --git a/scripts/update_now.sh b/scripts/update_now.sh new file mode 100755 index 000000000..3f0193f08 --- /dev/null +++ b/scripts/update_now.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +# Send SIGHUP to updater +pkill -1 -f selfdrive.updated diff --git a/scripts/waste b/scripts/waste new file mode 100755 index 0000000000000000000000000000000000000000..506ce9c758265ec344ac922726c9bfc037e43c5e GIT binary patch literal 8568 zcmeHMeQXrh5g*_3VK5(dpnk=T zumnhKhK1SfjW)qnyNs}Dp~Z|VNJ$So47liL7#1oX5}nCy`N)|$HYyZKZJzYV*Wi4c z4=&H8Z*c#m~9yXk3cqaxIb1@b#TFe4m#tNlSQ zb`v^Lk8C_>d@@dnXI17%#x&wpp=hEi7EK&5()G2}CynEId`PY-5lJVb5uk68u5Jh+ z`P8MZ##dYGtNGOW^m*ptGaH{0eCFbluTU&VmSRcsg~r2E18erUXlxP(3;cvH1w9zc z^N|!-1fb>`pET0q6svX3HKNgEn}Ga{`~|Tf%dJ{*N~oXH4xGCt7+!MV&VB7=2kx9| z!w#I*fRtZ4aM^>XZNz~)=l>fH+_{D>I&fNF?sDtsYl9fu;j-Vhj+d@{azOQzkCv;- zALOyx-o&22OtX?B!R_!N8nKeZ}ZXpm8oPo(Tgtltn`~m12Lz%nKX0 z&4kjJBjTkEQHwXDY>19Eyj3IKPS(@ zKqj5jze<7+%fkpfjKKe01hQPju?O*zXS%7i8K4oB4N2Zn z!94zdv&v&kCC`xKn6!VE+a*6)#=Nvk&M}OeIF-Bivq_@&n3vom$byn{EafCda)hI# zghg_Lr8aAw4Y+C%$$feypWwzTOmSbeisUd7haK#Q;J4Tx$!Yenp5!vp{|d%M?jKou zd=l^b%wJ@C_`R(0OFQn%7Jr`G$C+oAt^e*<+fi%!aBe-98(7yOYW8 zn2|{yOot6`I2o@plgSw7`FO0f^=p0AftrvWs`ne=KyAIhx+Yi`i1>mvVV@BU`Sehz zu09xO@U8u~Y{z1U;%Y#zudfb9>KlxJ5v;DRHmW1F4UsUi!RneoeIQ&H)&q6*I+~sw zU3>fPr|hw04kgy&dBr_OpIT|^-I=P+miCsWT`gMB=c~d~h#p(}z)7Is8D#Qa!y&C8 zDE9yk7!>@Ib(xFLm|UN^_)L&>nTyW?S--jXY>;`Kix-2ehg^IP$hynL=Yp)yT)YHi zzUJbE&dKwkR~E2CL4gGz^V9)jbQXfl*Ic|5WIpHOWgzoE7k>m~Kgz|YpWCTj0okRd zq-npH0k^YLh+V6&$n@{KhVc~dv!WMZ+~>mScw6L{C#P9qH_LzCCBKhx_xy=6zSG3~q;nU;)Z3~|s&lfFxG1SP0Yw-Z5EINIj{19;u-m_fi{jiPY zUq+hGe>?uu=audMeCTt{H{1W|{tUA}d*mMw_xtL<>~{e)^7)^|!H(xb*x|x$e@bDW z3n#sN1R72g4{1%Dv+H@mz`6H=Zo8qEqorxy!smQRDMc0 z#%CkPNAk9x6|nOr;`!omset^uh?hC`PZ`%=*^WCt5%ekF_Z=@_zXbP}eB&)IfJ0U2 zU^Es9CCw@`o~jC`%}^S1i1nfU0e!#jO~UGk*9VEn0nL)r5(ncUBW(ekfj}Z@8XD&v zS~OxLOdE>mrf%1aM8vKnbi93}K8)^Y!W$;z)%5bytA<{+^s0l^z1XXkG4-^m#W87t z!#ZAzlSVIUO!FB#SRV*rYEgq8Ynz|$XnJbvCeT{jw>LMnYumSM+11jebu~4&w`gd= zzW8ixv~DkR?>hyw?n0T-_%c=N!9m81w01bHr&1UMP217gvbAGtm)6wT+4QugAri`D zY`3u<$s}0^8FUc^lF5T6GFwn9pAt&gH?({y%N|&R2fossb_*+R8dkvVyIsMwJnq?^ zI4*WsIOmRd(!kVZGDG0a9EqEH2&tL2X^+(K2H8lbz)MrYE2*eGCA{5yL8wST{& zzQuorA&wP_rRYn(E_5FYO8=rSejR50W|ot@Ug#BvKJD*r{bvv(zc@Xc%>U&aVCPY6 z1c}^32>q5zUw%&$dQt|)CS=}-#TQs##N<37)Xuv_ddh!6zJnF=h2{noId{nKr{bsG zI;AghID-uf@DY7EpS1Ds#1GORLfwT9eL2VM`GopEM_rlQSe-oY$nVsp92ogN; +#include +#include +#include "../selfdrive/common/timing.h" + +#define CORES 4 +double ttime[CORES]; +double oout[CORES]; + +void waste(int pid) { + cpu_set_t my_set; + CPU_ZERO(&my_set); + CPU_SET(pid, &my_set); + int ret = sched_setaffinity(0, sizeof(cpu_set_t), &my_set); + printf("set affinity to %d: %d\n", pid, ret); + + float32x4_t *tmp = (float32x4_t *)malloc(0x1000008*sizeof(float32x4_t)); + float32x4_t out; + + uint64_t i = 0; + double sec = seconds_since_boot(); + while(1) { + int j; + for (j = 0; j < 0x1000000; j++) { + out = vmlaq_f32(out, tmp[j], tmp[j+1]); + } + if (i == 0x8) { + double nsec = seconds_since_boot(); + ttime[pid] = nsec-sec; + oout[pid] = out[0] + out[1] + out[2] + out[3]; + i = 0; + sec = nsec; + } + i++; + } +} + +int main() { + pthread_t waster[CORES]; + for (int i = 0 ; i < CORES; i++) { + pthread_create(&waster[i], NULL, waste, (void*)i); + } + while (1) { + for (int i = 0 ; i < CORES; i++) { + printf("%.2f ", ttime[i]); + } + printf("\n"); + sleep(1); + } +} + diff --git a/scripts/waste.py b/scripts/waste.py new file mode 100755 index 000000000..55aeba066 --- /dev/null +++ b/scripts/waste.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +from multiprocessing import Process +from setproctitle import setproctitle +import os +import numpy as np +from common.realtime import sec_since_boot + +def waste(pid): + # set affinity + os.system("taskset -p %d %d" % (1 << pid, os.getpid())) + + m1 = np.zeros((200,200)) + 0.8 + m2 = np.zeros((200,200)) + 1.2 + + i = 1 + st = sec_since_boot() + j = 0 + while 1: + if (i % 100) == 0: + setproctitle("%3d: %8d" % (pid, i)) + lt = sec_since_boot() + print("%3d: %8d %f %.2f" % (pid, i, lt-st, j)) + st = lt + i += 1 + j = np.sum(np.matmul(m1, m2)) + +def main(gctx=None): + print("1-2 seconds is baseline") + for i in range(4): + p = Process(target=waste, args=(i,)) + p.start() + +if __name__ == "__main__": + main() +