aboutsummaryrefslogtreecommitdiff
path: root/x200-ec-mute.sh
blob: 9bf2198ab365f80f6e863b65e3a07bf52de0c8d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/bin/bash

SCRIPTNAME="$0"
VERBOSE=
MODE=
REGISTER=0x03
DEPS="ectool grep awk"

set -e

die() {
	>&2 echo "$@"
	exit 1
}

usage() {
	local exitcode="$1"
	[ -z "$exitcode" ] && exitcode=0
	echo "Usage: $SCRIPTNAME [-v] on|off|status"
	exit $exitcode
}

verbose() {
	if [ -n "$VERBOSE" ]; then
		>&2 echo "$@"
	fi
}

installed() {
	command -v "$1" >/dev/null
}

read_reg() {
	echo "0x$(ectool -d | grep '^00:' | awk '{ print $5 }')"
}

write_reg() {
	local val="$1"

	# convert decimal to hex
	val="0x$(printf "%x" "$val")"

	verbose "new reg value: $val"

	ectool -w $REGISTER -z $val >/dev/null || die "Error: failed to write to the EC"

	verbose "new value $val has been written to register $REGISTER";
}

[[ $EUID == 0 ]] || die "This tool must be run as root."
[[ $# < 1 ]] && usage

for prog in $DEPS; do
	if ! installed $prog; then
		die "Error: $prog not found"
	fi
done

while [[ $# > 0 ]]; do
	case $1 in
		-v)
			VERBOSE=1
			;;

		on | off | status)
			MODE=$1
			;;

		*)
			die "Error: $1: unrecognized argument"
			;;
	esac
	shift
done

[ -z "$MODE" ] && usage 1

# read the register
reg=$(read_reg)
verbose "current reg value: $reg"

case $MODE in 
	status)
		if (( reg & 0x40 )); then
			echo "Enabled"
		else
			echo "Disabled"
		fi
		;;

	on)
		# set bit 6
		reg=$(( reg | 0x40 ))
		write_reg "$reg"
		;;

	off)
		# clear bit 6
		reg=$(( reg & 0xbf ))
		write_reg "$reg"
		;;
esac