From 7512f5f2a11f36c22f0c8057e875a84cfc8fc1ee Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 8 Oct 2022 20:28:33 -0700 Subject: [PATCH] Add set_lp8550_slope.py Addresses issue #17 --- scripts/set_lp8550_slope.py | 103 ++++++++++++++++++ setup/linux/packages/aur | 1 + .../profile_base/airootfs/etc/skel/.aliases | 1 + 3 files changed, 105 insertions(+) create mode 100755 scripts/set_lp8550_slope.py diff --git a/scripts/set_lp8550_slope.py b/scripts/set_lp8550_slope.py new file mode 100755 index 00000000..f074061f --- /dev/null +++ b/scripts/set_lp8550_slope.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +### +# Dependencies: Linux, python3, python3-smbus +# Usage: `sudo ./set_lp8550_slope.py` +# +# Default slope is 0b101=200ms, can be adjusted below +# Tested with Ubuntu 20.04 on A1466 2013 +# All original EEPROM registers value: +# - A0: 0b01111111 +# - A1: 0b10110101 +# - A2: 0b10111111 +# - A3: 0b01111011 +# - A4: 0b00101000 +# - A5: 0b11001111 +# - A6: 0b01100100 +# - A7: 0b00101101 +### + +import time + +import smbus2 + +config = { + 'smbus_address': 0, # SMBus address, can use `i2cdetect -l` to find it + 'device_address': 0x2C, # LP8550 7 bits address + 'slope': (1, 0, 1) # The new slope to set, MSB first, see lp8550 datasheet 8.6.2.3 SLOPE +} + +lp8550_regs = { + 'EEPROMControl': 0x72, + 'EEPROMAddress1': 0xA1 # default value for this register is 0b10110101 on original 820-3437 +} + +def bitstolist(val, regsize=8): + return [(val >> i) & 0b1 for i in range(0, regsize)] + +def listtobits(l, regsize=8): + val = 0 + for i in range(0, regsize): + val += l[i] << i + return val + +def read_reg(bus, dev_address, reg_name): + return bitstolist(bus.read_byte_data(dev_address, lp8550_regs[reg_name])) + +def write_reg(bus, dev_address, reg_name, reg): + print(f'Writing { listtobits(reg)} to {dev_address}, {lp8550_regs[reg_name]}') + bus.write_byte_data(dev_address, lp8550_regs[reg_name], listtobits(reg)) + +def get_slope(bus, dev_address): + return read_reg(bus, dev_address, 'EEPROMAddress1')[0:3][::-1] + +def set_slope(bus, dev_address, slope): + print('Original slope: ', get_slope(bus, dev_address)) + + EEPROMAddress1 = read_reg(bus, dev_address, 'EEPROMAddress1') + EEPROMAddress1[0:3] = slope[::-1] + + write_reg(bus, dev_address, 'EEPROMAddress1', EEPROMAddress1) + + print('New slope: ', get_slope(bus, dev_address)) + +def write_nvm(bus, dev_address): + print('Writing to non-volatile memory') + EEPROMControl = [0]*8 + EEPROMControl[2] = 1 # EE_INIT=1 + write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl) + + EEPROMControl[1] = 1 # EE_PROG=1 + EEPROMControl[2] = 0 # EE_INIT=0 + write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl) + + time.sleep(0.2) # wait 200ms + + EEPROMControl[1] = 0 # EE_PROG=0 + write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl) + +def load_nvm(bus, dev_address): + print('Loading from non-volatile memory') + EEPROMControl = [0]*8 + EEPROMControl[2] = 1 # EE_INIT=1 + write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl) + + EEPROMControl[0] = 1 # EE_READ=1 + EEPROMControl[2] = 0 # EE_INIT=0 + write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl) + + time.sleep(0.2) # wait 200ms + + EEPROMControl[0] = 0 # EE_READ=0 + write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl) + +def main(): + bus = smbus2.SMBus(config['smbus_address']) + + set_slope(bus, config['device_address'], config['slope']) + write_nvm(bus, config['device_address']) + load_nvm(bus, config['device_address']) + + print('Slope in non-volatile memory: ', get_slope(bus,config['device_address'])) + +if __name__ == "__main__": + main() diff --git a/setup/linux/packages/aur b/setup/linux/packages/aur index cc80e928..ef8ef5d6 100644 --- a/setup/linux/packages/aur +++ b/setup/linux/packages/aur @@ -9,6 +9,7 @@ mprime openbox-patched pipes.sh python-mariadb-connector +python-smbus2 smartmontools-svn testdisk-wip ttf-font-awesome-4 diff --git a/setup/linux/profile_base/airootfs/etc/skel/.aliases b/setup/linux/profile_base/airootfs/etc/skel/.aliases index 7e118fff..a0d7114b 100644 --- a/setup/linux/profile_base/airootfs/etc/skel/.aliases +++ b/setup/linux/profile_base/airootfs/etc/skel/.aliases @@ -31,6 +31,7 @@ alias rmdirs='find -depth -mindepth 1 -type d -exec rmdir "{}" --ignore-fail-on- alias rs='rsync -avhPS --stats --exclude-from="$HOME/.rsync_exclusions"' alias rsz='rsync -avhzPS --stats --exclude-from="$HOME/.rsync_exclusions"' alias sdu='sudo du -sch --apparent-size' +alias set_lp8550_slope='sudo set_lp8550_slope.py' alias srmdirs='sudo find -depth -mindepth 1 -type d -exec rmdir "{}" --ignore-fail-on-non-empty \;' alias srs='sudo rsync -avhPS --stats --exclude-from="$HOME/.rsync_exclusions"' alias srsz='sudo rsync -avhzPS --stats --exclude-from="$HOME/.rsync_exclusions"'