[{"content":"I\u0026rsquo;m a Senior Embedded Systems Engineer based in Tokyo, currently at Rapyuta Robotics working on autonomous mobile robots (AMRs). Previously at Toradex for 6+ years working on Linux kernel and BSP for ARM computer-on-modules.\nUpstream contributor to the Linux kernel and U-Boot.\nSkills Advanced C, Linux Device Drivers, Linux BSP, Zephyr RTOS, Embedded Systems Design\nIntermediate STM32, CANopen (CiA 402), ESP32 / ESP-NOW, ROS / ROS Noetic, Device Trees, U-Boot, Yocto / OpenEmbedded, Python, C++, Git, nanopb, UART / SPI / I2C / CAN\nFamiliar KiCAD, BuildRoot, MQTT, MicroPython, FreeRTOS, Qt\nInterests Electronics · Robotics · Bicycle trekking · Music · Drawing · Pet-keeping\nContact bhuvanchandradv@gmail.com\n","permalink":"https://bhuvanchandradv.github.io/about/","summary":"\u003cp\u003eI\u0026rsquo;m a Senior Embedded Systems Engineer based in Tokyo, currently at \u003ca href=\"https://www.rapyuta-robotics.com/\"\u003eRapyuta Robotics\u003c/a\u003e working on autonomous mobile robots (AMRs). Previously at \u003ca href=\"https://www.toradex.com/\"\u003eToradex\u003c/a\u003e for 6+ years working on Linux kernel and BSP for ARM computer-on-modules.\u003c/p\u003e\n\u003cp\u003eUpstream contributor to the \u003ca href=\"https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?qt=author\u0026amp;q=bhuvanchandra.dv\"\u003eLinux kernel\u003c/a\u003e and \u003ca href=\"http://git.denx.de/?p=u-boot.git\u0026amp;a=search\u0026amp;h=refs%2Fheads%2Fmaster\u0026amp;st=author\u0026amp;s=bhuvanchandra.dv\"\u003eU-Boot\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"skills\"\u003eSkills\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAdvanced\u003c/strong\u003e\nC, Linux Device Drivers, Linux BSP, Zephyr RTOS, Embedded Systems Design\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIntermediate\u003c/strong\u003e\nSTM32, CANopen (CiA 402), ESP32 / ESP-NOW, ROS / ROS Noetic, Device Trees, U-Boot,\nYocto / OpenEmbedded, Python, C++, Git, nanopb, UART / SPI / I2C / CAN\u003c/p\u003e","title":"About"},{"content":"This is an experimental port of MicroPython for NXP VF6XX M4 Core.\nSource code\nSupported features include:\nREPL (Python prompt) over UART2 Garbage collector GPIO, UART support Build The toolchain required is the Linaro ARM Embedded toolchain (e.g. 4.9 2015 Q3):\ntar xjf ${HOME}/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2 export PATH=$PATH:$HOME/gcc-arm-none-eabi-4_9-2015q3/bin/ Then build:\ncd ${HOME}/micropython/vf6xx make Booting the M4 Core Two methods are supported:\n1. From U-Boot using bootaux:\nColibri VFxx # fatload mmc 0:1 ${loadaddr} firmware.elf Colibri VFxx # bootaux ${loadaddr} 2. From Linux using remoteproc:\nDeploy the .elf to /lib/firmware and load the remoteproc modules:\nroot@colibri-vf:~# ln -s firmware.elf /lib/firmware/freertos-rpmsg.elf root@colibri-vf:~# modprobe vf610_cm4_rproc REPL Access the Python prompt over UART_B at 115200 baud:\nMicroPython v1.9.1-166-ge190711f on 2017-07-19; Colibri VF61 with VF6XX_M4 \u0026gt;\u0026gt;\u0026gt; print(\u0026#34;Hello World!\u0026#34;) Hello World! ","permalink":"https://bhuvanchandradv.github.io/blog/micropython-running-on-vf6xx_m4/","summary":"\u003cp\u003eThis is an experimental port of MicroPython for NXP VF6XX M4 Core.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/bhuvanchandra/micropython/tree/vf6xx_m4\"\u003eSource code\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSupported features include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eREPL (Python prompt) over UART2\u003c/li\u003e\n\u003cli\u003eGarbage collector\u003c/li\u003e\n\u003cli\u003eGPIO, UART support\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"build\"\u003eBuild\u003c/h2\u003e\n\u003cp\u003eThe toolchain required is the Linaro ARM Embedded toolchain (e.g. 4.9 2015 Q3):\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etar xjf \u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eHOME\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexport PATH\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e$PATH:$HOME/gcc-arm-none-eabi-4_9-2015q3/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThen build:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd \u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eHOME\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e/micropython/vf6xx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"booting-the-m4-core\"\u003eBooting the M4 Core\u003c/h2\u003e\n\u003cp\u003eTwo methods are supported:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. From U-Boot using \u003ccode\u003ebootaux\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eColibri VFxx \u003cspan style=\"color:#75715e\"\u003e# fatload mmc 0:1 ${loadaddr} firmware.elf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eColibri VFxx \u003cspan style=\"color:#75715e\"\u003e# bootaux ${loadaddr}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e2. From Linux using remoteproc:\u003c/strong\u003e\u003c/p\u003e","title":"MicroPython running on NXP VF6XX M4 Core"},{"content":"Examples using libsoc on a Colibri VF61 module with an Aster carrier board and Pioneer600 Raspberry Pi expansion cape.\nHardware Colibri VF61 — Cortex-A5 + Cortex-M4, SODIMM form factor Aster Carrier Board — Arduino Uno and Raspberry Pi headers Pioneer600 — RPi expansion cape Cross-compiling libsoc Build and install the Yocto SDK first, then:\ngit clone -b master https://github.com/jackmitch/libsoc.git cd libsoc . /usr/local/oecore-x86_64/environment-setup-armv7at2hf-neon-angstrom-linux-gnueabi autoreconf -i ./configure --host=arm-angstrom-linux-gnueabi \\ --prefix=/usr/local/oecore-x86_64/sysroots/armv7at2hf-neon-angstrom-linux-gnueabi/ make -j$(nproc) sudo make install Cross-compiling the examples git clone https://github.com/bhuvanchandra/libsoc-examples.git cd libsoc-examples/ssd1306/ MACHINE=colibri-vf make Copy the binary to the target via SSH and run.\nNote: A Yocto recipe for libsoc is also available in OpenEmbedded layers.\n","permalink":"https://bhuvanchandradv.github.io/blog/libsoc-examples/","summary":"\u003cp\u003eExamples using \u003ca href=\"https://github.com/jackmitch/libsoc\"\u003elibsoc\u003c/a\u003e on a Colibri VF61 module with an Aster carrier board and Pioneer600 Raspberry Pi expansion cape.\u003c/p\u003e\n\u003ch2 id=\"hardware\"\u003eHardware\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.toradex.com/computer-on-modules/colibri-arm-family/nxp-freescale-vybrid-vf6xx\"\u003eColibri VF61\u003c/a\u003e — Cortex-A5 + Cortex-M4, SODIMM form factor\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.toradex.com/products/carrier-boards/aster-carrier-board\"\u003eAster Carrier Board\u003c/a\u003e — Arduino Uno and Raspberry Pi headers\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.waveshare.com/wiki/Pioneer600\"\u003ePioneer600\u003c/a\u003e — RPi expansion cape\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg alt=\"Hardware Setup\" loading=\"lazy\" src=\"https://github.com/bhuvanchandra/images-repo/raw/master/images-aster-pioneer600/aster-pioneer600.jpg\"\u003e\u003c/p\u003e\n\u003ch2 id=\"cross-compiling-libsoc\"\u003eCross-compiling libsoc\u003c/h2\u003e\n\u003cp\u003eBuild and install the Yocto SDK first, then:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone -b master https://github.com/jackmitch/libsoc.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd libsoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e. /usr/local/oecore-x86_64/environment-setup-armv7at2hf-neon-angstrom-linux-gnueabi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eautoreconf -i\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./configure --host\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003earm-angstrom-linux-gnueabi \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e    --prefix\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e/usr/local/oecore-x86_64/sysroots/armv7at2hf-neon-angstrom-linux-gnueabi/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emake -j\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003enproc\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"cross-compiling-the-examples\"\u003eCross-compiling the examples\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone https://github.com/bhuvanchandra/libsoc-examples.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecd libsoc-examples/ssd1306/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMACHINE\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ecolibri-vf make\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCopy the binary to the target via SSH and run.\u003c/p\u003e","title":"libsoc Examples on Colibri VF61"},{"content":"","permalink":"https://bhuvanchandradv.github.io/contact/","summary":"","title":"contact"},{"content":"Fork of the DirectFB example Knuckles, used in a Linux quick boot demo on Toradex Colibri modules.\nSource code\n","permalink":"https://bhuvanchandradv.github.io/blog/directfb-knuckles-example/","summary":"\u003cp\u003eFork of the DirectFB example Knuckles, used in a Linux quick boot demo on Toradex Colibri modules.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Screenshot\" loading=\"lazy\" src=\"https://raw.githubusercontent.com/bhuvanchandra/images-repo/master/images-knuckles/Screenshot-from-2016-02-02-15-33-49.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/bhuvanchandra/knuckles.git\"\u003eSource code\u003c/a\u003e\u003c/p\u003e","title":"Knuckles Demo Application — DirectFB Fork"},{"content":"Mapping LCD/TFT display timings to Linux Kernel data structures Most LCD/TFT display datasheets provide the following timing information:\nHorizontal Back Porch (HBP): Number of pixel clk pulses between HSYNC signal and the first valid pixel data. Horizontal Front Porch (HFP): Number of pixel clk pulses between the last valid pixel data in the line and the next hsync pulse. Vertical Back Porch (VBP): Number of lines (HSYNC pulses) from a VSYNC signal to the first valid line. Vertical Front Porch (VFP): Number of lines (HSYNC pulses) between the last valid line of the frame and the next VSYNC pulse. VSYNC pulse width: Number of HSYNC pulses when a VSYNC signal is active. HSYNC pulse width: Number of pixel clk pulses when a HSYNC signal is active. Active frame width: Horizontal resolution. Active frame height: Vertical resolution. Screen width: Active frame width + HBP + HFP Screen height: Active frame height + VBP + VFP VSYNC polarity: Value of VSYNC to indicate the start of a new frame (active LOW or HIGH) HSYNC polarity: Value of HSYNC to indicate the start of a new line (active LOW or HIGH) Some datasheets provide horizontal and vertical blanking period instead:\nHorizontal Blanking Period = HSYNC + HFP + HBP Vertical Blanking Period = VSYNC + VFP + VBP e.g. If Vertical blanking period is given as 150, one can split it as:\nVSYNC: 60, VFP: 45, VBP: 45 Mapping to fb_videomode struct fb_videomode { const char *name; // Descriptive name u32 refresh; // Refresh rate in Hz u32 xres; // Resolution in x (Active frame width) u32 yres; // Resolution in y (Active frame height) u32 pixclock; // Pixel clock in picoseconds u32 left_margin; // Horizontal Back Porch (HBP) u32 right_margin; // Horizontal Front Porch (HFP) u32 upper_margin; // Vertical Back Porch (VBP) u32 lower_margin; // Vertical Front Porch (VFP) u32 hsync_len; // HSYNC pulse width u32 vsync_len; // VSYNC pulse width u32 sync; // Polarity on Data Enable u32 vmode; // Video mode (e.g. FB_VMODE_NONINTERLACED) u32 flag; // Usually 0 }; Note: pixclock is in picoseconds — convert MHz to ps: pixclock_ps = 1e12 / freq_MHz\n","permalink":"https://bhuvanchandradv.github.io/blog/linux-lcd-timings/","summary":"\u003ch3 id=\"mapping-lcdtft-display-timings-to-linux-kernel-data-structures\"\u003eMapping LCD/TFT display timings to Linux Kernel data structures\u003c/h3\u003e\n\u003cp\u003eMost LCD/TFT display datasheets provide the following timing information:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eHorizontal Back Porch (HBP)\u003c/strong\u003e: Number of pixel clk pulses between HSYNC signal and the first valid pixel data.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHorizontal Front Porch (HFP)\u003c/strong\u003e: Number of pixel clk pulses between the last valid pixel data in the line and the next hsync pulse.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVertical Back Porch (VBP)\u003c/strong\u003e: Number of lines (HSYNC pulses) from a VSYNC signal to the first valid line.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVertical Front Porch (VFP)\u003c/strong\u003e: Number of lines (HSYNC pulses) between the last valid line of the frame and the next VSYNC pulse.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVSYNC pulse width\u003c/strong\u003e: Number of HSYNC pulses when a VSYNC signal is active.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHSYNC pulse width\u003c/strong\u003e: Number of pixel clk pulses when a HSYNC signal is active.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eActive frame width\u003c/strong\u003e: Horizontal resolution.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eActive frame height\u003c/strong\u003e: Vertical resolution.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eScreen width\u003c/strong\u003e: \u003ccode\u003eActive frame width + HBP + HFP\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eScreen height\u003c/strong\u003e: \u003ccode\u003eActive frame height + VBP + VFP\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVSYNC polarity\u003c/strong\u003e: Value of VSYNC to indicate the start of a new frame (active LOW or HIGH)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHSYNC polarity\u003c/strong\u003e: Value of HSYNC to indicate the start of a new line (active LOW or HIGH)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSome datasheets provide horizontal and vertical blanking period instead:\u003c/p\u003e","title":"Understanding Linux LCD Display Timings"},{"content":"Point of sale demo application built with GTK+ and Glade, running on Toradex Apalis/Colibri System on Modules.\nSource code\n","permalink":"https://bhuvanchandradv.github.io/blog/gtk-example_pos/","summary":"\u003cp\u003ePoint of sale demo application built with GTK+ and Glade, running on Toradex Apalis/Colibri System on Modules.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Screenshot\" loading=\"lazy\" src=\"https://github.com/bhuvanchandra/images-repo/raw/master/images-pos/2016-02-02-094708_800x480_scrot.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/bhuvanchandra/pos-demo.git\"\u003eSource code\u003c/a\u003e\u003c/p\u003e","title":"Point of Sale Demo with GTK+ and Glade"},{"content":"How to configure an embedded Linux board (Colibri VF61) as a WiFi access point using hostapd, udhcpd, and iptables.\nTest Setup Colibri VF61 V1.1A Colibri Evaluation Board V3.1a / Iris V1.1 Ambicom WL250N-USB (Ralink RT3070 chipset) Steps Overview Assign a static IP to wlan0 Configure udhcpd as the DHCP server Configure hostapd as the AP daemon Enable IP forwarding and NAT between wlan0 and eth0 Wire it all up with systemd service files 1. Static IP for wlan0 ifconfig wlan0 192.168.0.1 up 2. udhcpd configuration /etc/udhcpd.conf:\nstart 192.168.0.20 end 192.168.0.254 interface wlan0 remaining yes lease_file /var/lib/misc/udhcpd.leases pidfile /var/run/udhcpd.pid opt dns 8.8.8.8 8.8.4.4 opt router 192.168.0.1 opt subnet 255.255.255.0 opt lease 864000 3. hostapd configuration /etc/hostapd.conf:\ninterface=wlan0 driver=nl80211 ssid=MyEmbeddedAP hw_mode=g channel=6 macaddr_acl=0 auth_algs=1 wpa=2 wpa_key_mgmt=WPA-PSK wpa_passphrase=your-passphrase wpa_pairwise=TKIP rsn_pairwise=CCMP 4. IP forwarding and NAT # Enable forwarding sysctl -w net.ipv4.ip_forward=1 # Uncomment net.ipv4.ip_forward=1 in /etc/sysctl.conf to persist # NAT rule iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT # Save iptables-save \u0026gt; /etc/iptables.ipv4.nat 5. systemd service /etc/systemd/system/access-point.service:\n[Unit] Description=WiFi Access Point BindsTo=sys-subsystem-net-devices-wlan0.device After=sys-subsystem-net-devices-wlan0.device [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/ip link set dev wlan0 up ExecStart=/bin/ip addr add 192.168.0.1/24 broadcast 192.168.0.255 dev wlan0 ExecStart=/usr/sbin/hostapd -B /etc/hostapd.conf ExecStart=/usr/sbin/udhcpd -fS /etc/udhcpd.conf ExecStop=/sbin/ip addr flush dev wlan0 ExecStop=/sbin/ip link set dev wlan0 down [Install] WantedBy=multi-user.target systemctl enable access-point.service systemctl enable iptables-restore.service ","permalink":"https://bhuvanchandradv.github.io/blog/wifi-hotspot-in-linux/","summary":"\u003cp\u003eHow to configure an embedded Linux board (Colibri VF61) as a WiFi access point using \u003ccode\u003ehostapd\u003c/code\u003e, \u003ccode\u003eudhcpd\u003c/code\u003e, and \u003ccode\u003eiptables\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"test-setup\"\u003eTest Setup\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eColibri VF61 V1.1A\u003c/li\u003e\n\u003cli\u003eColibri Evaluation Board V3.1a / Iris V1.1\u003c/li\u003e\n\u003cli\u003eAmbicom WL250N-USB (Ralink RT3070 chipset)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"steps-overview\"\u003eSteps Overview\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eAssign a static IP to \u003ccode\u003ewlan0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eConfigure \u003ccode\u003eudhcpd\u003c/code\u003e as the DHCP server\u003c/li\u003e\n\u003cli\u003eConfigure \u003ccode\u003ehostapd\u003c/code\u003e as the AP daemon\u003c/li\u003e\n\u003cli\u003eEnable IP forwarding and NAT between \u003ccode\u003ewlan0\u003c/code\u003e and \u003ccode\u003eeth0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eWire it all up with systemd service files\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"1-static-ip-for-wlan0\"\u003e1. Static IP for wlan0\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifconfig wlan0 192.168.0.1 up\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"2-udhcpd-configuration\"\u003e2. udhcpd configuration\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e/etc/udhcpd.conf\u003c/code\u003e:\u003c/p\u003e","title":"Configuring an Embedded Linux Machine as a WiFi Hotspot"}]