85 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Copyright 2016 The Chromium OS Authors. All rights reserved.
 | |
| # Use of this source code is governed by a BSD-style license that can be
 | |
| # found in the LICENSE file.
 | |
| 
 | |
| import logging
 | |
| import os
 | |
| import time
 | |
| 
 | |
| from autotest_lib.client.common_lib import error
 | |
| from autotest_lib.server import test
 | |
| from autotest_lib.server.cros import servo_keyboard_utils
 | |
| 
 | |
| 
 | |
| class firmware_FlashServoKeyboardMap(test.test):
 | |
|     """A test to flash the keyboard map on servo."""
 | |
|     version = 1
 | |
| 
 | |
|     _ATMEGA_RESET_DELAY = 0.2
 | |
|     _USB_PRESENT_DELAY = 1
 | |
| 
 | |
|     def run_once(self, host=None):
 | |
|         """Body of the test."""
 | |
| 
 | |
|         servo = host.servo
 | |
|         if host.run('hash dfu-programmer', ignore_status=True).exit_status:
 | |
|             raise error.TestError(
 | |
|                 'The image is too old that does not have dfu-programmer.')
 | |
| 
 | |
|         try:
 | |
|             servo.set_nocheck('init_usb_keyboard', 'on')
 | |
| 
 | |
|             # Check the result of lsusb.
 | |
|             time.sleep(self._USB_PRESENT_DELAY)
 | |
|             lsusb_cmd = ('lsusb -d ' +
 | |
|                          servo_keyboard_utils.ATMEL_USB_VENDOR_ID + ':')
 | |
|             result = host.run(lsusb_cmd).stdout.strip()
 | |
|             if ('LUFA Keyboard Demo' in result and
 | |
|                     servo_keyboard_utils.is_servo_usb_wake_capable(host)):
 | |
|                 logging.info('Already using the new keyboard map.')
 | |
|                 return
 | |
| 
 | |
|              # Boot AVR into DFU mode by enabling the HardWareBoot mode
 | |
|              # strapping and reset.
 | |
|             servo.set_get_all(['at_hwb:on',
 | |
|                                'atmega_rst:on',
 | |
|                                'sleep:%f' % self._ATMEGA_RESET_DELAY,
 | |
|                                'atmega_rst:off',
 | |
|                                'sleep:%f' % self._ATMEGA_RESET_DELAY,
 | |
|                                'at_hwb:off'])
 | |
| 
 | |
|             time.sleep(self._USB_PRESENT_DELAY)
 | |
|             result = host.run(lsusb_cmd).stdout.strip()
 | |
|             if not 'Atmel Corp. atmega32u4 DFU bootloader' in result:
 | |
|                 message = 'Not an expected chip: %s' % result
 | |
|                 logging.error(message)
 | |
|                 raise error.TestFail(message)
 | |
| 
 | |
|             # Update the keyboard map.
 | |
|             local_path = os.path.join(self.bindir, 'test_data', 'keyboard.hex')
 | |
|             host.send_file(local_path, '/tmp')
 | |
|             logging.info('Updating the keyboard map...')
 | |
|             host.run('dfu-programmer atmega32u4 erase --force')
 | |
|             host.run('dfu-programmer atmega32u4 flash /tmp/keyboard.hex')
 | |
| 
 | |
|             # Reset the chip.
 | |
|             servo.set_get_all(['atmega_rst:on',
 | |
|                                'sleep:%f' % self._ATMEGA_RESET_DELAY,
 | |
|                                'atmega_rst:off'])
 | |
| 
 | |
|             # Check the result of lsusb.
 | |
|             time.sleep(self._USB_PRESENT_DELAY)
 | |
|             result = host.run(lsusb_cmd).stdout.strip()
 | |
|             if 'LUFA Keyboard Demo' in result:
 | |
|                 logging.info('Update successfully!')
 | |
|             else:
 | |
|                 message = 'Update failed; got the result: %s' % result
 | |
|                 logging.error(message)
 | |
|                 raise error.TestFail(message)
 | |
| 
 | |
|         finally:
 | |
|             # Restore the default settings.
 | |
|             # Select the chip on the USB mux unless using Servo V4
 | |
|             if 'servo_v4' not in servo.get_servo_version():
 | |
|                 servo.set('usb_mux_sel4', 'on')
 |