mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-31 18:38:10 +00:00 
			
		
		
		
	realtek: add feed
This adds the feed holding the realtek target specific packages. Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
		
							
								
								
									
										29
									
								
								feeds/realtek/rtl83xx-poe/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								feeds/realtek/rtl83xx-poe/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
|  | PKG_NAME:=rtl83xx-poe | ||||||
|  | PKG_RELEASE:=2 | ||||||
|  |  | ||||||
|  | PKG_LICENSE:=GPL-2.0+ | ||||||
|  |  | ||||||
|  | include $(INCLUDE_DIR)/package.mk | ||||||
|  |  | ||||||
|  | define Package/rtl83xx-poe | ||||||
|  |   SECTION:=utils | ||||||
|  |   CATEGORY:=Utilities | ||||||
|  |   DEPENDS:=+libubox-lua +libubus-lua +libuci-lua +lua-rs232 | ||||||
|  |   TITLE:=PoE daemon for realtek switches | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Package/rtl83xx-poe/description | ||||||
|  |  This package contains an utility to allow triggering the PoE state of realtek switch ports. | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Build/Compile | ||||||
|  |  | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Package/rtl83xx-poe/install | ||||||
|  | 	$(CP) ./files/* $(1)/ | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | $(eval $(call BuildPackage,rtl83xx-poe)) | ||||||
							
								
								
									
										316
									
								
								feeds/realtek/rtl83xx-poe/files/bin/poe.lua
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										316
									
								
								feeds/realtek/rtl83xx-poe/files/bin/poe.lua
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,316 @@ | |||||||
|  | #!/usr/bin/lua | ||||||
|  | local rs = require "luars232" | ||||||
|  |  | ||||||
|  | port_name = "/dev/ttyS1" | ||||||
|  | out = io.stderr | ||||||
|  | nseq = 0 | ||||||
|  |  | ||||||
|  | budget = 65.0 | ||||||
|  | port_power = {0, 0, 0, 0, 0, 0, 0, 0 } | ||||||
|  |  | ||||||
|  | if arg[1] ~= nil then | ||||||
|  | 	budget = tonumber(arg[1]) | ||||||
|  | end | ||||||
|  | for i = 1, 8 do | ||||||
|  | 	port_power[i] = arg[i + 1] | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function initSerial(p) | ||||||
|  | 	local e, p = rs.open(p) | ||||||
|  | 	if e ~= rs.RS232_ERR_NOERROR then | ||||||
|  | 		-- handle error | ||||||
|  | 		out:write(string.format("can't open serial port '%s', error: '%s'\n", | ||||||
|  | 				port_name, rs.error_tostring(e))) | ||||||
|  | 		return | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	assert(p:set_baud_rate(rs.RS232_BAUD_19200) == rs.RS232_ERR_NOERROR) | ||||||
|  | 	assert(p:set_data_bits(rs.RS232_DATA_8) == rs.RS232_ERR_NOERROR) | ||||||
|  | 	assert(p:set_parity(rs.RS232_PARITY_NONE) == rs.RS232_ERR_NOERROR) | ||||||
|  | 	assert(p:set_stop_bits(rs.RS232_STOP_1) == rs.RS232_ERR_NOERROR) | ||||||
|  | 	assert(p:set_flow_control(rs.RS232_FLOW_OFF)  == rs.RS232_ERR_NOERROR) | ||||||
|  |  | ||||||
|  | 	out:write(string.format("OK, port open with values '%s'\n", tostring(p))) | ||||||
|  |  | ||||||
|  | 	return p | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function receive(pCon) | ||||||
|  | 	local reply = {} | ||||||
|  | 	local retries = 0 | ||||||
|  |  | ||||||
|  | 	while table.getn(reply) < 12 and retries < 4 do | ||||||
|  | 		-- Read up to 12 byte response, timeout 400ms | ||||||
|  | 		err, data_read, size = pCon:read(12, 400) | ||||||
|  | 		assert(err == rs.RS232_ERR_NOERROR) | ||||||
|  | --		io.write(string.format("-> [%2d]:", string.len(data_read))) | ||||||
|  | 		for i = 1, string.len(data_read) do | ||||||
|  | 			table.insert(reply, string.byte(string.sub(data_read, i, i))) | ||||||
|  | --			io.write(string.format(" %02x", reply[i])) | ||||||
|  | 		end | ||||||
|  | --		io.write("\n") | ||||||
|  | 		retries = retries + 1 | ||||||
|  | 	end | ||||||
|  | 	if table.getn(reply) ~= 12 then | ||||||
|  | 		print ("Unexpected length!") | ||||||
|  | 		return(nil) | ||||||
|  | 	end | ||||||
|  | 	local sum = 0 | ||||||
|  | 	for i = 1, 11 do | ||||||
|  | 		sum = sum + reply[i] | ||||||
|  | 	end | ||||||
|  | 	if sum % 256 ~= reply[12] then | ||||||
|  | 		print ("Checksum error!") | ||||||
|  | 		return(nil) | ||||||
|  | 	end | ||||||
|  | 	return(reply) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function sendCommand(pCon, cmd) | ||||||
|  | 	nseq = nseq + 1 | ||||||
|  | 	cmd[2] = nseq % 256 | ||||||
|  |  | ||||||
|  | 	while table.getn(cmd) < 11 do | ||||||
|  | 		table.insert(cmd, 0xff) | ||||||
|  | 	end | ||||||
|  | 	local c_string = "" | ||||||
|  | 	local sum = 0 | ||||||
|  | --	io.write("send  ") | ||||||
|  | 	for i = 1, 11 do | ||||||
|  | 		sum = sum + cmd[i] | ||||||
|  | --		io.write(string.format(" %02x", cmd[i])) | ||||||
|  | 		c_string = c_string .. string.char(cmd[i]) | ||||||
|  | 	end | ||||||
|  | --	io.write(string.format(" %02x\n", sum % 256)) | ||||||
|  | 	c_string = c_string .. string.char(sum % 256) | ||||||
|  | 	err, len_written = pCon:write(c_string) | ||||||
|  | 	assert(err == rs.RS232_ERR_NOERROR) | ||||||
|  |  | ||||||
|  | 	local reply = receive(pCon) | ||||||
|  | 	if reply then | ||||||
|  | --		io.write("recv  ") | ||||||
|  | --		dumpReply(reply) | ||||||
|  | 		if (reply[1] == cmd[1] and reply[2] == cmd[2]) then | ||||||
|  | 			return(reply) | ||||||
|  | 		else | ||||||
|  | 			if reply[1] == 0xfd then | ||||||
|  | 				print ("An incomplete request was received!") | ||||||
|  | 			elseif reply[1] == 0xfe then | ||||||
|  | 				print ("Request frame checksum was incorrect!") | ||||||
|  | 			elseif reply[1] == 0xff then | ||||||
|  | 				print ("Controller was not ready to respond !") | ||||||
|  | 			else | ||||||
|  | 				print ("Sequence number mismatch!") | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 	else | ||||||
|  | 		print ("Missing reply!") | ||||||
|  | 	end | ||||||
|  | 	return(nil) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function dumpReply(reply) | ||||||
|  | 	for i,v in ipairs(reply) do | ||||||
|  | 		io.write(string.format(" %02x", v)) | ||||||
|  | 	end | ||||||
|  | 	io.write("\n"); | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function getStatus(pCon) | ||||||
|  | 	local cmd = {0x20, 0x01} | ||||||
|  | 	local reply = sendCommand(pCon, cmd) | ||||||
|  | 	if not reply then return(nil) end | ||||||
|  | 	-- returns status, PoEExtVersion, PoEVersion, state2 | ||||||
|  | 	return({reply[5], reply[6], reply[7], reply[10]}) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function disablePort(pCon, port) | ||||||
|  | 	local cmd = {0x00, port, port, 0x00} | ||||||
|  | 	-- disable command is always sent twice | ||||||
|  | 	sendCommand(pCon, cmd) | ||||||
|  | 	sendCommand(pCon, cmd) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function enablePort(pCon, port) | ||||||
|  | 	local cmd = {0x00, port, port, 0x01} | ||||||
|  | 	sendCommand(pCon, cmd) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function setPortRelPrio(pCon, port, prio) | ||||||
|  | 	local cmd = {0x1d, 0x00, port, prio} | ||||||
|  | 	sendCommand(pCon, cmd) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function setGlobalPowerBudget(pCon, maxPower, guard) | ||||||
|  | 	-- maxPower and guard Watts | ||||||
|  | 	local cmd = {0x18, 0x01, 0x00} | ||||||
|  | 	table.insert(cmd, math.floor(maxPower * 10 / 256)) | ||||||
|  | 	table.insert(cmd, math.floor(maxPower * 10) % 256) | ||||||
|  | 	table.insert(cmd, math.floor(guard * 10 / 256)) | ||||||
|  | 	table.insert(cmd, math.floor(guard * 10) % 256) | ||||||
|  | 	sendCommand(pCon, cmd) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function setPowerLowAction(pCon, disableNext) | ||||||
|  | 	local cmd = {0x17, 0x00} | ||||||
|  | 	if disableNext then | ||||||
|  | 		table.insert(cmd, 0x04) | ||||||
|  | 	else | ||||||
|  | 		table.insert(cmd, 0x02) | ||||||
|  | 	end | ||||||
|  | 	sendCommand(pCon, cmd) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function getPowerStat(pCon) | ||||||
|  | 	local cmd = {0x23, 0x01} | ||||||
|  | 	local reply = sendCommand(pCon, cmd) | ||||||
|  | 	if not reply then return(nil) end | ||||||
|  | 	local watts = (reply[3] * 256 + reply[4]) / 10.0 | ||||||
|  | 	return watts | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function getPortPower(pCon, port) | ||||||
|  | 	local cmd = {0x30, 0x01, port} | ||||||
|  | 	local reply = sendCommand(pCon, cmd) | ||||||
|  | 	if not reply then return(nil) end | ||||||
|  | 	local watts = (reply[10] * 256 + reply[11]) / 10.0 | ||||||
|  | 	local mamps = reply[6] * 256 + reply[7] | ||||||
|  | 	return({watts, mamps}) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function getPortOverview(pCon) | ||||||
|  | 	local cmd = {0x2a, 0x01, 0x00} | ||||||
|  | 	local reply = sendCommand(pCon, cmd) | ||||||
|  | 	if not reply then return(nil) end | ||||||
|  | 	local s = { } | ||||||
|  | 	for i = 4, 11 do | ||||||
|  | 		if reply[i] == 0x10 then | ||||||
|  | 			s[i-3] = "off" | ||||||
|  | 		elseif reply[i] == 0x11 then | ||||||
|  | 			s[i-3] = "enabled" | ||||||
|  | 		elseif reply[i] > 0x11 then | ||||||
|  | 			s[i-3] = "active" | ||||||
|  | 		else | ||||||
|  | 			s[i-3] = "unknown" | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	return(s) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | -- Priority for power: 3: High, 2: Normal, 1: Low? | ||||||
|  | function setPortPriority(pCon, port, prio) | ||||||
|  | 	local cmd = {0x1a, port, port, prio} | ||||||
|  | 	local reply = sendCommand(pCon, cmd) | ||||||
|  | 	if not reply then return(nil) end | ||||||
|  | 	return(unpack(reply, 4, 11)) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function getPortPowerLimits(pCon, port) | ||||||
|  | 	local cmd = {0x26, 0x01, port} | ||||||
|  | 	local reply = sendCommand(pCon, cmd) | ||||||
|  | 	if not reply then return(nil) end | ||||||
|  | 	return(reply) | ||||||
|  | end | ||||||
|  |  | ||||||
|  | function startupPoE(pCon) | ||||||
|  | 	local reply = nil | ||||||
|  | 	reply = getStatus(pCon) | ||||||
|  |  | ||||||
|  | 	setGlobalPowerBudget(pCon, 0, 0) | ||||||
|  | 	setPowerLowAction(pCon, nil) | ||||||
|  | 	-- do something unknown | ||||||
|  | 	sendCommand(pCon, {0x06, 0x00, 0x01}) | ||||||
|  | 	for i = 0, 7 do | ||||||
|  | 		if port_power[i + 1] ~= "1" then | ||||||
|  | 			disablePort(pCon, i) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	-- do something unknown | ||||||
|  | 	sendCommand(pCon, {0x02, 0x00, 0x01}) | ||||||
|  |  | ||||||
|  | 	for i = 0, 7 do | ||||||
|  | 		if port_power[i + 1] ~= "1" then | ||||||
|  | 			disablePort(pCon, i) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	-- do something unknown | ||||||
|  | 	sendCommand(pCon, {0x02, 0x00, 0x01}) | ||||||
|  |  | ||||||
|  | 	-- use monitor command 25 | ||||||
|  | 	sendCommand(pCon, {0x25, 0x01}) | ||||||
|  |  | ||||||
|  | 	setGlobalPowerBudget(pCon, 65.0, 7.0) | ||||||
|  | 	getPowerStat(pCon) | ||||||
|  | 	-- -> 23 01 00 00 02 44 00 02 ff ff 00 6a | ||||||
|  |  | ||||||
|  | 	-- Set 4 unknown port properties: | ||||||
|  | 	for i = 0, 7 do | ||||||
|  | 		sendCommand(pCon, {0x11, i, i, 0x01}) | ||||||
|  | 		sendCommand(pCon, {0x13, i, i, 0x02}) | ||||||
|  | 		sendCommand(pCon, {0x15, i, i, 0x01}) | ||||||
|  | 		sendCommand(pCon, {0x10, i, i, 0x03}) | ||||||
|  | 	end | ||||||
|  | 	for i = 0, 7 do | ||||||
|  | 		if port_power[i + 1] == "1" then | ||||||
|  | 			enablePort(pCon, i) | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | end | ||||||
|  |  | ||||||
|  | local p = initSerial(port_name) | ||||||
|  | startupPoE(p) | ||||||
|  |  | ||||||
|  | require "ubus" | ||||||
|  | require "uloop" | ||||||
|  |  | ||||||
|  | uloop.init() | ||||||
|  |  | ||||||
|  | local conn = ubus.connect() | ||||||
|  | if not conn then | ||||||
|  |         error("Failed to connect to ubus") | ||||||
|  | end | ||||||
|  |  | ||||||
|  | local my_method = { | ||||||
|  | 	poe = { | ||||||
|  | 		info = { | ||||||
|  | 			function(req, msg) | ||||||
|  | 				local reply = {} | ||||||
|  |  | ||||||
|  | 				reply.power_consumption = tostring(getPowerStat(p)).."W" | ||||||
|  | 				reply.power_budget = tostring(budget).."W" | ||||||
|  |  | ||||||
|  | 				reply.ports = {} | ||||||
|  | 				local s = getPortOverview(p) | ||||||
|  | 				for i = 1, 8 do | ||||||
|  | 					if s[i] == "active" then | ||||||
|  | 						local r = getPortPower(p, i - 1) | ||||||
|  | 						reply.ports[i] = tostring(r[1]).."W" | ||||||
|  | 					else | ||||||
|  | 						reply.ports[i] = s[i] | ||||||
|  | 					end | ||||||
|  | 				end | ||||||
|  | 				conn:reply(req, reply); | ||||||
|  | 			end, {} | ||||||
|  | 		}, | ||||||
|  | 		port = { | ||||||
|  | 			function(req, msg) | ||||||
|  | 				local reply = {} | ||||||
|  | 				if msg.port < 1 or msg.port > 8 then | ||||||
|  | 					conn:reply(req, false); | ||||||
|  | 					return -1 | ||||||
|  | 				end | ||||||
|  | 				if msg.enable == true then | ||||||
|  | 					enablePort(p, msg.port - 1) | ||||||
|  | 				else | ||||||
|  | 					disablePort(p, msg.port - 1) | ||||||
|  | 				end | ||||||
|  | 				conn:reply(req, reply); | ||||||
|  | 			end, {port = ubus.INT32, enable = ubus.BOOLEAN } | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | conn:add(my_method) | ||||||
|  |  | ||||||
|  | uloop.run() | ||||||
							
								
								
									
										10
									
								
								feeds/realtek/rtl83xx-poe/files/etc/config/poe
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								feeds/realtek/rtl83xx-poe/files/etc/config/poe
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | config poe poe | ||||||
|  | 	option budget	65 | ||||||
|  | 	option port1	0 | ||||||
|  | 	option port2	0 | ||||||
|  | 	option port3	0 | ||||||
|  | 	option port4	0 | ||||||
|  | 	option port5	0 | ||||||
|  | 	option port6	0 | ||||||
|  | 	option port7	0 | ||||||
|  | 	option port8	0 | ||||||
							
								
								
									
										24
									
								
								feeds/realtek/rtl83xx-poe/files/etc/init.d/poe
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								feeds/realtek/rtl83xx-poe/files/etc/init.d/poe
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | #!/bin/sh /etc/rc.common | ||||||
|  | START=40 | ||||||
|  |  | ||||||
|  | USE_PROCD=1 | ||||||
|  | PROG=/bin/poe.lua | ||||||
|  |  | ||||||
|  | service_triggers() { | ||||||
|  | 	procd_add_reload_trigger ucentral | ||||||
|  | } | ||||||
|  |  | ||||||
|  | start_service() { | ||||||
|  | 	[ "$(uci get poe.poe.enable)" -eq 1 ] || return 0 | ||||||
|  |  | ||||||
|  | 	local budget=$(uci get poe.poe.budget) | ||||||
|  |  | ||||||
|  | 	procd_open_instance | ||||||
|  | 	procd_set_param command "$PROG" | ||||||
|  | 	procd_append_param command ${budget:-65} | ||||||
|  | 	for p in `seq 1 8`; do | ||||||
|  | 		local pwr=$(uci get poe.poe.port$p) | ||||||
|  | 		procd_append_param command  ${pwr:-0} | ||||||
|  | 	done | ||||||
|  | 	procd_close_instance | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								feeds/realtek/rtl83xx-poe/files/etc/uci-defaults/30-poe
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								feeds/realtek/rtl83xx-poe/files/etc/uci-defaults/30-poe
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | . /lib/functions.sh | ||||||
|  |  | ||||||
|  | board=$(board_name) | ||||||
|  |  | ||||||
|  | budget=0 | ||||||
|  | case "$board" in | ||||||
|  | d-link,dgs-1210-10p) | ||||||
|  | 	budget=65 | ||||||
|  | 	;; | ||||||
|  | netgear,gs110tpp-v1|\ | ||||||
|  | zyxel,gs1900-10hp) | ||||||
|  | 	budget=130 | ||||||
|  | 	;; | ||||||
|  | *) | ||||||
|  | 	exit 0 | ||||||
|  | 	;; | ||||||
|  | esac | ||||||
|  | uci set poe.poe.enable=1 | ||||||
|  | uci set poe.poe.budget=$budget | ||||||
		Reference in New Issue
	
	Block a user
	 John Crispin
					John Crispin