# AM335x/Beaglebone Black IOT BSP How-to
持續更新
[TOC]
## 前言
這個主要是紀錄TI AM335x/Beaglebone black作為信號收集器的開發過程以及可能遇到的問題
## AM335X boot option(Beaglebone Black)
boot option在正常開機來說是
eMMC(MMC1) -> SD Card(MMC0) -> USB0(RNDIS) -> UART0
當按著S2開機時,會是
SD Card(MMC0) -> USB0(RNDIS) -> UART0 -> eMMC
## BSP Requirement
一個BSP Image內容主要分為bootloader, kernel, rootfs, 以及rootfs上面的system services, user profiles, network configuration等
基本上,原始的AM335x開發板會有SD卡槽和eMMC flash,同時也支援從TFTP下載的方式去將系統寫進eMMC。
信號收集器一般而言不會有SD卡的卡槽,因此只能透過TFTP boot把系統的image寫進去eMMC。
TI提供的寫入image工具有以下兩種
- for Window: [CCS Uniflash5.0](https://processors.wiki.ti.com/index.php/Category:CCS_UniFlash)、[CCS Uniflash 3.4.1](http://software-dl.ti.com/dsps/forms/self_cert_export.html?prod_no=uniflash_3.4.1.00012_win32.zip&ref_url=http://software-dl.ti.com/ccs/esd/uniflash/)
- for Linux: TFTP boot /CCS Uniflash

從上圖來說,主要有兩種image需要製作
1. flasher program/Image: 這個的功用主要是經由USB/Ethernet把Flasher image載入AM335X的RAM/DDR,並且開機,開機完後便會開始把Flasher Image所包含的Images寫入eMMC中
2. System Image:真正在eMMC運作的系統映像檔,會藉由flasher.sh來寫入
基本上,在flash mode的時候,AM335X是會被當成一張Linux RNDIS網卡來看。
### flasher program/image
內容主要有以下組成
- MLO(SPL)
- u-boot.img
- Linux Kernel Image
- customized flasher file system(ramfs)
- customized debrick script(flasher<span>.sh)
### System Image
內容有以下組成
- MLO
- u-boot.img
- Linux kernel
- rootfs
### Setting steps of Ubuntu as a tftp server
- Host OS: Ubuntu 12.04
之所以選擇12.04,是由於其Network interface naming rule還是以eth0/eth1/usb0等等去命名,而不是動態依據device所連接的interface去命名
- 前置步驟:安裝以下package
sudo apt-get install isc-dhcp-server tftpd-hpa xinetd
- Edit BOOTP/DHCP Server(/etc/dhcp/dhcpd.conf)
這個設定主要是給BOOTP Client從192.168.2.2~192.168.2.100的IP位址範圍,TFTP server通常會是192.168.2.1
```script=
# /etc/dhcp/dhcpd.conf
## bootp subnet declaration
subnet 192.168.2.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.2.2 192.168.2.100;
if substring (option vendor-class-identifier, 0, 10) = "AM335x ROM"
{ filename "u-boot-spl-restore.bin"; }
elsif substring (option vendor-class-identifier, 0, 10) = "DM814x ROM"
{ filename "u-boot-spl-restore.bin"; }
elsif substring (option vendor-class-identifier, 0, 17) = "AM335x U-Boot SPL"
{ filename "u-boot-restore.img"; }
else { filename "zImage"; }
range 192.168.2.101 192.168.2.199; }
```
- Setup TFPT server(edit /etc/xinetd.d/tftp)
寫入底下設定內容後,裡面server_args主要是定義tftpboot的folder在哪邊,其實可以自己去定義
```script=
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
}
```
- 設定tftpboot folder
```script=
sudo mkdir /tftpboot
sudo chmod -R 777 /tftpboot
sudo chown -R nobody /tftpboot
```
- 設定/etc/default/isc-dhcp-server
```script=
#INTERFACESv4="HOST_NET_INTERFACE INTERFACE_OF_AM335X_Device"
INTERFACESv4="eth0 usb0"
```
- 重新啟動服務
> systemctl restart isc-dhcp-server
> systemctl restart tftpd-hpa
- 其他設定1
```script=
# /etc/NetworkManager/dispatcher.d/99am335x-dhcp-server
#!/bin/sh
IF=$1
STATUS=$2
if [ "$IF" = "usb0" ]&&[ "$STATUS" = "up" ] ; then
service isc-dhcp-server restart
fi
```
- 其他設定2
新增以下內容
```script=
# /etc/network/interfaces
allow-hotplug usb0
iface usb0 inet static
address 192.168.2.1
network 192.168.2.0
netmask 255.255.255.0
broadcast 192.168.2.255
up /etc/network/if-up.d/usb-interfaces
```
- 其他設定3
```script=
#/etc/network/if-up.d/usb-interfaces
#!/bin/sh
if [ "$IFACE" = usb0 ]; then
service isc-dhcp-server restart
fi
```
- 其他設定4
```script=
#/etc/NetworkManager/NetworkManager.conf
[main]
plugins=ifupdown,keyfile
dns=dnsmasq
no-auto-default=9A:1F:85:1C:3D:0E,
[ifupdown]
managed=true
```
### u-boot(bootloader)
u-boot需要加入TFTP boot的機制
而需要去擴增**BOOT_TARGET_DEVICES**的Macro
可以參考[這邊](https://www.twblogs.net/a/5cacfc90bd9eee2e850fb03d)了解其機制。
針對C的巨集(Macro),需要了解的是#的用法,當巨集定義為
```C=
#define Peval(cmd) printf(#cmd ":%g\n", cmd);
Peval(list[0])
//Peval(list[0])會展開為
//printf("list[0]"":%g\n", list[0]);
//前置處理器會把字串自然合併
//printf("list[0]:%g\n", list[0]);
```
這時#cmd會被視為文字輸出。
如果要連結兩個字串外的東西,則可以使用##
```C=
#define TEST(name) name ## _list
TEST(good)
//會被解成 good_list
```
### Linux Kernel
### Rootfs
#### 注意事項
init.d script echo message: 由於echo是印到stdout,所以先要在rootfs的dev下面
mknod -m 600 console c 5 1
mknod -m 666 null c 1 3
之後boot up才會把script的message印出來
### System Services
### User Profiles
### Network Configuration
## Task to Complete
### Basic System Build
### System Service Build
### TFTP Boot
TFTP用在embedded target board上面算是很常見的手段
- Target Board Driver as network device
- Flash to eMMC
## Linux Network Statck
之所以會有這一段,是因為產品會使用PRU來作為Ethernet接口的輸入,而需要把中間的Network stack給補足
###### tags:`TI AM335x` `Beaglebone Black` `DevelopingNotes`