Programming ESP8266 using Visual Studio Code with Arduino Extension

So now I have used the official Arduino IDE for some time to program the ESP8266. It is a convenient and quick-to-get-started method (check here). But recently I plan to write an application that I feel it would be uncomfortable to write codes using the limited features of Arduino IDE. I find particularly two feature-rich IDEs out there, which are free and highly recommended by communities, namely Atom and Visual Studio Code. With Atom, we need to add the PlatformIO extension for programming embedded systems, including the ESP8266. While with VS Code, we need to install either PlatformIO or Arduino extension.

I had difficulties to get both Atom-PlatformIO and VS Code-PlatformIO working. Somehow the PlatformIO installation was not able to complete. I suspected it was caused by my office internet proxy. I spent quite some time to solve it but did not succeed, so I abandoned it and tried the Arduino extension.

Getting the VS Code with Arduino extension working was not that straight forward either. If you search for the Arduino extension, you will find two choices, either developed by Microsoft or Steve Yin. Initially I chose the one developed by Microsoft. Well, Arduino extension is just an extension that allows users to tell the VS Code where the tools for compiling and uploading code reside. So we must have the official Arduino IDE installed because its tools for compiling and uploading will be used by the VS Code. Then we need to specify the Arduino IDE path in the VS Code ‘User Settings’. Btw, my OS was Windows 8, and I installed the official Arduino IDE version 1.8.2. For unknown reasons compiling sketch using VS Code was always fail with a message saying ‘[Error] Exit with code=undefined’. Actually, I also had an Ubuntu machine, and I managed to get the Arduino extension working. I could compile and upload codes to the ESP8266. But for some reasons, I still preferred to work on my Windows 8 machine.

So, then I gave the Steve Yin’s Arduino extension a try on my Win 8. The compile and upload options in User Settings were more complicated than those of Microsoft one.  But happily I succeeded to compile and write bits of codes to the ESP8266 flash memory. The easiest way to specify the compile and upload options is by adapting them from the command list spat out from the Arduino IDE console output. Again, you can follow this instruction to program ESP8266 using Arduino IDE.

arduino ide compile - for vs code arduino ext

Here is my VS Code ‘User Settings’:

"arduino.uploader" : "C:\\Users\\User-pc\\AppData\\Local\\Arduino15\\packages\\esp8266\\tools\\esptool\\0.4.9\\esptool.exe",
"arduino.uploadOptions": "-vv -cd nodemcu -cb 921600 -cp COM12 -ca 0x00000 -cf $TARGET.bin",
"arduino.compileOptions": "-compile -logger=machine -hardware D:/Master/arduino-1.8.2/hardware -hardware C:/Users/User-pc/AppData/Local/Arduino15/packages -tools D:/Master/arduino-1.8.2/tools-builder -tools D:/Master/arduino-1.8.2/hardware/tools/avr -tools C:/Users/User-pc/AppData/Local/Arduino15/packages -built-in-libraries D:/Master/arduino-1.8.2/libraries -libraries C:/Users/User-pc/Documents/Arduino/libraries -fqbn=esp8266:esp8266:nodemcuv2:CpuFrequency=80,UploadSpeed=115200,FlashSize=4M3M -vid-pid=0X2341_0X0043 -ide-version=10802 -warnings=none -prefs=build.warn_data_percentage=75 -verbose",
In the “arduino.compileOptions” I omitted the built-path and built-cache options since they caused compiling to fail. The Arduino extension had its own built-cache which worked fine. I had not looked further for the meaning of the other options. They might be fine to be deleted. However they seems didn’t do any harm, by now I just leave it there.
In the “arduino.uploadOptions” we could set the COM port and upload speed. By default, the upload speed is 115200, which was quite slow. I found it somewhere that says we can increase the speed by a factor of 8, so it becomes 921600. It was indeed much faster. But the reference I read also says that this high speed can sometimes be unstable. So, bear this in mind. I did try other higher baud rates: 1500000, 1843200, 2000000. However the uploading time took longer than that of 921600.
vs code arduino ext compile
Initially I thought installing these tools for programming ESP8266 would be just some clicks away. But in fact I had spent a lot of time to get it done properly. I hope you have a nice and smooth installation. In case you face the same problem, hope my experience would help.
Happy coding!

