mirror of
				https://github.com/ARM-software/workload-automation.git
				synced 2025-10-31 15:12:25 +00:00 
			
		
		
		
	Adding support for U-Boot booting in Juno.
This commit is contained in:
		| @@ -26,6 +26,7 @@ from wlauto.exceptions import DeviceError | |||||||
| from wlauto.utils.serial_port import open_serial_connection, pulse_dtr | from wlauto.utils.serial_port import open_serial_connection, pulse_dtr | ||||||
| from wlauto.utils.android import adb_connect, adb_disconnect, adb_list_devices | from wlauto.utils.android import adb_connect, adb_disconnect, adb_list_devices | ||||||
| from wlauto.utils.uefi import UefiMenu, UefiConfig | from wlauto.utils.uefi import UefiMenu, UefiConfig | ||||||
|  | from wlauto.utils.uboot import UbootMenu | ||||||
|  |  | ||||||
|  |  | ||||||
| AUTOSTART_MESSAGE = 'Press Enter to stop auto boot...' | AUTOSTART_MESSAGE = 'Press Enter to stop auto boot...' | ||||||
| @@ -59,6 +60,9 @@ class Juno(BigLittleDevice): | |||||||
|         Parameter('core_names', default=['a53', 'a53', 'a53', 'a53', 'a57', 'a57'], override=True), |         Parameter('core_names', default=['a53', 'a53', 'a53', 'a53', 'a57', 'a57'], override=True), | ||||||
|         Parameter('core_clusters', default=[0, 0, 0, 0, 1, 1], override=True), |         Parameter('core_clusters', default=[0, 0, 0, 0, 1, 1], override=True), | ||||||
|  |  | ||||||
|  |         Parameter('bootloader', default='uefi', allowed_values=['uefi', 'u-boot'], | ||||||
|  |                   description="""Bootloader used on the device."""), | ||||||
|  |  | ||||||
|         # VExpress flasher expects a device to have these: |         # VExpress flasher expects a device to have these: | ||||||
|         Parameter('uefi_entry', default='WA', |         Parameter('uefi_entry', default='WA', | ||||||
|                   description='The name of the entry to use (will be created if does not exist).'), |                   description='The name of the entry to use (will be created if does not exist).'), | ||||||
| @@ -84,6 +88,27 @@ class Juno(BigLittleDevice): | |||||||
|     def boot(self, **kwargs): |     def boot(self, **kwargs): | ||||||
|         self.logger.debug('Resetting the device.') |         self.logger.debug('Resetting the device.') | ||||||
|         self.reset() |         self.reset() | ||||||
|  |         if self.bootloader == 'uefi': | ||||||
|  |             self._boot_via_uefi() | ||||||
|  |         else: | ||||||
|  |             self._boot_via_uboot(**kwargs) | ||||||
|  |  | ||||||
|  |     def _boot_via_uboot(self, **kwargs): | ||||||
|  |         if not kwargs: | ||||||
|  |             # Standard linaro configuration will proceed directly to the kernel | ||||||
|  |             return | ||||||
|  |         with open_serial_connection(port=self.port, | ||||||
|  |                                     baudrate=self.baudrate, | ||||||
|  |                                     timeout=self.timeout, | ||||||
|  |                                     init_dtr=0) as target: | ||||||
|  |             menu = UbootMenu(target) | ||||||
|  |             self.logger.debug('Waiting for U-Boot prompt...') | ||||||
|  |             menu.open(timeout=120) | ||||||
|  |             for var, value in kwargs.iteritems(): | ||||||
|  |                 menu.setenv(var, value) | ||||||
|  |             menu.boot() | ||||||
|  |  | ||||||
|  |     def _boot_via_uefi(self): | ||||||
|         with open_serial_connection(port=self.port, |         with open_serial_connection(port=self.port, | ||||||
|                                     baudrate=self.baudrate, |                                     baudrate=self.baudrate, | ||||||
|                                     timeout=self.timeout, |                                     timeout=self.timeout, | ||||||
| @@ -109,7 +134,7 @@ class Juno(BigLittleDevice): | |||||||
|                                             baudrate=self.baudrate, |                                             baudrate=self.baudrate, | ||||||
|                                             init_dtr=0) as target: |                                             init_dtr=0) as target: | ||||||
|                     target.sendline('') |                     target.sendline('') | ||||||
|                     self.logger.debug('Waiting for android prompt.') |                     self.logger.debug('Waiting for the Android prompt.') | ||||||
|                     target.expect(self.android_prompt) |                     target.expect(self.android_prompt) | ||||||
|  |  | ||||||
|                     self.logger.debug('Waiting for IP address...') |                     self.logger.debug('Waiting for IP address...') | ||||||
|   | |||||||
| @@ -54,25 +54,7 @@ def pulse_dtr(conn, state=True, duration=0.1): | |||||||
|     conn.setDTR(not state) |     conn.setDTR(not state) | ||||||
|  |  | ||||||
|  |  | ||||||
| @contextmanager | def get_connection(timeout, init_dtr=None, *args, **kwargs): | ||||||
| def open_serial_connection(timeout, get_conn=False, init_dtr=None, *args, **kwargs): |  | ||||||
|     """ |  | ||||||
|     Opens a serial connection to a device. |  | ||||||
|  |  | ||||||
|     :param timeout: timeout for the fdpexpect spawn object. |  | ||||||
|     :param conn: ``bool`` that specfies whether the underlying connection |  | ||||||
|                  object should be yielded as well. |  | ||||||
|     :param init_dtr: specifies the initial DTR state stat should be set. |  | ||||||
|  |  | ||||||
|     All arguments are passed into the __init__ of serial.Serial. See |  | ||||||
|     pyserial documentation for details: |  | ||||||
|  |  | ||||||
|         http://pyserial.sourceforge.net/pyserial_api.html#serial.Serial |  | ||||||
|  |  | ||||||
|     :returns: a pexpect spawn object connected to the device. |  | ||||||
|               See: http://pexpect.sourceforge.net/pexpect.html |  | ||||||
|  |  | ||||||
|     """ |  | ||||||
|     if init_dtr is not None: |     if init_dtr is not None: | ||||||
|         kwargs['dsrdtr'] = True |         kwargs['dsrdtr'] = True | ||||||
|     try: |     try: | ||||||
| @@ -99,6 +81,29 @@ def open_serial_connection(timeout, get_conn=False, init_dtr=None, *args, **kwar | |||||||
|         time.sleep(0.1) |         time.sleep(0.1) | ||||||
|  |  | ||||||
|     target.sendline = sendline |     target.sendline = sendline | ||||||
|  |     return target, conn | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @contextmanager | ||||||
|  | def open_serial_connection(timeout, get_conn=False, init_dtr=None, *args, **kwargs): | ||||||
|  |     """ | ||||||
|  |     Opens a serial connection to a device. | ||||||
|  |  | ||||||
|  |     :param timeout: timeout for the fdpexpect spawn object. | ||||||
|  |     :param conn: ``bool`` that specfies whether the underlying connection | ||||||
|  |                  object should be yielded as well. | ||||||
|  |     :param init_dtr: specifies the initial DTR state stat should be set. | ||||||
|  |  | ||||||
|  |     All arguments are passed into the __init__ of serial.Serial. See | ||||||
|  |     pyserial documentation for details: | ||||||
|  |  | ||||||
|  |         http://pyserial.sourceforge.net/pyserial_api.html#serial.Serial | ||||||
|  |  | ||||||
|  |     :returns: a pexpect spawn object connected to the device. | ||||||
|  |               See: http://pexpect.sourceforge.net/pexpect.html | ||||||
|  |  | ||||||
|  |     """ | ||||||
|  |     target, conn = get_connection(timeout, init_dtr=init_dtr, *args, **kwargs) | ||||||
|  |  | ||||||
|     if get_conn: |     if get_conn: | ||||||
|         yield target, conn |         yield target, conn | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user