| 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
|
|---|
| 15 | BUS=0
|
|---|
| 16 | ADDR=0x5e
|
|---|
| 17 | OFFSET=$1
|
|---|
| 18 | LENGTH=$2
|
|---|
| 19 |
|
|---|
| 20 | # Misc variables
|
|---|
| 21 | COUNT=0
|
|---|
| 22 | PAGE=0
|
|---|
| 23 | PRINTVAL=0x0000
|
|---|
| 24 | REMAINDER=0
|
|---|
| 25 | HIGH=
|
|---|
| 26 | RETURN=
|
|---|
| 27 |
|
|---|
| 28 | # Calculate initial page number based on passed in offset
|
|---|
| 29 | PAGE=$((OFFSET / 0x100))
|
|---|
| 30 | OFFSET=$((OFFSET % 0x100))
|
|---|
| 31 |
|
|---|
| 32 | echo " 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef"
|
|---|
| 33 | while [[ $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))
|
|---|
| 65 | done
|
|---|