Asal-usul kata pulsa pada ponsel


Pagi ini sebelum mandi sempat terpikir bagaimana sebenarnya asal usul kata ‘pulsa’ pada ponsel. Hari ini pulsa pada ponsel berarti saldo yang bisa digunakan untuk telepon, sms, maupun streaming data. Menurut KBBI, salah satu arti kata pulsa adalah satuan dalam perhitungan biaya telepon. Pulsa, yang berasal dari bahasa Inggris pulse, memiliki arti asli: denyut atau detak.

Kalau ditanya ‘Kamu punya pulsa ngga?’, dalam sepersekian detik kita bisa langsung mengerti maksudnya. Tapi kalau pertanyaan yang sama diterjemahkan dalam bahasa Inggris ‘Do you have pulses?’, kita membutuhkan beberapa waktu untuk mengerti maksudnya. Yang terjadi dalam pikiran saya kira-kira begini:

“Hah? Dia tanya apakah saya punya denyutan? Apakah saya masih hidup? Tidak masuk akal. Pasti bukan itu maksudnya. Hmmmm, apalagi ya arti pulse yang lain nya? Oh mungkin maksudnya apakah saya punya pulsa untuk telepon. Tapi saya masih perlu bertanya balik untuk konfirmasi apakah benar maksudnya seperti itu.”

Pertanyaan di atas dijamin tidak akan dimengerti oleh orang selain orang Indonesia. Mengapa? Karena makna pulsa telah bergeser sedemikian jauh dari arti dasarnya sampai tidak ada hubungan nya lagi: dari denyut menjadi satuan biaya telepon. Lalu bagaimana perubahan ini terjadi?

Dulu zaman belum ada ponsel, dan di rumah saya belum ada sambungan telepon, malam-malam di atas jam 9 saya sering ikut ibu ke wartel di Nanga Pinoh untuk menelepon tante saya di Pontianak. Saya perhatikan display total biaya telepon nya akan bertambah setiap beberapa detik tertentu. Misalnya tiap 20 detik akan bertambah Rp.1.000,-. Interval ini berbeda-beda untuk setiap kota tujuan. Kalau tidak salah ingat (tercantum dalam struk), tiap interval inilah yang disebut pulsa. Jadi total biaya telepon adalah jumlah pulsa dikali dengan biaya per pulsa.

Ketika awal-awal ponsel GSM mulai populer, untuk menelepon dengan kartu prabayar kita harus mengisi ‘pulsa’ menggunakan voucher fisik yang digosok. Seingat saya, pulsa yang diisikan adalah dalam satuan rupiah. Mungkin karena waktu itu belum ada kata yang bisa dipakai untuk merujuk ke arti saldo telepon tersebut, jadi paling mudah dipakailah kata ‘pulsa’ yang sudah ada. Walaupun agak-agak kurang nyambung juga sih 🙂

Saya tidak tau apakah pernah pada awalnya pengisian pulsa tersebut dihitung literally dalam satuan pulsa (seperti halnya menelepon di wartel), dan bukan rupiah. Kalau betul begitu, maka sangat bisa dipahami mengapa kata pulsa terbawa sampai sekarang.

Entahlah kebenarannya. Begitulah kira-kira yang terpikir tadi pagi sebelum mandi 

Comparison of D Flip-Flop Based Pulse Generators

In this post I would like to share our experience in making comb generators. Comb generator is basically a periodic sharp pulse generator. There are a number of methods to generate pulses, such as using step recovery diode (SRD), tunnel diode, non linear transmission line (NLTL), etc. However, according to this paper we found another simple and clever trick to generate short pulses, i.e. by exploiting the asynchronous reset feature of D Flip-Flop. We have made 3 types of D Flip-Flop based pulse generators using different logic families:

  1. 74LS74. Low power Schottky TTL device. It has typically maximum operating clock frequency at 25 MHz.
  2. 74ACT74. Advanced CMOS with TTL compatibility device. The maximum operating frequency is at 210 MHz.
  3. MC100EP31. Emitter Coupled Logic (ECL) device. Maximum frequency is 3 GHz.
