Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/lib/support/lib/comms_usb.lua
blob: 91d64b56c34fd1feb5ef11dacbcdab497de6ba9b (plain)
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
--module(..., package.seeall);

local bobot_baseboard = require("bobot_baseboard")
local bobot = require("bobot")

local my_path = debug.getinfo(1, "S").source:match[[^@?(.*[\/])[^\/]-$]]
assert(package.loadlib(my_path .. "libluausb.so","luaopen_libusb"))()
local libusb=_G.libusb; _G.libusb=nil

local usb_bulk_write = libusb.bulk_write
local usb_bulk_read = libusb.bulk_read

local USB4ALL_VENDOR        = 0x04d8
local USB4ALL_PRODUCT       = 0x000c
local USB4ALL_CONFIGURATION = 1
local USB4ALL_INTERFACE     = 0

local READ_HEADER_SIZE      = 3

local libusb_handler 


local comms_usb = {}

function comms_usb.send(endpoint, data, timeout)
	--parameters sanity check
	assert(type(libusb_handler)=="userdata")
	assert(type(endpoint)=="number")
	assert(type(data)=="string")
	assert(type(timeout)=="number")

	return usb_bulk_write(libusb_handler, endpoint, data, timeout)
end

function comms_usb.read(endpoint, len, timeout)
	--parameters sanity check
	assert(type(libusb_handler)=="userdata")
	assert(type(endpoint)=="number")
	assert(type(len)=="number")
	assert(type(timeout)=="number")

	return usb_bulk_read(libusb_handler, endpoint, len+READ_HEADER_SIZE, timeout)
end


function comms_usb.init(baseboards)
	--parameters sanity check
	assert(type(baseboards)=="table")


	--refresh devices and buses
	libusb.find_busses()
	libusb.find_devices()
	local n_boards = 0

	local buses=libusb.get_busses()
	for dirname, bus in pairs(buses) do 			--iterate buses
		local devices=libusb.get_devices(bus)
		for filename, device in pairs(devices) do	--iterate devices
			local descriptor = libusb.device_descriptor(device)

			--if device is baseboard...
			if ((descriptor.idVendor == USB4ALL_VENDOR) and (descriptor.idProduct == USB4ALL_PRODUCT)) then
				--try to intialize baseboard
				bobot.debugprint("Initializing Baseboard:", descriptor.idVendor, descriptor.idProduct)
				libusb_handler = libusb.open(device)

				if not libusb_handler then
					bobot.debugprint("Error opening device")
					break
				end				
				if not libusb.set_configuration(libusb_handler, USB4ALL_CONFIGURATION) then
					bobot.debugprint("Error configuring device, retrying after a reset")
					libusb.reset(libusb_handler)				
					if not libusb.set_configuration(libusb_handler, USB4ALL_CONFIGURATION) then
						bobot.debugprint("Error configuring device.")
						break
					end
				end
				if not libusb.claim_interface(libusb_handler, USB4ALL_INTERFACE) then
					bobot.debugprint("Error seting device interface")
					break
				end

				--success initializing, instantiate BaseBoard object and register
				local iSerial=descriptor.iSerialNumber
				local bb = bobot_baseboard:new({idBoard=iSerial, comms=comms_usb})
				--bb:force_close_all()
				--bobot.debugprint("Baseboard:", iSerial)

				baseboards[#baseboards+1]=bb
				n_boards = n_boards + 1
			end
		end
	end
	return n_boards 
end

return comms_usb