hardsploit_gui 2.2 → 2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/hardsploit_gui +2 -2
- data/lib/{Firmware → Firmwares}/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
- data/lib/{Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd → Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd} +0 -0
- data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
- data/lib/{Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd → Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd} +0 -0
- data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
- data/lib/{Firmware → Firmwares}/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
- data/lib/{Firmware → Firmwares}/FPGA/VersionFPGA.rb +1 -1
- data/lib/{Firmware → Firmwares}/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
- data/lib/{Firmware → Firmwares}/UC/VersionUC.rb +1 -1
- data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -0
- data/lib/HardsploitAPI/{HardsploitAPI_PROGRESS.rb → Core/HardsploitAPI_PROGRESS.rb} +0 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -0
- data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -0
- data/lib/HardsploitAPI/{HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb → Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb} +26 -49
- data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -0
- data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -0
- data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -0
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -0
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -0
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -0
- data/lib/HardsploitAPI/{SWD → Modules/SWD}/HardsploitAPI_SWD_STM32.rb +32 -15
- data/lib/HardsploitAPI/{HardsploitAPI_TEST_INTERACT.rb → Modules/TEST/HardsploitAPI_TEST_INTERACT.rb} +1 -1
- data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -0
- data/lib/Hardsploit_gui.rb +96 -0
- data/lib/class/Chip_editor.rb +186 -330
- data/lib/class/Chip_management.rb +496 -0
- data/lib/class/Command_editor.rb +130 -182
- data/lib/class/Command_table.rb +16 -22
- data/lib/class/Console.rb +0 -2
- data/lib/class/ErrorMsg.rb +312 -0
- data/lib/class/Export.rb +140 -0
- data/lib/class/Export_manager.rb +43 -43
- data/lib/class/Firmware.rb +52 -11
- data/lib/class/Generic_commands.rb +180 -190
- data/lib/class/Import.rb +193 -0
- data/lib/class/Progress_bar.rb +1 -0
- data/lib/class/Signal_mapper.rb +120 -0
- data/lib/class/Wire_helper.rb +132 -148
- data/lib/class/{I2C → i2c}/I2c_command.rb +16 -13
- data/lib/class/i2c/I2c_export.rb +95 -0
- data/lib/class/i2c/I2c_import.rb +117 -0
- data/lib/class/i2c/I2c_scanner.rb +114 -0
- data/lib/class/i2c/I2c_settings.rb +148 -0
- data/lib/class/parallel/Parallel_export.rb +118 -0
- data/lib/class/parallel/Parallel_import.rb +113 -0
- data/lib/class/parallel/Parallel_settings.rb +81 -0
- data/lib/class/spi/Spi_export.rb +108 -0
- data/lib/class/spi/Spi_import.rb +159 -0
- data/lib/class/spi/Spi_settings.rb +108 -0
- data/lib/class/spi/Spi_sniffer.rb +101 -0
- data/lib/class/swd/Swd.rb +125 -0
- data/lib/class/swd/Swd_scanner.rb +121 -0
- data/lib/class/swd/Swd_settings.rb +76 -0
- data/lib/class/uart/Uart_baudrate.rb +62 -0
- data/lib/class/uart/Uart_console.rb +115 -0
- data/lib/class/uart/Uart_settings.rb +102 -0
- data/lib/db/associations.rb +42 -29
- data/lib/db/database.rb +4 -0
- data/lib/db/development.sqlite3 +0 -0
- data/lib/db/migrate/004_create_manufacturers.rb +13 -0
- data/lib/db/migrate/005_create_packages.rb +13 -0
- data/lib/db/migrate/006_create_chip_types.rb +11 -0
- data/lib/db/migrate/007_create_buses.rb +11 -0
- data/lib/db/migrate/008_create_signals.rb +14 -0
- data/lib/db/migrate/009_create_chips.rb +25 -0
- data/lib/db/migrate/010_create_commands.rb +21 -0
- data/lib/db/migrate/011_create_bytes.rb +19 -0
- data/lib/db/migrate/012_create_i2c_settings.rb +21 -0
- data/lib/db/migrate/013_create_spi_settings.rb +26 -0
- data/lib/db/migrate/014_create_parallel_settings.rb +21 -0
- data/lib/db/migrate/015_create_pins.rb +19 -0
- data/lib/db/migrate/016_create_uses.rb +17 -0
- data/lib/db/migrate/017_create_swd_settings.rb +19 -0
- data/lib/db/migrate/018_create_uart_settings.rb +22 -0
- data/lib/db/schema.rb +157 -0
- data/lib/db/seeds.rb +161 -0
- data/lib/gui/gui_chip_editor.rb +23 -22
- data/lib/gui/gui_chip_management.rb +43 -38
- data/lib/gui/gui_command_editor.rb +2 -1
- data/lib/gui/gui_export.rb +132 -0
- data/lib/gui/gui_generic_commands.rb +69 -31
- data/lib/gui/gui_generic_export.rb +18 -2
- data/lib/gui/gui_generic_import.rb +18 -2
- data/lib/gui/gui_i2c_command.rb +2 -1
- data/lib/gui/gui_i2c_settings.rb +2 -2
- data/lib/gui/gui_import.rb +131 -0
- data/lib/gui/gui_parallel_settings.rb +2 -1
- data/lib/gui/gui_progress_bar.rb +2 -1
- data/lib/gui/gui_signal_mapper.rb +121 -0
- data/lib/gui/gui_signal_scanner.rb +146 -0
- data/lib/gui/gui_spi_settings.rb +6 -2
- data/lib/gui/gui_spi_sniffer.rb +112 -0
- data/lib/gui/gui_swd_settings.rb +166 -0
- data/lib/gui/gui_uart_baudrate.rb +114 -0
- data/lib/gui/gui_uart_console.rb +164 -0
- data/lib/gui/gui_uart_settings.rb +243 -0
- data/lib/gui_designer/gui_chip_editor.ui +9 -6
- data/lib/gui_designer/gui_chip_management.ui +79 -35
- data/lib/gui_designer/gui_command_editor.ui +3 -0
- data/lib/gui_designer/gui_export.ui +171 -0
- data/lib/gui_designer/gui_generic_commands.ui +274 -190
- data/lib/gui_designer/gui_generic_export.ui +24 -1
- data/lib/gui_designer/gui_generic_import.ui +25 -2
- data/lib/gui_designer/gui_i2c_command.ui +3 -0
- data/lib/gui_designer/gui_i2c_settings.ui +2 -2
- data/lib/gui_designer/gui_import.ui +168 -0
- data/lib/gui_designer/gui_parallel_settings.ui +4 -1
- data/lib/gui_designer/gui_progress_bar.ui +3 -0
- data/lib/gui_designer/gui_signal_mapper.ui +179 -0
- data/lib/gui_designer/gui_signal_scanner.ui +261 -0
- data/lib/gui_designer/gui_spi_settings.ui +15 -2
- data/lib/gui_designer/gui_spi_sniffer.ui +156 -0
- data/lib/gui_designer/gui_swd_settings.ui +189 -0
- data/lib/gui_designer/gui_uart_baudrate.ui +161 -0
- data/lib/gui_designer/gui_uart_console.ui +284 -0
- data/lib/gui_designer/gui_uart_settings.ui +280 -0
- data/lib/logs/error.log +63 -0
- data/lib/models/bus.rb +19 -0
- data/lib/models/byte.rb +29 -0
- data/lib/models/chip.rb +41 -0
- data/lib/models/chip_type.rb +14 -0
- data/lib/models/command.rb +20 -0
- data/lib/models/i2c_setting.rb +41 -0
- data/lib/models/manufacturer.rb +14 -0
- data/lib/models/package.rb +26 -0
- data/lib/models/parallel_setting.rb +37 -0
- data/lib/models/pin.rb +14 -0
- data/lib/models/signall.rb +20 -0
- data/lib/models/spi_setting.rb +67 -0
- data/lib/models/swd_setting.rb +25 -0
- data/lib/models/uart_setting.rb +52 -0
- data/lib/models/use.rb +6 -0
- data/lib/startHardsploit.rb +2 -2
- metadata +106 -41
- data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
- data/lib/HardsploitAPI/HardsploitAPI.rb +0 -133
- data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +0 -145
- data/lib/HardsploitAPI/HardsploitAPI_ERROR.rb +0 -38
- data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +0 -311
- data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +0 -360
- data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +0 -369
- data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +0 -148
- data/lib/HardsploitAPI/LICENSE.txt +0 -674
- data/lib/HardsploitAPI/README.md +0 -22
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +0 -249
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +0 -102
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +0 -78
- data/lib/HardsploitAPI/TRADEMARK +0 -3
- data/lib/class/HardsploitGUI.rb +0 -463
- data/lib/class/I2C/I2c_export.rb +0 -118
- data/lib/class/I2C/I2c_import.rb +0 -79
- data/lib/class/I2C/I2c_settings.rb +0 -129
- data/lib/class/PARALLEL/Parallel_export.rb +0 -146
- data/lib/class/PARALLEL/Parallel_import.rb +0 -88
- data/lib/class/PARALLEL/Parallel_settings.rb +0 -102
- data/lib/class/SPI/Spi_export.rb +0 -138
- data/lib/class/SPI/Spi_import.rb +0 -113
- data/lib/class/SPI/Spi_settings.rb +0 -134
- data/lib/db/hs.db +0 -0
- data/lib/hardsploit.rb +0 -131
@@ -0,0 +1,306 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#===================================================
|
3
|
+
# Hardsploit API - By Opale Security
|
4
|
+
# www.opale-security.com || www.hardsploit.io
|
5
|
+
# License: GNU General Public License v3
|
6
|
+
# License URI: http://www.gnu.org/licenses/gpl.txt
|
7
|
+
#===================================================
|
8
|
+
|
9
|
+
require_relative '../../Core/HardsploitAPI'
|
10
|
+
require_relative '../../Modules/SPI/HardsploitAPI_SPI'
|
11
|
+
class HardsploitAPI_NRF24L01
|
12
|
+
public
|
13
|
+
# Instruction Mnemonics
|
14
|
+
R_REGISTER = 0x00
|
15
|
+
W_REGISTER = 0x20
|
16
|
+
REGISTER_MASK = 0x1F
|
17
|
+
ACTIVATE = 0x50
|
18
|
+
R_RX_PL_WID = 0x60
|
19
|
+
R_RX_PAYLOAD = 0x61
|
20
|
+
W_TX_PAYLOAD = 0xA0
|
21
|
+
W_ACK_PAYLOAD = 0xA8
|
22
|
+
FLUSH_TX = 0xE1
|
23
|
+
FLUSH_RX = 0xE2
|
24
|
+
REUSE_TX_PL = 0xE3
|
25
|
+
NOP = 0xFF
|
26
|
+
|
27
|
+
#Register map
|
28
|
+
NRF24L01_00_CONFIG = 0x00
|
29
|
+
NRF24L01_01_EN_AA = 0x01
|
30
|
+
NRF24L01_02_EN_RXADDR = 0x02
|
31
|
+
NRF24L01_03_SETUP_AW = 0x03
|
32
|
+
NRF24L01_04_SETUP_RETR = 0x04
|
33
|
+
NRF24L01_05_RF_CH = 0x05
|
34
|
+
NRF24L01_06_RF_SETUP = 0x06
|
35
|
+
NRF24L01_07_STATUS = 0x07
|
36
|
+
NRF24L01_08_OBSERVE_TX = 0x08
|
37
|
+
NRF24L01_09_CD = 0x09
|
38
|
+
NRF24L01_0A_RX_ADDR_P0 = 0x0A
|
39
|
+
NRF24L01_0B_RX_ADDR_P1 = 0x0B
|
40
|
+
NRF24L01_0C_RX_ADDR_P2 = 0x0C
|
41
|
+
NRF24L01_0D_RX_ADDR_P3 = 0x0D
|
42
|
+
NRF24L01_0E_RX_ADDR_P4 = 0x0E
|
43
|
+
NRF24L01_0F_RX_ADDR_P5 = 0x0F
|
44
|
+
NRF24L01_10_TX_ADDR = 0x10
|
45
|
+
NRF24L01_11_RX_PW_P0 = 0x11
|
46
|
+
NRF24L01_12_RX_PW_P1 = 0x12
|
47
|
+
NRF24L01_13_RX_PW_P2 = 0x13
|
48
|
+
NRF24L01_14_RX_PW_P3 = 0x14
|
49
|
+
NRF24L01_15_RX_PW_P4 = 0x15
|
50
|
+
NRF24L01_16_RX_PW_P5 = 0x16
|
51
|
+
NRF24L01_17_FIFO_STATUS = 0x17
|
52
|
+
NRF24L01_1C_DYNPD = 0x1C
|
53
|
+
NRF24L01_1D_FEATURE = 0x1D
|
54
|
+
|
55
|
+
# Bit mnemonics
|
56
|
+
NRF24L01_00_MASK_RX_DR = 6
|
57
|
+
NRF24L01_00_MASK_TX_DS = 5
|
58
|
+
NRF24L01_00_MASK_MAX_RT = 4
|
59
|
+
NRF24L01_00_EN_CRC = 3
|
60
|
+
NRF24L01_00_CRCO = 2
|
61
|
+
NRF24L01_00_PWR_UP = 1
|
62
|
+
NRF24L01_00_PRIM_RX = 0
|
63
|
+
NRF24L01_07_RX_DR = 6
|
64
|
+
NRF24L01_07_TX_DS = 5
|
65
|
+
NRF24L01_07_MAX_RT = 4
|
66
|
+
|
67
|
+
# Bitrates
|
68
|
+
NRF24L01_BR_1M = 0
|
69
|
+
NRF24L01_BR_2M = 1
|
70
|
+
NRF24L01_BR_250K = 2
|
71
|
+
NRF24L01_BR_RSVD = 3
|
72
|
+
|
73
|
+
TXRX_OFF = 0
|
74
|
+
TX_EN = 1
|
75
|
+
RX_EN = 2
|
76
|
+
|
77
|
+
def BV(x)
|
78
|
+
return (1 << x)
|
79
|
+
end
|
80
|
+
|
81
|
+
def sendAndReceiveSPI(packet)
|
82
|
+
begin
|
83
|
+
return @spi.spi_Interact(payload:packet)
|
84
|
+
rescue HardsploitAPI::ERROR::HARDSPLOIT_NOT_FOUND
|
85
|
+
puts "Hardsploit not found"
|
86
|
+
rescue HardsploitAPI::ERROR::USB_ERROR
|
87
|
+
puts "USB ERROR"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def initialize()
|
92
|
+
#Speed Range 1-255 SPI clock = 150Mhz / (2*speed) tested from 3 to 255 (25Mhz to about 0.3Khz)
|
93
|
+
@spi = HardsploitAPI_SPI.new(speed:8,mode:0) # 150/(2*8) = 9.3Mhz
|
94
|
+
@rf_setup = 0x0F
|
95
|
+
@tout =0
|
96
|
+
end
|
97
|
+
|
98
|
+
def initDrone(channel:,address:)
|
99
|
+
config = BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PRIM_RX)
|
100
|
+
NRF24L01_WriteReg(NRF24L01_00_CONFIG, config);
|
101
|
+
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x0f); # Auto Acknoledgement
|
102
|
+
NRF24L01_Activate(0x73); #Allow write feature reg
|
103
|
+
NRF24L01_WriteReg( NRF24L01_1D_FEATURE,0x06); #enableDynamicPayloads
|
104
|
+
NRF24L01_WriteReg( NRF24L01_1C_DYNPD,0x3f); #enableDynamicPayloads
|
105
|
+
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); # Enable data pipe 0
|
106
|
+
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); # 5-byte RX/TX address
|
107
|
+
#NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0xFF); # 4ms retransmit t/o, 15 tries
|
108
|
+
NRF24L01_WriteReg(NRF24L01_05_RF_CH, channel); # Channel - bind
|
109
|
+
setBitrate(NRF24L01_BR_250K)
|
110
|
+
setPower(3) #Max power
|
111
|
+
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); # Clear data ready, data
|
112
|
+
NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, 16);
|
113
|
+
NRF24L01_WriteReg(NRF24L01_17_FIFO_STATUS, 0x00);
|
114
|
+
NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0,address);
|
115
|
+
NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, address);
|
116
|
+
|
117
|
+
initialize();
|
118
|
+
|
119
|
+
config |= BV(NRF24L01_00_PWR_UP);
|
120
|
+
NRF24L01_WriteReg(NRF24L01_00_CONFIG, config);
|
121
|
+
|
122
|
+
valid_packets = missed_packets = bad_packets = 0;
|
123
|
+
|
124
|
+
NRF24L01_SetTxRxMode(TXRX_OFF);
|
125
|
+
NRF24L01_SetTxRxMode(RX_EN);
|
126
|
+
# puts "EN_AA"
|
127
|
+
# p NRF24L01_ReadReg(NRF24L01_01_EN_AA)
|
128
|
+
# puts "EN_RXADDR"
|
129
|
+
# p NRF24L01_ReadReg(NRF24L01_02_EN_RXADDR)
|
130
|
+
# puts "SETUP_AW"
|
131
|
+
# p NRF24L01_ReadReg(NRF24L01_03_SETUP_AW)
|
132
|
+
# puts "RF_CH"
|
133
|
+
# p NRF24L01_ReadReg(NRF24L01_05_RF_CH)
|
134
|
+
# puts "RX_PW_P0"
|
135
|
+
# p NRF24L01_ReadRegisterMulti(NRF24L01_0A_RX_ADDR_P0,5)
|
136
|
+
# puts "TX_PW_P0"
|
137
|
+
# p NRF24L01_ReadRegisterMulti(NRF24L01_10_TX_ADDR,5)
|
138
|
+
# puts "RX_ADDR_P0"
|
139
|
+
# p NRF24L01_ReadReg(NRF24L01_0A_RX_ADDR_P0)
|
140
|
+
# puts "TX_ADDR"
|
141
|
+
# p NRF24L01_ReadReg(NRF24L01_10_TX_ADDR)
|
142
|
+
# puts "config"
|
143
|
+
# p config
|
144
|
+
end
|
145
|
+
|
146
|
+
def NRF24L01_WriteReg(reg, data)
|
147
|
+
result = sendAndReceiveSPI([ (W_REGISTER | (REGISTER_MASK & reg)),data ])
|
148
|
+
return result[1]
|
149
|
+
end
|
150
|
+
|
151
|
+
def NRF24L01_WriteRegisterMulti(reg, payload)
|
152
|
+
tmppayload = Array.new
|
153
|
+
tmppayload.push (W_REGISTER | (REGISTER_MASK & reg))
|
154
|
+
tmppayload.push *payload
|
155
|
+
result = sendAndReceiveSPI(tmppayload)
|
156
|
+
return result[0]
|
157
|
+
end
|
158
|
+
|
159
|
+
def NRF24L01_WritePayload(payload)
|
160
|
+
tmpWpayload = Array.new
|
161
|
+
tmpWpayload.push (W_TX_PAYLOAD)
|
162
|
+
tmpWpayload.push *payload
|
163
|
+
result = sendAndReceiveSPI(tmpWpayload)
|
164
|
+
return result[0]
|
165
|
+
end
|
166
|
+
|
167
|
+
def NRF24L01_ReadReg(reg)
|
168
|
+
result = sendAndReceiveSPI([R_REGISTER | (REGISTER_MASK & reg) ,0xFF ])
|
169
|
+
return result[1]
|
170
|
+
end
|
171
|
+
|
172
|
+
def readPayloadSize
|
173
|
+
result = sendAndReceiveSPI([R_RX_PL_WID ,0xFF ])
|
174
|
+
return result[1]
|
175
|
+
end
|
176
|
+
|
177
|
+
def NRF24L01_ReadRegisterMulti(reg,length)
|
178
|
+
tab = Array.new
|
179
|
+
tab.push (R_REGISTER | (REGISTER_MASK & reg))
|
180
|
+
tab.push *Array.new(length, 0xFF)
|
181
|
+
return sendAndReceiveSPI(tab).drop(1) #remove the first byte
|
182
|
+
end
|
183
|
+
|
184
|
+
def readPayload(length)
|
185
|
+
tab = Array.new
|
186
|
+
tab.push R_RX_PAYLOAD
|
187
|
+
tab.push *Array.new(length, 0xFF)
|
188
|
+
return sendAndReceiveSPI(tab).drop(1) #remove the first byte
|
189
|
+
end
|
190
|
+
|
191
|
+
def readAvailableData
|
192
|
+
return readPayload(readPayloadSize)
|
193
|
+
end
|
194
|
+
|
195
|
+
def Strobe(state)
|
196
|
+
result = sendAndReceiveSPI([state])
|
197
|
+
return result[0];
|
198
|
+
end
|
199
|
+
|
200
|
+
def NRF24L01_FlushTx()
|
201
|
+
return Strobe(FLUSH_TX);
|
202
|
+
end
|
203
|
+
|
204
|
+
def NRF24L01_FlushRx()
|
205
|
+
return Strobe(FLUSH_RX);
|
206
|
+
end
|
207
|
+
|
208
|
+
def NRF24L01_Activate(code)
|
209
|
+
result = sendAndReceiveSPI([ACTIVATE ,code])
|
210
|
+
return result[0];
|
211
|
+
end
|
212
|
+
|
213
|
+
def dataAvailable()
|
214
|
+
result = sendAndReceiveSPI([R_REGISTER ,HardsploitAPI_NRF24L01::NRF24L01_07_STATUS])
|
215
|
+
if ((result[0] & BV(HardsploitAPI_NRF24L01::NRF24L01_07_RX_DR))>>6)==1
|
216
|
+
return true
|
217
|
+
else
|
218
|
+
return false
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
def changeChannel(channel:)
|
223
|
+
NRF24L01_WriteReg(NRF24L01_05_RF_CH, channel)
|
224
|
+
end
|
225
|
+
|
226
|
+
def setBitrate(bitrate)
|
227
|
+
#Note that bitrate 250kbps (and bit RF_DR_LOW) is valid only
|
228
|
+
#for nRF24L01+. There is no way to programmatically tell it from
|
229
|
+
#older version, nRF24L01, but the older is practically phased out
|
230
|
+
#by Nordic, so we assume that we deal with with modern version.
|
231
|
+
|
232
|
+
# Bit 0 goes to RF_DR_HIGH, bit 1 - to RF_DR_LOW
|
233
|
+
@rf_setup = (@rf_setup & 0xD7) | ((bitrate & 0x02) << 4) | ((bitrate & 0x01) << 3);
|
234
|
+
return NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, @rf_setup);
|
235
|
+
end
|
236
|
+
|
237
|
+
# Power setting is 0..3 for nRF24L01
|
238
|
+
def setPower(nrf_power)
|
239
|
+
if (nrf_power < 0) or (nrf_power > 3) then
|
240
|
+
raise "NRF setPower, wrong must be between 0 and 3"
|
241
|
+
end
|
242
|
+
@rf_setup = (@rf_setup & 0xF9) | ((nrf_power & 0x03) << 1)
|
243
|
+
return NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, @rf_setup)
|
244
|
+
end
|
245
|
+
|
246
|
+
def CE_lo
|
247
|
+
@spi.pulse = 0
|
248
|
+
end
|
249
|
+
|
250
|
+
def CE_hi
|
251
|
+
@spi.pulse = 1
|
252
|
+
end
|
253
|
+
|
254
|
+
def NRF24L01_SetTxRxMode(mode)
|
255
|
+
if(mode == TX_EN) then
|
256
|
+
CE_lo()
|
257
|
+
#sleep(0.5)
|
258
|
+
NRF24L01_WriteReg(NRF24L01_07_STATUS, (1 << NRF24L01_07_RX_DR) | (1 << NRF24L01_07_TX_DS) | (1 << NRF24L01_07_MAX_RT)) #reset the flag(s)
|
259
|
+
NRF24L01_WriteReg(NRF24L01_00_CONFIG, (1 << NRF24L01_00_EN_CRC)| (1 << NRF24L01_00_CRCO) | (1 << NRF24L01_00_PWR_UP)) #switch to TX mode
|
260
|
+
#sleep(0.5)
|
261
|
+
CE_hi()
|
262
|
+
elsif (mode == RX_EN) then
|
263
|
+
CE_lo()
|
264
|
+
# sleep(0.5)
|
265
|
+
NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70) # reset the flag(s)
|
266
|
+
NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x0F) # switch to RX mode
|
267
|
+
NRF24L01_WriteReg(NRF24L01_07_STATUS, (1 << NRF24L01_07_RX_DR) | (1 << NRF24L01_07_TX_DS) | (1 << NRF24L01_07_MAX_RT)) #reset the flag(s)
|
268
|
+
NRF24L01_WriteReg(NRF24L01_00_CONFIG, (1 << NRF24L01_00_EN_CRC)| (1 << NRF24L01_00_CRCO) | (1 << NRF24L01_00_PWR_UP) | (1 << NRF24L01_00_PRIM_RX)) #switch to RX mode
|
269
|
+
# sleep(0.5)
|
270
|
+
CE_hi()
|
271
|
+
else
|
272
|
+
NRF24L01_WriteReg(NRF24L01_00_CONFIG, (1 << NRF24L01_00_EN_CRC)) #PowerDown
|
273
|
+
CE_lo()
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def reset()
|
278
|
+
NRF24L01_SetTxRxMode(TXRX_OFF)
|
279
|
+
NRF24L01_FlushTx()
|
280
|
+
NRF24L01_FlushRx()
|
281
|
+
return true
|
282
|
+
end
|
283
|
+
|
284
|
+
def Read()
|
285
|
+
tabdataread = Array.new
|
286
|
+
if dataAvailable()
|
287
|
+
NRF24L01_WriteReg(0x07,BV(HardsploitAPI_NRF24L01::NRF24L01_07_RX_DR))
|
288
|
+
tabdataread.push *readPayload(16)
|
289
|
+
return tabdataread
|
290
|
+
else
|
291
|
+
return tabdataread
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
def Send(dataSend)
|
296
|
+
NRF24L01_SetTxRxMode(TXRX_OFF)
|
297
|
+
NRF24L01_FlushTx()
|
298
|
+
NRF24L01_WritePayload(dataSend)
|
299
|
+
NRF24L01_SetTxRxMode(TX_EN)
|
300
|
+
sleep(0.1)
|
301
|
+
NRF24L01_SetTxRxMode(TXRX_OFF)
|
302
|
+
NRF24L01_FlushTx()
|
303
|
+
NRF24L01_FlushRx()
|
304
|
+
NRF24L01_SetTxRxMode(RX_EN);
|
305
|
+
end
|
306
|
+
end
|
@@ -0,0 +1,340 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#===================================================
|
3
|
+
# Hardsploit API - By Opale Security
|
4
|
+
# www.opale-security.com || www.hardsploit.io
|
5
|
+
# License: GNU General Public License v3
|
6
|
+
# License URI: http://www.gnu.org/licenses/gpl.txt
|
7
|
+
#===================================================
|
8
|
+
|
9
|
+
require_relative '../../Core/HardsploitAPI'
|
10
|
+
class HardsploitAPI_SPI
|
11
|
+
public
|
12
|
+
|
13
|
+
def initialize(speed:,mode:)
|
14
|
+
#to be sure the singleton was initialize
|
15
|
+
HardsploitAPI.instance.connect
|
16
|
+
self.speed=speed
|
17
|
+
self.mode=mode
|
18
|
+
@pulse = 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def pulse
|
22
|
+
return @pulse
|
23
|
+
end
|
24
|
+
|
25
|
+
def pulse=(pulse)
|
26
|
+
if (pulse == 0) or (pulse == 1) then
|
27
|
+
@pulse = pulse
|
28
|
+
spi_SetSettings #Send an Empty array to validate the value of pulse
|
29
|
+
else
|
30
|
+
raise HardsploitAPI::ERROR::SPIWrongPulse
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def speed
|
35
|
+
return @speed
|
36
|
+
end
|
37
|
+
|
38
|
+
def speed=(speed)
|
39
|
+
if (speed <=2) or (speed >256) then
|
40
|
+
raise HardsploitAPI::ERROR::SPIWrongSpeed
|
41
|
+
else
|
42
|
+
@speed = speed
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def mode
|
47
|
+
return @mode
|
48
|
+
end
|
49
|
+
|
50
|
+
def mode=(mode)
|
51
|
+
if ( mode < 0 ) or ( mode > 3 ) then
|
52
|
+
raise HardsploitAPI::ERROR::SPIWrongMode
|
53
|
+
else
|
54
|
+
@mode = mode
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def spi_SetSettings()
|
59
|
+
packet = Array.new
|
60
|
+
packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
|
61
|
+
packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
|
62
|
+
packet.push HardsploitAPI.lowByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
|
63
|
+
packet.push HardsploitAPI.highByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
|
64
|
+
|
65
|
+
packet.push 0x50 #Command RAW COMMUNICATION TO FPGA FIFO
|
66
|
+
|
67
|
+
packet.push (( @pulse & 1 ) << 2 ) || ( @mode & 3 ) #Add mode and the value of pin pulse
|
68
|
+
packet.push @speed #Add speed
|
69
|
+
begin
|
70
|
+
HardsploitAPI.instance.sendPacket packet
|
71
|
+
rescue
|
72
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# SPI interact
|
77
|
+
# * +payload+:: Byte array want to send
|
78
|
+
# * Return SPI data received
|
79
|
+
def spi_Interact(payload:)
|
80
|
+
if ( payload.size > 4000 ) then
|
81
|
+
raise SPIWrongPayloadSize
|
82
|
+
end
|
83
|
+
|
84
|
+
packet = Array.new
|
85
|
+
packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
|
86
|
+
packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
|
87
|
+
packet.push HardsploitAPI.lowByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
|
88
|
+
packet.push HardsploitAPI.highByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
|
89
|
+
|
90
|
+
packet.push 0x50 #Command RAW COMMUNICATION TO FPGA FIFO
|
91
|
+
packet.push (( @pulse & 1 ) << 2 ) || ( @mode & 3 ) #Add mode and the value of pin pulse
|
92
|
+
packet.push @speed #Add speed
|
93
|
+
packet.concat payload #Add data
|
94
|
+
#puts "Payload : #{payload}"
|
95
|
+
|
96
|
+
#remove header (4 bytes 2 for size 2 for type of command)
|
97
|
+
return HardsploitAPI.instance.sendAndReceiveDATA(packet, 1000).drop(4)
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
# Spi generic Import
|
102
|
+
# * +writeSpiCommand+:: The write command most of the time 0x02
|
103
|
+
# * +startAddress+:: Start address (included)
|
104
|
+
# * +pageSize+:: Size of page
|
105
|
+
# * +memorySize+:: Size max of memory in byte (important, to calculate automatically the number of byte to set address)
|
106
|
+
# * +saveFile+:: File contain data
|
107
|
+
# * +writePageLatency+:: Time to wait after each pages written
|
108
|
+
# * +enableWriteSpiCommand+:: Enable write commad most of the time 0x06
|
109
|
+
# * +clearSpiCommand+:: Bulk erase command most of the time 0x60 chip eraseTime
|
110
|
+
# * +clearChipTime+:: Time to erase entire the memory (bulk erase) in case of flash memory, 240 seconds for a 512Mb spansion memory and 13 seconds for a 16Mb Micron memory, see the datasheet
|
111
|
+
# * +isFLASH+:: True if it is a Flash memory (add clear content)
|
112
|
+
def spi_Generic_Import (startAddress:,pageSize:,memorySize:,dataFile:,writeSpiCommand:,writePageLatency:,enableWriteSpiCommand:,clearSpiCommand:,clearChipTime:,isFLASH:)
|
113
|
+
#Start time
|
114
|
+
startTime = Time.now
|
115
|
+
|
116
|
+
file = File.open(dataFile, 'rb')
|
117
|
+
sizeFile = file.size
|
118
|
+
|
119
|
+
if (( startAddress < 0 ) or ( startAddress > memorySize - 1 )) then
|
120
|
+
raise Error::WrongStartAddress
|
121
|
+
end
|
122
|
+
|
123
|
+
if (( pageSize <= 0 ) and ( pageSize > 2048 )) then
|
124
|
+
raise TypeError, "pageSize need to be greater than 0 and less than 2048"
|
125
|
+
end
|
126
|
+
|
127
|
+
numberOfByteAddress = ((( Math.log( memorySize - 1, 2 )).floor + 1 ) / 8.0 ).ceil
|
128
|
+
if numberOfByteAddress > 4 then
|
129
|
+
raise TypeError, "Size max must be less than 2^32 about 4Gb"
|
130
|
+
end
|
131
|
+
|
132
|
+
if numberOfByteAddress <= 0 then
|
133
|
+
raise TypeError, "There is an issue with calculating of number of byte needed"
|
134
|
+
end
|
135
|
+
|
136
|
+
#if flash memory we need to erase it before and wait enought
|
137
|
+
#time (erase cycle time in datasheet) or polling status register
|
138
|
+
if isFLASH then
|
139
|
+
spi_Interact(payload: [clearSpiCommand])
|
140
|
+
sleep(clearChipTime)
|
141
|
+
end
|
142
|
+
|
143
|
+
startTime = Time.now
|
144
|
+
packet_size = pageSize
|
145
|
+
number_complet_packet = (sizeFile / packet_size).floor
|
146
|
+
size_last_packet = sizeFile % packet_size
|
147
|
+
|
148
|
+
#SEND the first complete trame
|
149
|
+
for i in 0..number_complet_packet - 1 do
|
150
|
+
#Enable write latch
|
151
|
+
spi_Interact(payload: [enableWriteSpiCommand])
|
152
|
+
packet = generate_spi_write_command(
|
153
|
+
numberOfByteAddress: numberOfByteAddress,
|
154
|
+
writeSpiCommand: writeSpiCommand,
|
155
|
+
startAddress: i * packet_size + startAddress,
|
156
|
+
data: file.read(packet_size).unpack("C*")
|
157
|
+
)
|
158
|
+
|
159
|
+
temp = spi_Interact( payload: packet )
|
160
|
+
#Remove header, result of read command and numberOfByte Address too
|
161
|
+
unless packet.size == temp.size then
|
162
|
+
raise HardsploitAPI::SpiError
|
163
|
+
end
|
164
|
+
|
165
|
+
HardsploitAPI.instance.consoleProgress(
|
166
|
+
percent: 100 * ( i + 1 ) / ( number_complet_packet + ( size_last_packet.zero? ? 0 : 1 ) ),
|
167
|
+
startTime:startTime,
|
168
|
+
endTime: Time.new
|
169
|
+
)
|
170
|
+
#if too many error when write increase because we need to wait to write a full page
|
171
|
+
sleep(writePageLatency)
|
172
|
+
end
|
173
|
+
|
174
|
+
if( size_last_packet > 0 )then
|
175
|
+
#Enable write latch
|
176
|
+
spi_Interact( payload: [enableWriteSpiCommand] )
|
177
|
+
packet = generate_spi_write_command(
|
178
|
+
numberOfByteAddress: numberOfByteAddress,
|
179
|
+
writeSpiCommand: writeSpiCommand,
|
180
|
+
startAddress: number_complet_packet * packet_size + startAddress,
|
181
|
+
data: file.read(size_last_packet).unpack("C*")
|
182
|
+
)
|
183
|
+
temp = spi_Interact( payload: packet )
|
184
|
+
#Remove header, result of write command and numberOfByte Address too
|
185
|
+
unless packet.size == temp.size then
|
186
|
+
raise HardsploitAPI::SpiError
|
187
|
+
end
|
188
|
+
|
189
|
+
#Send 100% in case of last packet
|
190
|
+
HardsploitAPI.instance.consoleProgress(
|
191
|
+
percent: 100,
|
192
|
+
startTime: startTime,
|
193
|
+
endTime: Time.now
|
194
|
+
)
|
195
|
+
end
|
196
|
+
delta = Time.now - startTime
|
197
|
+
HardsploitAPI.instance.consoleSpeed "Write in #{delta.round(4)} sec"
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
# Spi generic dump
|
202
|
+
# * +readSpiCommand+:: The read command
|
203
|
+
# * +startAddress+:: Start address (included)
|
204
|
+
# * +stopAddress+:: Stop address (included)
|
205
|
+
# * +sizeMax+:: Size max of memory (important to calculate automaticly the number of byte to set address)
|
206
|
+
def spi_Generic_Dump (readSpiCommand:,startAddress:,stopAddress:,sizeMax:)
|
207
|
+
if (( startAddress < 0 ) or ( startAddress > sizeMax - 1 )) then
|
208
|
+
raise TypeError, "Start address can't be negative and not more than size max - 1"
|
209
|
+
end
|
210
|
+
|
211
|
+
if (( stopAddress < 0 ) or ( stopAddress > ( sizeMax - 1 ))) then
|
212
|
+
raise TypeError, "Stop address can't be negative and not more than size max-1 because start at 0"
|
213
|
+
end
|
214
|
+
|
215
|
+
if ( stopAddress < startAddress ) then
|
216
|
+
raise TypeError, "Stop address need to be greater than start address"
|
217
|
+
end
|
218
|
+
|
219
|
+
numberOfByteAddress = ((( Math.log( sizeMax - 1, 2 )).floor + 1) / 8.0 ).ceil
|
220
|
+
if numberOfByteAddress > 4 then
|
221
|
+
raise TypeError, "Size max must be less than 2^32 about 4Gb"
|
222
|
+
end
|
223
|
+
|
224
|
+
if numberOfByteAddress <= 0 then
|
225
|
+
raise TypeError, "There is an issue with calculating of number of byte needed"
|
226
|
+
end
|
227
|
+
|
228
|
+
#Start time
|
229
|
+
startTime = Time.now
|
230
|
+
packet_size = 4000 - numberOfByteAddress - 1
|
231
|
+
number_complet_packet = (( stopAddress - startAddress + 1 ) / packet_size ).floor
|
232
|
+
size_last_packet = ( stopAddress - startAddress + 1 ) % packet_size
|
233
|
+
|
234
|
+
#SEND the first complete trame
|
235
|
+
for i in 0..number_complet_packet - 1 do
|
236
|
+
packet = generate_spi_read_command(
|
237
|
+
numberOfByteAddress: numberOfByteAddress,
|
238
|
+
readSpiCommand: readSpiCommand,
|
239
|
+
startAddress: i * packet_size + startAddress,
|
240
|
+
size: packet_size
|
241
|
+
)
|
242
|
+
begin
|
243
|
+
temp = spi_Interact( payload: packet )
|
244
|
+
rescue
|
245
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
246
|
+
end
|
247
|
+
#Remove header, result of read command and numberOfByte Address too
|
248
|
+
#puts "receive real size #{temp.size}"
|
249
|
+
HardsploitAPI.instance.consoleData temp.drop( numberOfByteAddress + 1 )
|
250
|
+
HardsploitAPI.instance.consoleProgress(
|
251
|
+
percent: 100 * ( i + 1 ) / ( number_complet_packet + ( size_last_packet.zero? ? 0 : 1 )),
|
252
|
+
startTime: startTime,
|
253
|
+
endTime: Time.new
|
254
|
+
)
|
255
|
+
end
|
256
|
+
|
257
|
+
if( size_last_packet > 0 ) then
|
258
|
+
packet = generate_spi_read_command(
|
259
|
+
numberOfByteAddress: numberOfByteAddress,
|
260
|
+
readSpiCommand: readSpiCommand,
|
261
|
+
startAddress: number_complet_packet * packet_size + startAddress,
|
262
|
+
size: size_last_packet
|
263
|
+
)
|
264
|
+
temp = spi_Interact( payload: packet )
|
265
|
+
#Remove header, result of read command and numberOfByte Address too
|
266
|
+
HardsploitAPI.instance.consoleData temp.drop( numberOfByteAddress + 1 )
|
267
|
+
begin
|
268
|
+
HardsploitAPI.instance.consoleProgress(
|
269
|
+
percent: 100,
|
270
|
+
startTime: startTime,
|
271
|
+
endTime: Time.now
|
272
|
+
)
|
273
|
+
rescue
|
274
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
275
|
+
end
|
276
|
+
end
|
277
|
+
delta = Time.now - startTime
|
278
|
+
HardsploitAPI.instance.consoleSpeed "Write in #{delta.round(4)} sec"
|
279
|
+
end
|
280
|
+
|
281
|
+
protected
|
282
|
+
def generate_spi_read_command (numberOfByteAddress:,readSpiCommand:,startAddress:,size:)
|
283
|
+
packet = Array.new
|
284
|
+
packet.push readSpiCommand
|
285
|
+
case numberOfByteAddress
|
286
|
+
when 1
|
287
|
+
packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
|
288
|
+
when 2
|
289
|
+
packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
|
290
|
+
packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
|
291
|
+
when 3
|
292
|
+
packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
|
293
|
+
packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
|
294
|
+
packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
|
295
|
+
when 4
|
296
|
+
packet.push ((startAddress & 0xFF000000) >> 24 ) #AddStart3
|
297
|
+
packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
|
298
|
+
packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
|
299
|
+
packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
|
300
|
+
else
|
301
|
+
raise TypeError, "Issue in generate_spi_read_command function when parse number of byte address"
|
302
|
+
end
|
303
|
+
|
304
|
+
#put N dummy byte to read size data
|
305
|
+
packet.push *Array.new(size, 0)
|
306
|
+
if packet.size > 4000 then
|
307
|
+
raise TypeError, "Too many byte to send in spi mode not more than 4000 is needed"
|
308
|
+
end
|
309
|
+
return packet
|
310
|
+
end
|
311
|
+
|
312
|
+
def generate_spi_write_command (numberOfByteAddress:,writeSpiCommand:,startAddress:,data:)
|
313
|
+
packet = Array.new
|
314
|
+
packet.push writeSpiCommand
|
315
|
+
case numberOfByteAddress
|
316
|
+
when 1
|
317
|
+
packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
|
318
|
+
when 2
|
319
|
+
packet.push (( startAddress & 0x0000FF00) >> 8 ) #AddStart1
|
320
|
+
packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
|
321
|
+
when 3
|
322
|
+
packet.push (( startAddress & 0x00FF0000) >> 16 ) #AddStart2
|
323
|
+
packet.push (( startAddress & 0x0000FF00) >> 8 ) #AddStart1
|
324
|
+
packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
|
325
|
+
when 4
|
326
|
+
packet.push (( startAddress & 0xFF000000) >> 24 ) #AddStart3
|
327
|
+
packet.push (( startAddress & 0x00FF0000) >> 16 ) #AddStart2
|
328
|
+
packet.push (( startAddress & 0x0000FF00) >> 8 ) #AddStart1
|
329
|
+
packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
|
330
|
+
else
|
331
|
+
raise TypeError, "Issue in generate_spi_write_command function when parse number of byte address"
|
332
|
+
end
|
333
|
+
#Push data to write
|
334
|
+
packet.push *data
|
335
|
+
if packet.size > 4000 then
|
336
|
+
raise TypeError, "Too many byte to send in spi mode not more than 4000 is needed"
|
337
|
+
end
|
338
|
+
return packet
|
339
|
+
end
|
340
|
+
end
|