74LS74 kecil
74LS74 based pulse generator. Made by: Haryo Dwi Prananto.
74ACT74 kecil
74ACT74 based pulse generator. Made by: Haryo Dwi Prananto
MC100EP31 based pulse generator. Made by: M. Imam Sudrajat

The device’s maximum frequency is related to its rise time and fall time capability. Higher maximum frequency means faster rise/fall time. As for our pulse generator, faster  edge transition will result in shorter pulse.  Longest to shortest generated pulse is in order: 74LS74 –> 74ACT74 –> MC100EP31.

pulse 40 khz square zoom - edit-final
Pulse generated at 74LS74 output
pulsa 74ACT74
Pulse generated at 74ACT74 output. Pulsewidth: +/- 6 ns
pulse comb_re_out
Pulse generated at MC100EP31 output. Pulsewidth: +/- 1 ns

All three pulses shown above are generated periodically at certain frequencies. So when viewed from frequency domain measured using spectrum analyzer, they look like this:

spectrum 74LS74
Frequency spectrum of 74LS74 periodic pulse output. Pulse period: 40 kHz.
spectrum 74ACT74
Frequency spectrum of 74ACT74 periodic pulse output. Pulse period: 200 kHz.
spectrum frequency MC100EP31
Frequency spectrum of MC100EP31 periodic pulse output. Pulse period: 10 MHz.

Frequency spectrum of 74LS74 and 74ACT74 may look the same. However if we extend the frequency measurement range, it will be evident that the spectrum content of 74ACT74 is higher than that of 74LS74. This is because the pulse of 74ACT74 is shorter than that of 74LS74.

More details about the circuit diagram, how it works, and also deeper analysis can be found in our paper:

  1. Yoppy, Haryo Dwi Prananto. “Comb Generator for Verification of  Terminal Disturbance Voltages Measurement According to CISPR 14-1”. Annual Meeting on Testing and Quality (AMTeQ), 2015, pp. 143-151.
  2. Yoppy, M. Imam Sudrajat. “Design of Radiated Comb Generator Using Single-Ended Positive Emitter Coupled Logic (PECL) D Flip-Flop”. Progress in Electromagnetics Research Letters, Vol. 70, September 2017, pp. 67-73.

Pengalaman menggunakan Modul WiFi NodeMcu ESP8266

Ceritanya saya mau membuat sebuah prototipe lampu yang bisa dikendalikan secara wireless menggunakan handphone atau laptop. Rencananya akan ada kurang lebih 10 titik/node lampu. Masing-masing node berjarak +/- 20 meter sehingga membentuk garis lurus sepanjang 200 meter. Antar node tidak ada line of sight karena ada halangan berupa logam. Teknologi wireless yang digunakan haruslah secure, setidaknya mendukung otentikasi password. Dan yang paling penting, saya ingin membentuk jaringan wireless tersebut dalam topologi mesh network, yaitu tiap node berfungsi sebagai repeater yang meneruskan data ke node tetangga terdekatnya. Kenapa tidak gunakan saja sebuah transmitter daya besar yang bisa mennjangkau hingga node terjauh (200 meter)? Tidak, karena ada batasan daya transmisi yang diizinkan regulasi, dan hampir pasti (belum menemukan referensi) jangkauan sejauh itu membutuhkan daya yang melebihi limit, atau membutuhkan izin khusus.

