81 lines
2.3 KiB
Lua
81 lines
2.3 KiB
Lua
local gpio, bit = gpio, bit --luacheck: read globals gpio bit
|
|
|
|
return function(bus_args)
|
|
local rs = bus_args.rs or 0
|
|
local rw = bus_args.rw
|
|
local en = bus_args.en or 1
|
|
local bl = bus_args.backlight
|
|
local d0 = bus_args.d0 or 2
|
|
local d1 = bus_args.d1 or 3
|
|
local d2 = bus_args.d2 or 4
|
|
local d3 = bus_args.d3 or 5
|
|
local d4 = bus_args.d4 or 6
|
|
local d5 = bus_args.d5 or 7
|
|
local d6 = bus_args.d6 or 8
|
|
local d7 = bus_args.d7 or 9
|
|
|
|
for _, d in pairs({rs,rw,en,bl}) do
|
|
if d then
|
|
gpio.mode(d, gpio.OUTPUT)
|
|
end
|
|
end
|
|
|
|
local function setGPIO(mode)
|
|
for _, d in pairs({d0, d1, d2, d3, d4, d5, d6, d7}) do
|
|
gpio.mode(d, mode)
|
|
end
|
|
end
|
|
|
|
setGPIO(gpio.OUTPUT)
|
|
|
|
local function send8bitGPIO(value, rs_en, rw_en, read)
|
|
local function exchange(data)
|
|
local rv = 0
|
|
if rs then gpio.write(rs, rs_en and gpio.HIGH or gpio.LOW) end
|
|
if rw then gpio.write(rw, rw_en and gpio.HIGH or gpio.LOW) end
|
|
gpio.write(en, gpio.HIGH)
|
|
for i, d in ipairs({d0, d1, d2, d3, d4, d5, d6, d7}) do
|
|
if read and rw then
|
|
if gpio.read(d) == 1 then rv = bit.set(rv, i-1) end
|
|
else
|
|
gpio.write(d, bit.isset(data, i-1) and gpio.HIGH or gpio.LOW)
|
|
end
|
|
end
|
|
gpio.write(en, gpio.LOW)
|
|
return rv
|
|
end
|
|
if read then setGPIO(gpio.INPUT) end
|
|
value = exchange(value)
|
|
if read then setGPIO(gpio.OUTPUT) end
|
|
return value
|
|
end
|
|
|
|
-- Return backend object
|
|
return {
|
|
fourbits = false,
|
|
command = function (_, cmd)
|
|
return send8bitGPIO(cmd, false, false, false)
|
|
end,
|
|
busy = function(_)
|
|
if rw == nil then return false end
|
|
return bit.isset(send8bitGPIO(0xff, false, true, true), 7)
|
|
end,
|
|
position = function(_)
|
|
if rw == nil then return 0 end
|
|
return bit.clear(send8bitGPIO(0xff, false, true, true), 7)
|
|
end,
|
|
write = function(_, value)
|
|
return send8bitGPIO(value, true, false, false)
|
|
end,
|
|
read = function(_)
|
|
if rw == nil then return nil end
|
|
return send8bitGPIO(0xff, true, true, true)
|
|
end,
|
|
backlight = function(_, on)
|
|
if (bl) then gpio.write(bl, on and gpio.HIGH or gpio.LOW) end
|
|
return on
|
|
end,
|
|
}
|
|
|
|
end
|