gsc: gsc_direct_mem.sh

File gsc_direct_mem.sh, 1.6 KB (added by Bobby Jones, 3 years ago)

Bash script to utilize the direct memory read API for GSCv3

Line 
1#!/bin/bash
2
3[ "$#" -ne 2 ] && {
4 echo "This script acts as a wrapper around I2C commands in order to do direct memory reads of the GSC."
5 echo "It will output the i2c response in an i2cdump type format."
6 echo
7 echo "Usage: $0 <offset> <length>"
8 echo
9 echo "Example usage to read all 2000(0x7d0) peripheral register values:"
10 echo " $0 0x100 0x7d0"
11 exit 1
12}
13
14# Store inputs
15BUS=0
16ADDR=0x5e
17OFFSET=$1
18LENGTH=$2
19
20# Misc variables
21COUNT=0
22PAGE=0
23PRINTVAL=0x0000
24REMAINDER=0
25HIGH=
26RETURN=
27
28# Calculate initial page number based on passed in offset
29PAGE=$((OFFSET / 0x100))
30OFFSET=$((OFFSET % 0x100))
31
32echo " 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef"
33while [[ $COUNT -ne $LENGTH ]]; do
34 # Set the page number accordingly
35 i2cset -f -y 0 0x20 0x16 $PAGE
36
37 # Do either a full i2cdump or specify a range if bytes aren't a 0x100 aligned block
38 if [[ $(($LENGTH - $COUNT)) -lt 0x100 || $OFFSET -ne 0 ]]; then
39 HIGH=$(($LENGTH - $COUNT - 1 + $OFFSET))
40 # Record remainder for i2c 0x100 upper range limit
41 if [[ $HIGH -gt 0x100 ]]; then
42 REMAINDER=$(($HIGH + 1 - 0x100))
43 else
44 REMAINDER=0
45 fi
46
47 RETURN=$(i2cdump -f -y -r ${OFFSET}-$(($HIGH - $REMAINDER)) 0 $ADDR b | grep ':')
48 COUNT=$(($HIGH - $REMAINDER - $OFFSET + 1 + $COUNT))
49 OFFSET=0
50 else
51 RETURN=$(i2cdump -f -y 0 $ADDR b | grep ':')
52 COUNT=$(($COUNT + 0x100))
53 fi
54
55 if [[ "$RETURN" ]]; then # Only print reads
56 # Format output to be continuous and account for page increase
57 echo "$RETURN" | while read x; do
58 printf "%04x" "$((0x$(echo $x | cut -d':' -f1) + $((PAGE * 0x100))))"
59 echo ":${x##*:}"
60 done
61 fi
62
63 # Increase the page count
64 ((++PAGE))
65done