Beberapa solusi wireless saya coba bandingkan, yaitu Zigbee, Bluetooh Low Energy (BLE) dan Bluetooh. Dari segi jangkauan, Zigbee memang mumpuni. Tapi dari kunjungan ke toko-toko online saya dapati bahwa modul Zigbee sangat mahal dan tidak banyak tersedia. Sedangkan, modul BLE dan Bluetooth jauh lebih murah harganya dan lebih mudah didapatkan. Tapi kemampuan jangkauannya di ambang batas spesifikasi yang saya tentukan di awal. Beberapa sumber mengatakan jangkauan Bluetooth hanya 10 meter, sedangkan sumber lainnya menyebutkan jarak 20 m bukanlah masalah. Memang soal jangkauan sangat tergantung dari kondisi lingkungan, apakah banyak halangan atau tidak, apakah halangan nya berupa logam, tembok beton, dsb. Dan memang dalam datasheet modul wireless kita biasanya tidak menemukan pernyataan bahwa jangkauan nya adalah sekian meter *. Parameter terukur yang bisa didapatkan dalam datasheet di antaranya adalah daya transmisi dan sensitivitas receiver. Salah satu pilihan saya awalnya jatuh pada modul Bluetooth nRF51. Modul ini memiliki daya transmisi 4 dBm. Untuk mengetahui apakah modul tersebut bisa menjangkau 20 meter, saya putuskan untuk mencobanya. Namun sesaat sebelum saya memesan modul ini di toko online, saya sempat chatting dengan Bondan Suwandi. Singkat cerita dia menyarankan untuk menggunakan modul WiFi ESP8266.

Tidak perlu waktu lama untuk googling, ternyata modul ESP8266 ini begitu menawan dan langsung mengubah keputusan saya :). Kenapa? Karena modul WiFi ini ternyata lebih murah daripada Bluetooth. Selain itu daya transmisi nya bisa mencapai 20 dBm (kalau tidak salah ini batas maksimal yang diizinkan regulasi di Indonesia), bandingkan dengan modul Bluetooth nRF51 yang hanya 4 dBm. Di Youtube, ada yang pernah mencoba jarak jangkauan ESP8266 ini di area terbuka dengan adanya line of sight. Hasilnya mengejutkan, bisa mencapai 500-1000 meter. Karena modul WiFi beroperasi pada frekuensi UHF 2.4 Ghz, tentu saja jika dalam ruangan yang dibatasi tembok atau terlindung logam, jangkauan nya akan menurun jauh. Selain itu, saya mendapati bahwa komunitas pengguna ESP8266 ini cukup banyak dan akif. Dan ternyata ada yang sudah mengimplementasikan mesh network di ESP8266. Persis seperti yang saya inginkan. Saya coba rangkumkan fitur-fitur ESP8266 yang tertulis dalam datasheet nya di sini:

  • Mendukung protocol WiFi IEEE 802.11 b/g/n, dengan otentikasi password WPA/WPA2
  • Terintegrasi low power 32-bit MCU (Tensilica)
  • Terintegrasi 10-bit ADC
  • Terintegrasi TCP/IP protocol stack
  • Terintegrasi TR switch, balun, LNA, power amplifier and matching network
  • Terintegrasi PLL, regulators, and power management units
  • SDIO 2.0, (H) SPI, UART, I2C, I2S, IR Remote Control, PWM, GPIO
  • Deep sleep power <10uA, Power down leakage current < 5uA
  • Konsumsi daya standby < 1.0mW
  • Daya transmisi +20 dBm dalam mode 802.11b
  • Mendukung mode Station (STA), Access Point (AP), dan STA+AP
  • Tersertifikasi FCC, CE, TELEC, WiFi Alliance, dan SRRC

block diagram ESP8266

ESP8266 mendukung mode STA+AP, yaitu berfungsi sebagai Station dan Access Point sekaligus. Fitur ini memungkinkan ESP8266 diprogram membentuk mesh network. Sebuah node bisa berfungsi sebagai Station yang terkoneksi ke node Access Point, dan sekaligus berfungsi sebagai Access Point bagi node Station lainnya. Namun perlu diperhatikan bahwa mode STA dan AP menggunakan jalur hardware yang sama sehingga ada beberapa kasus yang bisa membuat koneksi menjadi putus, seperti yang dijelaskan di sini:

Kasus 1:

  1. Station ESP8266 terkoneksi ke sebuah router (misalnya channel 6)
  2. Kemudian setting parameter AP ESP8266 melalui fungsi wifi_softap_set_config(), misalnya set ke channel 3
  3. Fungsi tersebut mungkin akan return true, tapi sebenarnya channel tetap di 6, karena hanya ada satu jalur hardware yang sudah diset di langkah 1

