Update BIOS for X1 Carbon

忽然想给用了一年多的 X1 Carbon 升级一下 BIOS,但没有 Windows 系统让这个任务变得有点难。

缘起

原来的 BIOS 版本号是 2.56,现在最新的已经是 2.69,而且看到 Changelog 中有好多不错的更新,总是喜欢刷机的我自然不会放过这次升级。下载下来的升级包一种是在 Windows 下面直接运行的,一种是启动光盘。自然后者是较好的选择,剩下的问题就是如何启动这个光盘映像了。

启动盘

grub-imageboot

最先尝试的一种方法就是 grub-imageboot,因为我知道 GRUB 自己就支持启动 ISO 影响,这种方法应该没有什么问题。

$ sudo apt-get install grub-imageboot
$ sudo mkdir -p /boot/images
$ sudo cp /your/downloads/my.iso
$ sudo update-grub

这样就可以在 GRUB 启动菜单里面增加一个启动项,重启选择这个启动项就应该可以了。可这种方法启动后竟然提示无法识别命令 linux16。原来在 UEFI 的环境下,GRUB 根本不知道 linux16 命令,也就是无法运行 16 位的代码,自然这条路就走不通了。

El Torito

现在只好把系统的启动模式设置为 Legacy/UEFI 双模式,然后想办法用 USB 盘启动。一种方法就是将光盘中的 El Torito 记录读出来写入 USB 盘,然后用 USB 启动。

$ geteltorito my.iso > biosupdate.img
$ sudo dd if=biosupdate.img of=/dev/sdb bs=512K

可这种方法读出来的 img 文件只有 512K,感觉并不对,而且也无法启动。那个 ISO 文件不知道是什么格式,使用 mount 命令也看不到里面的内容。只好再换别的办法

grub4dos

只好拿出了久违的 grub4dos,先是对 USB 盘进行分区,然后用 sudo ./bootlace.com /dev/sdx 来写入引导记录,然后拷贝过去 grldr,并编写一个 menu.1st 文件:

title thinkpad-bios
map (hd0,0)/my.iso (hd32)
map --hook
chainloader (hd32)
boot

可惜刚开始的时候我一直把 /dev/sdb 写成了 /dev/sdb1,结果一直报错说不正确的分区表,害的我浪费了很多时间。最后终于写对了,然后成功启动了光盘映像。

更新 BIOS,恢复 Linux 启动

更新 BIOS 的过程并不复杂,可到了最后重启前的一个提示让我出了一些冷汗:将光盘留在光驱里面,按回车启动电脑。我使用的是虚拟的光盘,难道重启还需要使用光盘的内容?不过事实是并不再需要那个光盘,BIOS 会在下一次启动的时候更新 BIOS 和 ECP 的固件。

BIOS 更新成功后继续重启,结果还是出了问题,系统自动进入了 Windows 的系统恢复,原因是我的恢复分区没有删除,而 BIOS 只能找到这唯一的启动条目。此时我还没有意识到更新了 BIOS 后,UEFI 的启动列表就没有了,而缺省的启动程序是 EFI/Boot/bootx64.efi,而它只会启动 Windows 类型的操作系统。

此时我只好关机想办法如何能启动到 Linux 系统中。好在我还有一台 Ubuntu 的主机,我用它做了个 Ubuntu 的安装启动 USB 盘,不过这个启动盘是 i386 架构的,启动之后也无法运行我原来系统的程序,efibootmgr 也显示找不到 UEFI 的信息。这时候我没有意识到的是在非 UEFI 下启动,无论如何也访问不到 UEFI 信息。

之后的想法是在 USB 盘上安装 grub,用这个 grub 引导我原来系统的 Linux 操作系统。用到的 grub 命令如下:

# grub-install --force --no-floppy --boot-directory=/mnt/USB/boot /dev/sdx

自然在别的机器上安装的 grub 无法启动 X1 的系统,直接进入命令行界面

