gsc: gsc_direct_mem.sh

File gsc_direct_mem.sh, 1.6 KB (added by Bobby Jones, 18 months 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