Kasus 2:

  1. Setting channel AP ESP8266 x, misal channel 5, melalui fungsi wifi_softap_set_config()
  2. Kemudian ada beberapa Station yang terkoneksi ke AP ESP8266 x tersebut
  3. Kemudian Station ESP8266 x mencoba melakukan koneksi ke router yang memiliki channel yang berbeda (misal channel 6)
  4. AP ESP8266 x harus mengubah channel nya menjadi sama dengan Station ESP8266 x, yaitu channel 6
  5. Akibatnya station-station yang terkoneksi ke AP ESP8266 x pada langkah 2 akan disconnected karena telah terjadi perubahan channel

Kasus 3:

  1. Beberapa station terkoneksi ke AP ESP8266 x
  2. Jika kemudian Station ESP8266 x mencoba melakukan scanning channel untuk mencari router,  station-station yang terkoneksi pada langkah 1 mungkin akan disconnected. Sebabnya, Station ESP8266 x yang terus mengubah channel mengakibatkan channel AP ESP8266 x ikut berubah.


Ada banyak varian modul ESP8266 yang beredar saat ini, yaitu:

  • Tanpa USB to serial converter: ESP01, ESP02, hingga ESP14 (lebih detail lihat di sini)
  • Dengan USB to serial converter: NodeMCU, ESPToy


Sumber Gambar: sini.

Saya sudah mencoba ESP01 dan NodeMCU. Untuk memprogram ESP01 dari port USB kita perlu menambahkan USB to Serial converter. Kita bisa gunakan FTDI, CH340, atau board Arduino Uno. Tapi entah kenapa modul ESP-01 ini susah sekali diprogram, sering kali gagal nge-flash. Padahal saya sudah coba beberapa saran seperti menambahkan resistor pada pin-pin tertentu (lupa persisnya) dan menggunakan power supply external yang mampu supply arus hingga 1 ampere. Tetap saja, flashing-nya sering gagal. Adakah yang punya pengalaman yang sama? Bagaimana cara mengatasinya?

Modul NodeMCU merupakan modul ESP-12 yang sudah dilengkapi dengaan CH340 USB to Serial Converter. Pengalaman saya menggunakan modul NodeMcu berjalan mulus, tidak ada masalah dalam flashing. Ada beberapa cara untuk menggunakan ESP8266, yaitu:

  1. Lua. Merupakan bahasa scripting yang kecil dan ringan untuk aplikasi embedded systems. Tentu saja untuk menggunakan Lua, ESP8266 harus diprogram firmware interpreter Lua. Panduannya bisa dilihat di sini. Metode ini cukup mudah digunakan.
  2. AT command. Untuk menggunakan AT command, install firmware AT command seperti dalam tutorial ini. Metode ini juga mudah digunakan. Namun tidak semua kemampuan ESP8266 bisa dieksplor
  3. C++ dengan Arduino IDE. Metode ini menggunakan Arduino IDE yang sudah cukup familiar bagi pegiat elektronika. Yang perlu dilakukan adalah mengunduh library ESP8266, seperti dalam panduan ini. Ada cukup banyak contoh-contoh aplikasi yang disertakan dalam library tersebut. Metode ini memiliki tingkat kesulitan lebih tinggi daripada AT command, tapi kita punya kebebasan untuk customize operasi dan fungsi ESP8266. Dan metode ini yang saya gunakan untuk membuat prototipe kendali lampu secara wireless dalam mesh network.
  4. SDK ESP8266. Metode ini memiliki tingkat kesulitan paling tinggi, tapi kita punya kebebasan seluas-luasnya untuk memprogram ESP8266. Salah satu panduan untuk memulai menggunakan SDK ESP8266 bisa dilihat di sini.
  5. PlatformIO. Ini juga menggunakan bahasa C dan library seperti pada Arduino IDE, namun dengan IDE (editor, code completion, library management) yang lebih baik. Saya sedang mencoba install tool ini.


Awalnya saya coba implementasi mesh network menggunakan library easyMesh. Saya mulai dengan contoh program examples/demoToy. Program ini memasang easyMesh, webserver dan websocket dalam ESP8266 sedemikian hingga tiap node akan langsung gabung dalam mesh network yang terjangkau. Selain itu, websocket memungkinkan laptop atau HP kita sebagai Station yang terkoneksi ke AP ESP8266, dan melakukan komunikasi secara kontinyu.  Namun dari pengalaman saya koneksi ke AP ESP8266 tidak handal dan sering kali disconnect. Penyebabnya mungkin karena implementasi easyMesh yang secara rutin melakukan scanning mencari network, sehingga koneksi yang sudah ada menjadi terputus. Library easyMesh ini juga sudah cukup lama tidak ada update, terakhir update 25 Agustus 2016.

