forked from openLuat/LuatOS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tool.lua
215 lines (194 loc) · 5.54 KB
/
tool.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
--[[
(
for wsl:
sudo apt update
sudo apt install qemu-user-static
sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
sudo service binfmt-support start
)
install:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install lua5.3:i386
sudo apt-get install lua5.1
sudo apt-get install luarocks
sudo luarocks install rs232
sudo luarocks install bit32
ps, proxy (for luarocks):
export https_proxy=http://127.0.0.1:1080
export http_proxy=http://127.0.0.1:1080
]]
local help = [[
usage:
download script files:
lua5.1 tool.lua /dev/ttyS8 -d file1 file2 ...
read serial port data:
lua5.1 tool.lua /dev/ttyS8 -r
serial port data after download:
lua5.1 tool.lua /dev/ttyS8 -r -d file1 file2 ...
]]
if #arg < 2 then
print(help)
return
end
local rs232 = require "rs232"
local bit = require "bit32"
local p, e = rs232.port(arg[1],{
baud = '_115200';
data_bits = '_8';
parity = 'NONE';
stop_bits = '_1';
flow_control = 'OFF';
rts = 'OFF';
})
p:open()
local download,readUart
local files = {}--要下载进去的文件路径
for i=2,#arg do
if arg[i] == "-d" then
download = true
elseif arg[i] == "-r" then
readUart = true
else
table.insert(files,arg[i])
end
end
--各种要用到的函数
--按位取反,1字节
local function bnot(n)
local r = 0
for i=1,8 do
local b = bit.rshift(n, 8-i) % 2
b = b == 1 and 0 or 1
r = r + bit.lshift(b, 8-i)
end
return r
end
--计算crc
local function calcrc(s)
local crc = 0
for i=1,s:len() do
crc = bit.bxor(crc, bit.lshift(s:byte(i), 8))
for j=1,8 do
if crc >= 0x8000 then
crc = bit.bxor((bit.lshift(crc, 1) % 0x10000), 0x1021)
else
crc = bit.lshift(crc, 1) % 0x10000
end
end
crc = crc % 0x10000
end
return math.floor(crc/0x100),crc%0x100
end
local SOH = 0x01
local STX = 0x02
local EOT = 0x04
local ACK = 0x06
local NAK = 0x15
local CAN = 0x18
--xmodem传头
local function xmodem(data,n)
local data = data..
string.rep(string.char(0),
128-data:len())
return string.char(SOH,n,bnot(n))..
data..
string.char(calcrc(data))
end
--ymodem传文件
local function ymodem(data,n)
local data = data..
string.rep(string.char(0x1a),
1024-data:len())
return string.char(STX,n,bnot(n))..
data..
string.char(calcrc(data))
end
--取文件名
local function getName(s)
s = s:gsub("\\","/")
return s:match(".+/(.+)") or s:match(".+\\(.+)") or s
end
--发某个数据包
local function sendData(s)
while true do
p:write(s)
while true do
local d = p:read(10,5000)
--print(d:byte(),d:len(),d)
if d:byte() == ACK or d:find("C") then return true end--收到了
if d:byte() == NAK then break end--没收到,再发一遍
if d:len() == 0 then return end
end
end
end
if download then
print("clear all files, if not response, please restart device")
while true do
p:write("reinit\r\n")
local d = p:read(10,1000)
if d:find("reinit") then break end
end
print("send ry")
p:write("ry\r\n")
print("waitting for reply...")
for i=1,100 do
local d = p:read(10,1000)
if d:find("C") then
print("connect ok!")
break
end
end
print("start download")
for i=1,#files do
--编译
if files[i]:sub(-4,-1):upper() == ".LUA" then
local r = files[i]:sub(1,-4).."luac"
print(r)
os.execute("luac5.3 -o \""..r.."\" -s \""..files[i].."\"")
files[i] = r
end
local f,e = io.open(files[i],"r")
if not f then--打开文件失败
print("file open failed, stop download.",files[i],e)
return
end
local data = f:read("*a") --读取整个文件,以便获取大小
local name = getName(files[i])
print("downloading "..name)
--发送文件名
if not sendData(xmodem(name..string.char(0)..tostring(data:len()),0)) then
print("send file name fail") return
end
local p,pack = 1,1
while true do
local d = data:sub(p,p+1023)
if d:len() == 0 then break end--读完了
p = p + 1024
print((p > data:len() and data:len() or p).."/"..data:len())
local sd = ymodem(d,pack)
--print(sd:toHex(),pack)
if not sendData(sd) then
print("send file fail") return
end
pack = pack + 1
end
print("trans end")
if not sendData(string.char(0x04)) then--结束该文件
print("end file fail") return
end
end
if not sendData(xmodem("",0)) then--结束
print("last packet fail") return
end
print("all done, reboot")
p:write("ls\r\n")
p:write("reboot\r\n")
end
if readUart then
print("press ctrl+c to kill this tool")
while true do
io.write(p:read(1000, 100))
end
end
p:close()