PPPoU driver#
In the era of IoT, when the goal is to address every device on the Internet with IP, even on the simplest microcontroller, may face a barrier in the form of the lack of a proper interface (Ethernet, Wi-Fi) the use of uart in conjunction with an appropriate adapter, be it USB, Bluetooth or optical/infrared uart may be the easiest to connect both worlds.
Almost every microcontroller has at least one uart, and may not have Ethernet MAC, Wi-Fi or Bluetooth, but uart/serial null-modem connection is possible always and the most legitimate and proven protocol to deliver IP world is PPP.
Build and set up the device#
Before you start building Phoenix RTOS with
network stack — LwIP, you need to adjust the custom
build.project script, in function b_build_project()
add the following lines:
b_log "Builing phoenix-rtos-lwip"
(cd phoenix-rtos-lwip && make $MAKEFLAGS $CLEAN all)
some targets may require adding also
b_install "$PREFIX_PROG_STRIPPED/lwip" /sbin
next it is required to add lwip
to syspage programs with PROGS
variable,
e.g.:
PROGS=("dummyfs" "imxrt-multi" "lwip" "psh")
If phoenix-rtos-build
buildsphoenix-rtos-lwip
correctly, you can start the
null-modem point-to-point connection in the Phoenix RTOS system. To enable the
driver and up the interface just after Phoenix RTOS kernel starts, add e.g. the
following line to the plo
script:
app flash0 -x @lwip;/dev/uart3:115200:up xip1 ocram2
It is important that the entry is added with the imxrt-multi
driver or with
the appropriate platform serial driver. Driver that is used in the example is
imxrt-multi
available for imxrt
targets, it will create an entry in /dev
directory e.g. uart3
corresponding to the auxiliary uart port instance on
i.MX RT1064-EVK board, where uart1 is already used for the systems console.
The configuration field :115200:
is optional and represents the connection
speed (value of 115200 bauds is the default baud rate and can be omitted). Of
course, you can set other speeds, e.g. 9600, 230400 or 460800. Other connection
parameters, such as parity and stop bits, are fixed to 8N1, because nowadays,
other values are rarely used, especially for serial PPP connections.
Default route#
By default, pppou
driver will add the default route
via itself. If the
default route
is not to be added, use the optional nodefault
parameter,
as in the example below.
app flash0 -x @lwip;pppou:/dev/uart3:115200:nodefault:up xip1
Setup device side#
For example, on the imxrt
platforms (memory map used in example is for i.MX
RT1064) the plo script might look like this:
map itcm 0 58000 R+E
map dtcm 20000000 20028000 R+W
map ocram2 20200000 20280000 R+W+E
map xip1 70000000 70400000 R+E
kernel flash0
app flash0 -x @dummyfs xip1 dtcm
app flash0 -x @imxrt-multi xip1 dtcm
app flash0 -x @lwip;pppou:/dev/uart3:460800:up xip1 ocram2
app flash0 -x @psh xip1 ocram2
go!
Alternatively, phoenix-rtos-lwip
can also be started with the command psh
sysexec (NON-MMU targets) at any time:
sysexec ocram2 lwip pppou:/dev/uart3:115200:up
If provided the LwIP server has not already been running, and on MMU architectures
either using the exec
command or directly in psh
command prompt.
Once the phoenix-rtos-lwip
server has started, you can make sure by issuing
the command ps
, which should show that the lwip
with the correct arguments
is already running, in the example figure below you can see that the baud rate
460800 was used.
Setup host side#
As what has been done above and both the device and host have been connected
with a null-modem cable or using any uart-ttl-usb adapter, then on the host
side you must also configure the connection, if it is Linux or BSD, you can
use, for example this command (prepend pppd
with sudo
, doas
or su
command if root
user rights are required):
pppd /dev/ttyUSB0 460800 10.0.0.1:10.0.0.2 lock local noauth nocrtscts nodefaultroute maxfail 0 persist
The device entry /dev/ttyUSB0
may differ between systems, the address pair
10.0.0.1:10.0.0.2
means local:remote
that the host will get 10.0.0.1
address and the remote device with phoenix-rtos-lwip
running will get
10.0.0.2
address, the ppp daemon will run in the background and wait
continuously (maxfail 0 persist
) for connections.
To check if the connection has been successfully established, use ping
command on the host side:
Additional /dev
entries will be created like ifstatus
, route
and pf
.
Enabling IPv6 (dual stack)#
Add the following line at the top of file phoenix-rtos-lwip/include/default-opts/lwipopts.h
and rebuild.
#define LWIP_IPV6 1
Re-run pppd
with +ipv6
flag, the remote side may be assigned with
link-local address like fe80::55a0:6c87:7de3:611b
Debugging#
Compile phoenix-rtos-lwip
pppou driver with logging enabled, and then on host
use the following command that enable full pppd
debugging
pppd /dev/ttyUSB0 <speed> 10.0.0.1:10.0.0.2 lock local nodetach noauth debug dump nocrtscts nodefaultroute maxfail 0 holdoff 1
Replace <speed>
with the baud rate of remote side and supported by the
system, e.g. 9600, 115200, 230400 or 460800.