Kemudian saya menemukan library painlessMesh yang dibangun berdasarkan easyMesh, namun telah mengalami perbaikan-perbaikan. Jadi saya coba pakai library painlessMesh, webserver, dan websocket ke modul ESP8266. Hasilnya adalah seperti dalam video demo di bawah ini **. Sekedar informasi tidak penting, lampu yang saya gunakan tersebut adalah lampu depan motor saya yang sudah rusak salah satu filamen nya. Dalam sebuah lampu depan motor itu ternyata ada dua filamen, satu untuk menerangi jauh ke depan, dan satu lagi menerangi jarak dekat. Begitu juga dengan lampu belakang, satu filamen untuk lampu malam dan satu filamen lainnya untuk rem. Saya baru tahu ini waktu mengganti lampu motor saya :). Kembali ke video, rangkaian dalam demo ini sangat sederhana. Lampu tersebut di drive  menggunakan transistor NPN Darlington TIP122, dan diberi supply 12 volt. Output PWM dari pin D1 ESP8266 yang berfungsi mengatur tingkat kecerahan lampu dihubungkan seri dengan resistor 10 kOhm dan kaki basis TIP122. Modul NodeMcu tersebut digunakan secara standalone, yaitu berfungsi menghandle protokol WiFi dan sekaligus berinteraksi dengan dunia luar (dalam hal ini mengendalikan lampu) melalui pin input/output nya. Jadi kita tidak perlu menggunakan mikrokontroler tambahan.

Dari hasil observasi, dapat saya laporkan bahwa koneksi websocket antara laptop ke node ESP8266 kadang-kadang mengalami gangguan dan terputus. Masih perlu ditelusuri lagi apa penyebabnya. Sedangkan koneksi antar node terlihat lebih reliable, dengan sesekali mengalami disonnected. Namun tidak sesering saat menggunakan library easyMesh.

Dalam demo ini hanya digunakan dua buah node. Tugas ke depannya adalah mencoba menambahkan lebih banyak node lagi, dan mengevaluasi seberapa reliable koneksi nya dan  seberapa jauh jangkauan mesh network ini.

Bagi yang membutuhkan modul WiFi NodeMcu ESP8266, bisa ke sini:


*: Tanggal 12 September 2017 lalu saya mengikuti seminar Microchip / Atmel. Di situ saya baru tahu tentang teknologi LoRa, yang memiliki ciri long range, low data rate, dan low energy. Teknologi LoRa mengklaim bisa menjangkau hingga jarak 15 km dengan adanya line of sight. Saya tidak  tahu seperti apa performa nya dalam lingkungan indoor.


[Raspberry Pi] Installing piCore 9.0

At this moment, I have played with my Raspberry Pi B for quite some time. Instead of using the standard Raspbian Jessie OS, I am curious about running alternative OS. I am looking for something much simpler than the full featured Raspbian Jessie. The reason I am doing this is because I want to comprehend the internal working of embedded Linux. I aim to understand the detail processes of building the Linux OS, and steps involved from power-on, running user apps, until power-off. I suppose the simpler the system, the easier to learn. Back to the alternative OS, it should be lightweight and fast to boot up. One of the options that I encounter — and looks promising — is piCore. It is the Raspberry Pi porting of TinyCore OS.

Here I describe how I install piCore 9.0 on my Raspberry Pi B. compressed image is downloaded from here. Extract it and you will have a 51.4 MB piCore image. According to the official installation guide the image can be extracted directly on SD Card using dd command on Linux or Win32 Disk Imager on Windows. However, my SD card already contains the Raspbian Jessie (using NOOBS image), and I still want to keep it there. So, I am trying to copy the image contents manually in a way that the Raspbian sits still on my SD Card. Later, I can revert back to the Raspbian Jessie. This workaround will just work because of the booting  mechanisms of NOOBS installation. A nice explanation can be found here.