grub> insmod part_gpt
grub> set root='(hd1,gpt3)'
grub> linux /boot/vmlinuz root=/dev/sda3
grub> initrd /boot/initrd.img
grub> boot

系统成功启动,但依然是无法使用 efibootmgr 命令更新 UEFI 信息,唯一的办法就是把 grubx64.efi 复制到 EFI/Boot/bootx64.efi 然后重启,终于看到了原来的系统启动菜单,登录后再运行 update-grub2,加入了 UEFI 的启动项。更新 BIOS 的工作才算最终完成。

Using TinyVZ

买了 15 刀一年的 VPS,基于 OpenVZ 技术

购买

购买 TinyVZ 需要有国际支付手段,我使用 Paypal,自动兑换汇率,还是比较方便的。支付完成后需要 3 个工作日才可以获得登录的密码,通过他们提供的 IP 地址用 vz:vz 登录,然后再输入用户名和密码就可以获得 VPS 的 root 终端。

安装操作系统

初次登录安装的操作系统是 Debian 6.0,喜欢追新的我立刻给换成了 Debian 7.0,但由于是基于 OpenVZ 技术,Linux 内核还只能是 2.6.26。更新操作系统的过程是使用网页上的 Web Console,选择 Reload OS,此时可供选择的有多个操作系统,选定后 60 秒内就可以安装完毕。

配置服务

ssh 服务

# apt-get install openssh-server

使用 ssh 服务不但可以直接登录到 VPS 中,而不需要通过 vz:vz 那个服务器的中转,还可以实现端口的动态转发,搭建一个 SOCKS 服务器。

pptpd 服务

SOCKS 服务器只能给浏览器使用,最好能实现个 VPN 服务器,第一个实现方案是用 PPTPD 服务。安装和配置过程还比较简单,只要安装 pptpd 和 iptables,并修改 ppp 的几个配置文件就可以了。具体的设置方法网上有很多,但安装完毕却一直出现如下错误:

GRE: read(...) from PTY failed...
CTRL: PTY read or GRE write failed (pty,gre)=(6,7)

我在自己的主机上配置 PPTPD 竟然也出现同样的错误,有人说是 GRE 穿透路由的问题,也许是目前的网络环境不允许 GRE 包通过。这个有时间再慢慢检查一下。

openvpn 服务

OpenVPN 的服务已经搭过多次了,家里的路由器就使用 OpenVPN 实现与实验室电脑的共享上网。但在 VPS 中还是出了问题。建立隧道连接没有问题,但通信过程非常不稳定,只是偶尔可以 ping 通远程的服务器,基本属于不可用状态。

而且 iptables 的 MASQUERADE 好像不好使,必须使用 SNAT,例如:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to MYVZIP 

其它 服务

apache 服务安装后就不能启动,说是 ports.conf 中语法错误,但实际的原因是 libapr1 使用了比较新的内核接口,必须重新编译安装 libapr1 才可以。

# apt-get source libapr1
# cd apr-1.4.6/
# dpkg-buildpackage

编译失败在最后的 test 部分,不理它,直接进入到 build-i386 目录然后 make install 安装成功,然后就可以启动 apache 了。

不过 apache 运行过程还是不顺利,错误信息为:Resource temporarily unavailable: apr_thread_create: unable to create worker thread,好像是 VZ 环境下不允许开太多的 Thread。当然这点也要继续确认,不过还是放弃了使用 apache,正好可以试用一下 nginx。

nginx 的安装还是比较顺利了,直接 apt-get 安装好就可以正常使用了。

OpenWRT, wireless freedom

OpenWRT 是一款开源的 Linux 发行版,主要用于各种无线路由器

Tp-link WR703N

入手

入手流行的 TL-WR703N 当前软件版本是 3.15.2 Build 130321 Rel. 37153n,硬件版本 v1。直接用 web 界面升级 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin。然后在主机上执行 dhclient eth1 没有反应,重启硬件 dhclient eth1 还是没有反应,由于 OpenWRT 网站上说过成砖的先例,以为这次悲剧了。直接

