Change private function _sdb_root_on to public function sdb_root_on
[tools/litmus.git] / litmus / device / deviceartik10.py
1 #!/usr/bin/env python3
2 # Copyright 2015-2016 Samsung Electronics Co., Ltd.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 import time
17 import logging
18 from threading import Thread
19 from litmus.device.device import device
20 from litmus.core.util import find_pattern
21 from litmus.core.exceptions import BootError
22
23
24 class deviceartik10(device):
25     """docstring for device"""
26
27     _booting_time = 60
28     _pattern_shellprompt = r'root.*> .*'
29     _pattern_bootprompt = r'ARTIK.*# .*'
30
31     def __init__(self, *args, **kwargs):
32         self.args = args
33         self.kwargs = kwargs
34         self._name = kwargs['devicename']
35
36         self._open_uart()
37         self._manager = kwargs['manager']
38
39     def _release(self):
40         """docstring for _release"""
41         self._close_uart()
42
43     def _wait_uart_shell_login_prompt(self):
44         """docstring for _wait_uart_shell_login_prompt"""
45         super(deviceartik10, self)._wait_uart_shell_login_prompt()
46
47     def _set_sdb_deviceid(self):
48         """docstring for _set_sdb_deviceid"""
49         usb0_path = b'/sys/class/usb_mode/usb0'
50         pattern = '.*{0}'.format(self.get_id())
51
52         def set_serialnumber(deviceid):
53             """docstring for set_serialnumber"""
54             self._write_uart(b''.join([b'echo 0 > ', usb0_path, b'/enable']))
55             time.sleep(0.3)
56             self._write_uart(b''.join([b'echo ',
57                                        b'-n ',
58                                        deviceid,
59                                        b' > ', usb0_path,
60                                        b'/iSerial']))
61             time.sleep(0.3)
62             self._write_uart(b'direct_set_debug.sh --sdb-set')
63             time.sleep(0.5)
64
65         def get_serialnumber():
66             """docstring for get_serialnumber"""
67             self._write_uart(b''.join([b'cat ', usb0_path, b'/enable']))
68             time.sleep(0.3)
69             self._write_uart(b''.join([b'cat ', usb0_path, b'/iSerial']))
70             time.sleep(0.3)
71             return self._read_uart(1000)
72
73         retrycnt = 0
74         while retrycnt < 10:
75             set_serialnumber(deviceid=self.get_id().encode())
76             serialnumber = get_serialnumber()
77             if find_pattern(pattern, serialnumber):
78                 return
79             retrycnt += 1
80         else:
81             raise Exception('Can\'t configure sdb deviceid')
82
83     def _reboot(self):
84         """docstring for _reboot"""
85         status = self._current_uart_status()
86
87         if status == 'LOGGED_IN':
88             self._write_uart(b'reboot')
89             time.sleep(3)
90         elif status == 'BOOT_PROMPT':
91             self._write_uart(b'reset')
92             time.sleep(3)
93         elif status == 'NOT_LOGGED_IN':
94             self._wait_uart_shell_login_prompt()
95             self._login_uart_shell()
96             self._write_uart(b'reboot')
97             time.sleep(3)
98
99     def _current_uart_status(self):
100         """docstring for _current_uart_status"""
101         self._flush_uart_buffer()
102         for loop in range(3):
103             self._write_uart(b'')
104         readdata = self._read_uart(500)
105         if find_pattern(self._pattern_bootprompt, readdata):
106             return 'BOOT_PROMPT'
107         if find_pattern(self._pattern_shellprompt, readdata):
108             return 'LOGGED_IN'
109         else:
110             return 'NOT_LOGGED_IN'
111
112     def _enter_download_mode(self, cmd, power_cut_delay=1, thread_param=10):
113         """docstring for _enter_download_mode"""
114         t = Thread(target=self._thread_for_enter_download_mode,
115                    args=(cmd, thread_param, ))
116         status = self._current_uart_status()
117         if status == 'NOT_LOGGED_IN':
118             self._wait_uart_shell_login_prompt()
119             self._login_uart_shell()
120         t.start()
121         self._reboot()
122         t.join()
123
124     def on(self, powercut_delay=3):
125         """
126         Turn on the device acquired.
127
128         :param float powercut_delay: power-cut delay for cutter
129         """
130         logging.debug('=================Turn on device {}=================='
131                       .format(self.get_name()))
132         retry_cnt = 0
133         time.sleep(powercut_delay)
134         while retry_cnt <= self._max_attempt_boot_retry:
135             try:
136                 self._reboot()
137                 self._wait_uart_shell_login_prompt()
138                 self._login_uart_shell()
139                 self._set_sdb_deviceid()
140                 self._attach_sdb()
141                 self.sdb_root_on()
142                 return
143             except KeyboardInterrupt:
144                 raise Exception('Keyboard interrupt.')
145             except Exception as e:
146                 logging.debug(e)
147                 retry_cnt += 1
148         else:
149             raise BootError('Cant\'t turn on dut.')
150
151     def off(self, powercut_delay=2):
152         """
153         Trun off the device acquired.
154
155         :param float powercut_delay: power-cut delay for cutter
156         """
157         logging.debug('off function is not supported for Artik device')