First, go to the directory containing the image and issue fdisk -l piCore-9.0.img command to list the partitions and its corresponding start sector.

Disk piCore-9.0.img: 49 MiB, 51380224 bytes, 100352 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0009bf4f

Device          Boot Start    End Sectors Size Id Type
piCore-9.0.img1       8192  77823   69632  34M  c W95 FAT32 (LBA)
piCore-9.0.img2      77824 100351   22528  11M 83 Linux

It can be seen that the unit sector size is 512 bytes, and there are two images. So, create two directories for mounting those two images, let’s say: mkdir picore_1 and picore_2. Then mount the images on the created directories:

sudo mount -o loop,offset=$((512*8192)) piCore-9.0.img ./picore_1
sudo mount -o loop,offset=$((77824*8192)) piCore-9.0.img ./picore_2

picore_1 contains the Linux kernel, Device Tree Blobs, initramfs, and booting parameters. All of them will be copied in the /boot partition on my SD Card. But, before copying, I have created a directory /boot/rpi-boot and moved all the exisiting files in /boot to /boot/rpi-boot. By doing so, I can still use the Raspian OS in the future by moving them back into the parent directory, i.e. /boot.

picore_2 only contains a single tce directory. It is copied to /root partition on my SD Card. Now, the SD Card can be put on the Raspberry Pi, and power-on the board. If everything goes well, piCore will boot into command line mode. To install TC desktop packages, issue: tce-load -wi TC. It will download all necessary packages from the repository. Surely, this assumes that internet access has been provided via LAN connection. After downloading has finished, issue command -b to make all settings persistent. So the settings will be automatically loaded on next boots.Now, we can fire up the desktop mode by issuing startx.

Next time we reboot piCore it will automatically go into desktop mode. The video below shows the piCore booting on my Raspberry Pi B. Note that I have enabled showapps boot parameter in /boot/cmdline.txt so that the loaded modules get printed on the screen. It is surprising to me that the overall booting time is not faster than that of Raspbian OS. It is even slower, I think.

At the time of this writing, available apps ported to piCore are still very limited. The only web browser you can install is Dillo 3. Not much can be explored as an end-user. Previously I am thinking to run Firefox or Chromium to compare the performance when run in Raspbian OS, since piCore is advertised to be fast due to its operation that is fully run in RAM.

I also compare the content of /boot partition of Raspbian Jessie and piCore. I found out that there is no initramfs in the Raspbian Jessie. I suppose it is bundled into the kernel image.

It is worth to mention that for unknown reasons sometimes the extended modules do not get loaded during boot-up. And no information whatsoever is spilled out to notify this situation. It try to change the boot parameter to waitusb=5 for example, to give (indirectly) time for the SD Card to get ready. Although I have not done an exhausted test, but it seems to work. Still, I am not sure whether it is the root of cause.

In the meantime, I am still running buildroot to automate the building process of another Linux (official RPi) for my Raspberry Pi. It does take a long time since all the source codes are downloaded from the repositories and then get compiled. Can’t wait to see the result!

Building Embedded Linux for Use in QEMU

In the last couple of weeks, I had been reading books about building embedded Linux systems: Embedded Linux Primer and Building Embedded Linux Systems. The former is a good start to get familiar with the world of embedded Linux. While I found the latter provides more detailed technical steps to build embedded Linux systems. I have walked through the steps given in the latter book, but it was unsuccessful due to toolchain version incompatibility. Having tried to update the tool versions, I still couldn’t get it built successfully.

After googling for a while, I found this nice tutorial. By following the guide, I managed to build Linux kernel 4.4.0 and rootfs image which was populated using Busybox. They were then run on QEMU emulating Versatile Express Development Board.


The feeling to see the screen above for the first time was priceless.. You know what I mean 🙂

One small note about the tutorial above is that there is a change on the link of Linaro ARM compiler. The link below is that I refer to:

Also, in the steps of building the Busybox, the tutorial missed the install command which should be invoked after compile step (make -j4). So I used this command:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make install

The above command effectively create and populate a directory called _install, whose contents that will be copied in our root file system.