$ ifconfig eth0 192.168.1.100

ping 有反应,telnet 没有问题

telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
=== IMPORTANT ============================
 Use 'passwd' to set your login password
 this will disable telnet and enable SSH
------------------------------------------
BusyBox v1.19.4 (2013-03-14 11:28:31 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.
 _______                     ________        __
|       |.-----.-----.-----.|  |  |  |.----.|  |_
|   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
|_______||   __|_____|__|__||________||__|  |____|
         |__| W I R E L E S S   F R E E D O M
-----------------------------------------------------
ATTITUDE ADJUSTMENT (12.09, r36088)
-----------------------------------------------------
 * 1/4 oz Vodka      Pour all ingredients into mixing
 * 1/4 oz Gin        tin with ice, strain into glass.
 * 1/4 oz Amaretto
 * 1/4 oz Triple sec
 * 1/4 oz Peach schnapps
 * 1/4 oz Sour mix
 * 1 splash Cranberry juice
-----------------------------------------------------
root@OpenWrt:/#

初始配置

缺省情况下 WLAN 是关闭的,而且 bridge 到了 lan 端口(Bridged AP Mode) ,想设成常见的路由模式(Routed AP Mode),在它的 WEB 界面上配置了半天也没有搞定,最后还是直接修改配置文件。参考 http://wiki.openwrt.org/doc/recipes/routedap

允许 ssh 访问 wan 端口

It is real simple, just add to following to /etc/config/firewall:

#open ssh on wan interface
config rule
       option src              wan
       option dest_port        22
       option target           ACCEPT
       option proto            tcp

And restart the firewall:

# /etc/init.d/firewall restart

安装 NFS

703N 的 Flash 只有 4M,我又不想在上面接个 U盘,于是只有使用 NFS

# opkg install nfs-utils kmod-fs-nfs
# mount.nfs ip:/path /mnt

安装完 NFS 剩余的空间就只有300K左右了,以后的东西必须都要安装到 NFS 上,于是修改 opkg.conf 增加

dest mnt /mnt

以后就可以用 -d mnt 安装到 /mnt 目录了。

安装 openvpn

安装的过程比较简单

# opkg install kmod-tun
# opkg -d mnt install openvpn

配置就比较麻烦了,折腾了一天半,记得的主要如下:

1.增加一个接口

config interface 'vpn'
       option ifname 'tun0'
       option proto 'none'

2.配置防火墙

config zone
       option name 'vpn'
       option network 'vpn'
       option input 'ACCEPT'
       option output 'ACCEPT'
       option forward 'ACCEPT'
       option masq '1'
config forwarding
       option dest 'vpn'
       option src 'wlan'

3.配置文件 把 wrt.crt, wrt.key, ca.crt 放到路由器上,openvpn 配置文件如下

package openvpn
config openvpn custom_config
    option enabled 1
    option client 1
    option dev tun
    option proto udp
    list remote "ip地址 1194"
    option resolv_retry infinite
    option nobind 1
    option persist_key 1
    option persist_tun 1
    option ca /mnt/etc/openvpn/ca.crt
    option cert /mnt/etc/openvpn/wrt.crt
    option key /mnt/etc/openvpn/wrt.key
    option comp_lzo 1
    option verb 3
    option mute 20

4.将 mount.nfs 命令和 /etc/init.d/openvpn start 写到 /etc/rc.local 里面

改装 MW151RM

wr-703n 在家里一直用,不能拿来玩,出差的时候买了个 MW150RM,结果被我弄成砖了,后来一直不死心,就买了个 MW151RM。这个 MW151RM的电路板和 wr-703n 一模一样(后来发现接上串口线后显示的信息都还是 tp-link),只是没有焊 USB host相关的器件。

改装的过程并不复杂,不过由于技术不精却没少了波折。主要过程如下:

  1. 将 DDR 内存从8M换成64M
  2. 将 Flash 从 2M 换成 8M
  3. 写入新版的固件

其中 DDR 内存的来源是海龙淘来的内存条,把内存芯片吹下来,再焊到路由器上。可把内存从路由器上吹下来的时候好几个焊盘都翘起来了,好在没有断,还可以修补,最终焊好内存顺利启动。

把 Flash 焊下来之后去找张老师读取里面的内容,结果发现读出来的数据不对,怀疑芯片坏了。然后再把这个 2M Flash 焊上去的时候发现板子无法启动了,以为芯片果然坏掉了。这样里面的 ART 数据岂不是读不出来了?按照 openWRT 网站上的说法,这个路由器就废了。

不过我还没有死心,利用家里 wr703n 的固件,直接写到 8M Flash 上面,然后焊到 151RM 上,结果依然无法启动,串口也没有任何输出。

再把原来的固件 Flash 焊上去,依然无法启动,抱着死马当活马医的态度,把 64M 内存重新用烙铁烫了一遍,结果奇迹出现,板子可以启动了,无线也正常。

再把 8M 的 Flash 焊上去,同样可以启动,而且由于利用了家里 wr703n 的固件,手机直接就连上了。看来用同型号的 ART 也没有问题。

先把板子装回盒子,玩几天再说

修改 MAC 地址

由于使用了 wr-703n 的固件,目前 MAC 地址和 703n 一样,通过分析 u-boot.bin 发现 MAC 地址写在 0x1fc00,这也通过网络获得了证实。不过修改 MAC 之后重写 flash 却无法启动 wifi。重新读取了原 flash,总算把 ART 读了出来,换上去之后还是无法启动 wifi。通过多方组合,发现只有 703n 的 MAC 可以启动 wifi,其它的都不行,于是开始怀疑固件。

因为固件是从路由器里面 dump 出来的,所以一些配置信息也被复制过来,原来是 /etc/config/wireless 的配置文件的问题。将里面的 mac 地址同步修改了之后就可以正常启动了。

TTL 串口

对路由器的调试必须有串口的支持,板子上的 TP_OUT 就是串口的 TXD,TP_IN 就是 RXD,在启动路由器的早期快速输入 tpl 可以进入 u-boot 界面。 增加 USB Host

硬件改动:

  1. 加焊usb接口
  2. R101 R102 焊 22ohm 电阻(0402 的还是挺难焊的)
  3. R112 焊 0ohm 电阻

软件改动:

# opkg install kmod-usb-storage block-mount block-hotplug kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 kmod-nls-utf8

然后还装了 3G 和摄像头的驱动,有空可以试试

# opkg install kmod-video-uvc kmod-usb-serial-wwan

编译安装 trunk

首先下载最新代码

$ git clone git://git.openwrt.org/openwrt.git

配置界面和 buildroot 类似,选择了 tl-703n 的缺省配置,直接 make 就可以生成最后的 bin 包。把 sysupgrade 包拷贝到路由器的 /tmp 目录,然后执行

# sysupgrade openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin

升级非常顺利:

BusyBox v1.22.1 (2014-08-13 11:11:21 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 CHAOS CALMER (Bleeding Edge, r42131)
 -----------------------------------------------------
  * 1 1/2 oz Gin            Shake with a glassful
  * 1/4 oz Triple Sec       of broken ice and pour
  * 3/4 oz Lime Juice       unstrained into a goblet.
  * 1 1/2 oz Orange Juice
  * 1 tsp. Grenadine Syrup
 -----------------------------------------------------
root@OpenWrt:~#

Hands on Launchpad G2

前两天的 FPGA 展会上拿到了 TI 的“口袋实验室”,其中包含基于 MSP430 的 Launchpad。

工具

TI 的首要工具自然是 CCS,但我还是喜欢免费的跨平台解决方案。TI 提供了 energia 这个开源工具,有点类似于 Arduino 的开发环境,打开界面就是编写 Setup 和 Loop 两个函数,这个也不太对我的胃口。

sf.net 有一个 mspgcc 的开源项目,但提供的只是补丁,集成起来比较麻烦。好在 github 上有人写了一个安装脚本,只要克隆这个项目并执行 install-all 就可以了。mspgcc 会被缺省安装到 /usr/local/msp430 目录。

$ git clone https://github.com/jlhonora/mspgcc-install.git
$ cd mspgcc-install
$ ./install-all

编程和调试工具是 mspdebug,直接 make 就可以安装,然后执行

$ sudo mspdebug rf2500

可以得到一个交互界面,运行 prog blinky 把我写的 blinky 代码写入到处理器,然后运行 run 就可以运行程序。或者也可以直接运行下面语句进行编程:

$ sudo mspdebug  rf2500 "prog ./blinky"

硬件

Launchpad 的硬件资源不多,只有两个 LED 灯和一个用户按键,但另外一块“口袋实验室”的硬件资源就丰富多了,比较醒目的就是它的那个 128 段液晶显示器了。不过这个液晶并不是 CPU 自己控制,而是通过 I2C 控制的一个 IO 扩展芯片来控制 LCD 控制器。呜呼,好麻烦。

Hands-on the BeagleBone Black

刚刚购买了 BeagleBone Black 中国版,安装和调试的过程记录

初上手

在淘宝上购买了包含 4.3 寸 LCD 的 BeagleBone Black(以后称作 BBB)开发板,到手后直接上电,发现板子运行的是 Debian 系统,而且运行了 avahi 服务,可以直接使用下面的命令登录,其中 root 的密码是空,同时板子的网口也必须接好网线。

接上 USB Client 接口之后会识别出一个 U 盘和一个串口,通过 U 盘可以非常方便的和开发板交换文件。

预安装的发行版是 BeagleBone 的官方版本,并不支持这次购买的一系列外设,因此根据淘宝上提供的资料,下载了商家提供的文件系统。商家提供的是一个 img 文件,通过 dd 命令可以写入到 TF 卡中,然后按着“启动选择”按钮接通电源,系统就可以从 TF 卡启动(否则是从板载的 eMMC 存储器启动)。

为了使用 LCD 屏,还必须更换启动时使用的 dtb 文件,商家提供了一个 test_lcd4.3 命令来完成。重启开发板后,LCD 还是没有亮,突然意识到可能是 USB 供电不足,接上一个 5V 电源之后再启动就没有问题了。

文件系统结构

无论是 eMMC 存储还是 TF 卡,文件系统的组织结构都是类似的。首先 mmc 必须分成两个分区:一个是 VFAT 格式,保存了 MLO,u-boot 和 uImage;另一个是 Linux 格式,是最终的 root 文件系统。

官方支持的文件系统安装方式是从网站下载文件名带 flasher 的 img 映像,写入 TF 卡并用这个卡启动后就会自动把文件系统写入到 eMMC 中,如果做自己的写入工具,就必须对这个映像进行修改。网上可以找到一个 emmc_prepare.sh 脚本做这件事,实际上就是更新第二个分区里面 build 目录中的 MLO 等文件,并更新脚本中的 MD5 校验。

BBB 板的启动过程是首先内部的 ROM 执行,然后会根据 Boot 管脚的设置按照一定的顺序查找启动介质(通过启动按钮可以改变这个顺序,也就是使用 TF 卡启动的原理),如果是 MMC 卡启动就会从里面的 VFAT 分区里面找到 MLO(称为 x-loader)加载到 SRAM 中执行;而 MLO 会进一步加载 U-Boot 到 DDR 内存启动;最后才会由 U-Boot 启动 Linux 操作系统。

使用 buildroot 生成文件系统

官方的文件系统无论是基于 Debian 的还是基于 Angstrom 的,都要超过 1G 空间,给出的映像文件都大于 2G,因此至少要 4G 的 TF 卡才能安装。而如果使用 buildroot 就要精简多了。生成的文件系统只有几兆大小,比较适合教学使用。

首先下载了 buildroot-2014.05 的稳定版,里面就有对 beaglebone 的支持,因此只要执行:

$ make beaglebone_defconfig

就可以获得一个基本的配置,只要在这个基础上修改就可以了。

  1. 首先使用了 Linaro_2014.02 版本的工具链,减少下载和编译工具链的时间
  2. 文件系统设置为读写方式
  3. 增加了 dropbear 等软件
  4. 选择 tar.gz 格式的文件系统

最后生成的包括 MLO,u-boot,zImage,dtb 文件 和 root.tar.gz。

清空 TF 卡两个分区的内容,把 MLO,u-boot.img,zImage,dtb 文件放到 vfat 分区,再把 root.tar.gz 解压到 ext2 分区。

还缺少的是 uEnv.txt 文件,这个是 U-Boot 的配置文件,里面可以写入 U-Boot 的配置信息,这个配置文件所涉及到的命令不是很熟悉,最后好不容易修改好后的样子是这样的:

console=ttyO0,115200n8

kernel_file=zImage

loadaddr=0x82000000
fdtaddr=0x88000000
fdt_high=0xffffffff

loadkernel=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${kernel_file}
loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdtaddr} /dtbs/${fdtfile}

loadfiles=run loadkernel; run loadfdt
mmcargs=setenv bootargs console=tty0 console=${console} ${optargs}\
${kms_force_mode} root=${mmcroot} rootfstype=${mmcrootfstype} noinitrd

uenvcmd=run loadfiles; run mmcargs; bootz ${loadaddr} - ${fdtaddr}

主要是根据 Debian 发行版带的 uEnv.txt 修改,去掉 initrd 部分得到的。

freedos hand-on

虽然不是第一次用 FreeDos 了,但……

简介

2012 年 FreeDos 推出了 1.1 版本,我就立刻把它装到了实验室的电脑上,但却发现了 Turbo C 2.01(免费版)不能正常使用,要么速度很慢(感觉比用 386 的时候都慢),要么就直接重启(使用某个内存驱动的时候)。一直没有找到真正的原因。

今天偶然的机会发现只要不加载任何驱动程序,TC 的运行就正常(奇怪当初没有尝试),看了一下 autoexec.bat,觉得加载的 FDAPM 有些不顺眼,就立刻将其注释掉,没想到问题就解决了,看来是 Turbo C 和 FDAPM 的冲突,不过要怎么解决呢?

后来在 freedos 的 maillist 上面询问了一下,Eric Auer 建议调用 FDAPM 的时候使用ADV:REG 参数,这样可以保证 FDAPM 不会过分的将 CPU 置于 IDLE 模式,对普通应用程序的影响就最小。这个改变的确解决了前面遇到的问题。

monitor the interface other than 802.3

从前只用 wireshark 监听过有线以太网,这次尝试一下其它接口。

问题描述

监听有线以太网比较简单,不需要特殊的设置,只要启动 wireshark 就可以自动把网卡设置在混杂模式下,可以监听到网线上的一切信息。但对于 wifi 就不一样了,一般情况下监听到只是用户数据,连以太网头部都是伪造的。

使用 aircrack

首先需要下载 aircrack,编译安装不在话下。之后的过程就比较简单了。

# ifconfig wlan0 down
# airmon-ng start wlan0

此时会多了一个 mon0 网络接口,启动 wireshark 监听这个接口就可以看到 802.11 协议的内容了。

如果能监听到握手数据包,再配合密码本,就可以使用 aircrack 来破解网络密码了,这个可以使用 aircrack 自带的示例报文 wpa.cap 来测试,如果要实际运用可能需要一个比较好的密码本。

恢复 wifi 功能

如果要恢复 wifi 上网,还需要执行下面的命令

# ifconfig mon0 down
# airmon-ng stop wlan0
# ifconfig wlan0 up

监听 USB 接口

USB 接口的监听(sniffer or monitor)在 Linux 操作系统中有很好的支持,只要加载 usbmon 模块(在 Driver/USB 下面)就可以了,不过需要内核支持 DEBUG_FS(CONFIG_DEBUG_FS 在 Kernel Hacking/Compiler options/Debug Filesystem 下面,这个太容易让人误解为对文件系统的调试了)。关于 usbmon 在内核文档中有详细的说明,我们只需要执行下面两步,就可以通过 wireshark 监听了。

# mount -t debugfs none_debugs /sys/kernel/debug
# modprobe usbmon

通过 lsusb 命令可以知道要监听的设备在哪条 USB 总线上,然后在 wireshark 中的接口列表中选择相应的总线即可。

使用 wireshark 监听到的并不是真正在 USB 总线上传输的电信号,而是从操作系统角度看到的 USB 的协议交互过程。比如可以看到读取描述符,读取配置信息,和对 USB 的配置进行设置等。最重要的是可以看到主机与 USB 的各个端点的通信过程,这对协议分析是最重要的。

需要注意的是,有时候可以看到 0 字节的 BULK IN 请求,这应该是主机软件提出了异步的输入请求,这样就可以同时进行两个方向的传输,提高 USB 总线的效率。

Install EmDebian to DIM3517

在闲置的 DIM3517 开发板上安装 Debian

开发板简介

DIM3517 是 SEED 公司推出的 AM3517 开发板,闲置很长时间了,今天准备拿它玩玩……

主机准备

由于使用了 multistrap 工具,所以主机上必须安装:

$ sudo apt-get install multistrap dpkg-dev

之后需要准备 multistrap 的配置文件,目前我的配置文件是这样的:

[General]
noauth=true
unpack=true
debootstrap=Grip
aptsources=Grip
[Grip]
# space separated package list
packages=netbase ifupdown iproute net-tools apt
source=http://www.emdebian.org/grip
suite=wheezy-grip

由于我参考的网页并没有 packages 那一行,结果生成的文件系统没有网络配置工具,也没有 apt 工具,造成接下来的安装非常麻烦,必须手工使用 dpkg 安装缺少的包。如果采用上面的设置就应该没有问题了。

接下来运行:

$ multistrap -a armel -d $PWD/debian -f multistrap.conf

就可以从网上下载并在 debian 目录下生成初始的文件系统了。

运行 Debian 系统

上面的过程仅仅是把安装文件展开,所有的包都还没有配置。为了完成配置过程,我把生成的文件系统复制到了 SD 卡上,然后重新启动开发板,希望可以登录到新的文件系统上。由于系统并没有配置,所以要在启动参数上加上 init=/bin/sh。可结果还是启动失败,系统显示:

warning: unable to open initial console

这是一个比较熟悉的问题,原因是 /dev/ 目录下没有 console 文件,建立好这个文件之后系统就可以正常启动了,之后需要运行:

# mount -t proc nodev /proc
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  dpkg --configure -a

可是这个过程也不顺利,dash 和 bash 都没有成功配置,通过网络搜索,找到了解决办法,需要先执行下面的命令:

# /var/lib/dpkg/info/dash.preinst install

终于都配置好了。但在重启系统之前还要再修改几个系统配置文件,这个过程是在另外一台电脑上直接修改 SD 卡上的文件的方法实现的。需要修改的文件如下:

  1. inittab 文件,增加在串口终端上的登录功能,即增加如下内容:
T0:23:respawn:/sbin/getty -L ttyS2 115200 vt100
  1. 去掉 root 用户的密码

再次启动的时候仍然失败,错误消息类似如下:

udevd[45]: unable to receive ctrl connection: Function not implemented

这个问题明显是 udevd 造成,网上没有特别好的解决办法,好像要升级系统的内核,但鉴于我现在升级内核比较困难,我直接删除了 udevd 文件,这样就可以启动系统了,只是没有了自动生成设备文件的功能。

接下来的配置过程就比较简单了。只要安装好了 apt-get,一切就和一个普通的 Debian 系统没有什么区别,只要 apt-get install 就可以把一切搞定。

Install Qt5.2.0 to Mac

在 Macbook Air 上安装 Qt5.2.0

从前 MBA 上安装的是 Qt4.7.4,今天下载了 5.2.0 版本,结果安装的过程竟然出了一些问题。

首先是安装过程出错,出错信息是

Command install_name_tool failed

一共出现两次,分别对应于一个 QtQuickMultimedia 和一个 QtBluetooth 的库,考虑到这两个部分可能不会用到,我选择了 Ignore 继续安装。

安装之后看起来都正常,结果 qmake 竟然也失败,说找不到 macx-clang 配置文件。使用

$ qmake -query

查询一下,发现 Qt 所默认的路径都是 /usr/local,和安装的路径选择不一致。于是在 /usr/local 下面建立了一个对于我安装目录的符号链接,具体的链接为

Qt-5.2.0 -> /Users/myuser/Qt5.2.0/5.2.0/clang_64/

Hands on mbed LPC1768

ARM 公司赠送的 mbed 开发板放在我的桌子上已经很长时间了,今天准备试试看

下载第一个程序

打开开发板的包装就可以看到一个只有 DIP40 大小的开发板,板上有一个 MiniUSB 的插头,显然这就是它的编程接口。可当我将开发板接上 USB 电缆,系统识别出来的竟然是一个 USB 存储器,这倒是一个不小的意外。通过打开存储器里面的 MBED.HTM 文件,就可以登录到 mbed 项目的官方网站,注册一个用户就可以使用在线工具编程开发了。

简单来说,使用 mbed 开发主要有三个步骤:

  1. 通过 USB 电缆连接开发板
  2. 使用在线开发环境进行编程,并最终生成二进制文件
  3. 将二进制文件放到 USB 存储器,按下板上复位按钮运行

mbed 的优点

mbed 的这种开发方式还是很新颖的,只用了几分钟的时间我就已经把第一个程序运行起来了。而作为用户,不用了解 ARM 芯片的任何知识,也不用了解编译器的相关概念,甚至在自己电脑上都不用安装任何新软件。所有的开发都可以通过浏览器完成,所有硬件的细节都被抽象成了用户 API,非常适合刚刚接触嵌入式的人士使用。

个人认为 mbed 比较适合高中生或者业余非专业人员使用,而对于专业嵌入式开发者可能会觉得它隐藏了太多的细节,更像一个玩具而不是一个开发工具。或者换句话说,专业人士如果使用 mbed,有一天碰见了一个高中生,那个高中生说:“我用的也是这个”,这或多或少会让专业人士少了些神秘感,甚至感觉有点“丢份”。就像一个 Linux Hack,要么只用 terminal,要么就使用一个平铺的窗口管理器,总之必须满屏幕是字符才会让他觉得有真正黑客的自尊。

不过 mbed 还是非常适合快速开发的。如果有一个项目工期很紧,使用 mbed 也不失好的选择。

离线开发

在线开发方式也不讨好专业人士,好在网站提供了离线的开发方法。在项目的右击菜单中有 Export Program 的选项,可以导出为 Keil,DS-5,GCC,IAR 等多种开发平台的工程,其中也包含 mbed 的链接库。因此即使使用离线开发工具,依然也可以使用 mbed 提供的 API,方便用户的开发。

离线的方式使用户可以继续使用熟悉的开发工具,而且同样可以把生成的二进制映像拷贝到 mbed 的存储器中,“自动”下载程序到处理器。

也就是说 mbed 所使用的二进制文件并没有特别的地方,那它的存储器是如何实现的呢?当它运行了我的用户程序后,存储器功能是否还存在呢?其实在 LPC1768 板子的背面还可以看到很多芯片,存储器的功能就是它们实现的。每次用户按下复位按钮的时候,这部分硬件就会把存储器里面的二进制程序通过 LPC1768 的 ISP 模式下载到芯片里面去。所以存储器的这部分功能一直是存在的,也并不是 LPC1768 这个芯片所实现。

最后要提一句的是这个板子在用了一段时间后竟然是温温的,难道主频 96M 有些高?这是我第一次使用唯一一个不太满意的地方。