2014年7月16日星期三

Flash Programer Based on STM32F103

前些日子需要写flash芯片,图便宜淘宝了个CH341A。可是拿回来以后才发现,这货只能在Windows下用,相当不方便。试着在Linux里用QEmu跑WindowsPE,因为写很慢所以丢在那里吃东西去了,回来发现CH341A和flash芯片都很烫,上机没反应,flash芯片烧掉了。

想要搞一个Linux下也能用的,股沟里扒拉半天,找到了dword这篇《Linux 下离线烧写 SPI 闪存》

电路层面的东西,我基本是十窍通了九窍的程度,不过电路图看着还算简单,于是各种长草啊。可dword特别强调,不能买USB只能供电或做ISP的板子,而淘宝上STM32F103虽多,但在USB这个问题上的表述大多是“预留通讯功能”。

各种翻资料还是没把握,干脆就给dword写了一封信求教,没想到居然收到了回信。好吧,这下子不造都有些过意不去了…

卖家链接我就不贴了,设计做工并不漂亮,要资料什么都没有,而且焊上去的排针居然还有歪的。对着datasheep数,这板子上PXX管脚37根,VBAT管脚1根。剩下的是BOOT0和NRST,以及三组VDD/VSS和一组VDDA/VSSA。嗯,至少管脚是全部引出来了的。

由于买的是成品开发板,所以电路图上的大部分内容都不需要自己做。flash芯片上3、7两脚接的电阻,dword说是因为需要拉高的关系,阻值1至20k随意。而两个发光二极管串的R3是一个限流电阻,查了一下发现这个电阻的阻值是需要算的:

R = ( E - UF ) / IF

R为阻值,E为电源电压,UF为二极管正向压降,IF为二极管工作电流。不同厂家不同颜色的二极管参数都不一样,似乎很麻烦的样子。不过dword标了220R,所以电路中三个电阻我都用了200R的,貌似没什么问题。

另外这篇文章还提到说,建议在不使用外部电池时,VBAT和VDD间连一个100nF的瓷片电容。嘛,我这里没有,希望不会出岔子。

其实对我来说吧,最困难的是怎么把坏掉的芯片从转接板上弄下来,然后再换一块新的上去。

拆芯片的部分,网上的说法各种高大上,我这里东西又没那么齐全。最后还是先弄了一坨焊锡到管脚处一并加热才弄了下来,并且还是弄断了一根管脚。好容易搞定一半,又发现转接板上的焊盘伤了一点点。本以为除了人生中第一次拆芯片第一次焊芯片之外,还要贡献出第一次飞线,还好最后发现用不着。

软件方面,Ubuntu 14.04仓库里的flashrom是0.9.6.1,spispeed参数是0.9.7才加入的,所以需要自己编译一份:

sudo apt-get install gcc-arm-none-eabi libpci-dev libusb-dev libftdi-dev

cd ~/tmp
mkdir -p dep/include dep/lib

svn co svn://flashrom.org/flashrom/trunk flashrom
cd flashrom
make
sudo cp flashrom ~/opt/bin/

然后编译serprog-stm32vcp以及相关依赖:

cd ..
git clone https://github.com/esden/libcmsis.git
cd libcmsis
make
install_dir=~/tmp/dep make install

cd ../
git clone https://github.com/esden/libstm32.git
cd libstm32
C_INCLUDE_PATH=~/tmp/dep/include make
install_dir=~/tmp/dep make install

cd ../
git clone https://github.com/esden/libstm32usb.git
cd libstm32usb
C_INCLUDE_PATH=~/tmp/dep/include make
install_dir=~/tmp/dep make install

cd ../
git clone https://github.com/dword1511/serprog-stm32vcp.git
cd serprog-stm32vcp
# 交叉编译时LIBRARY_PATH不起作用,所以需要改common.mk,加上-L
C_INCLUDE_PATH=~/tmp/dep/include make

接下来编译stm32flash,一个用于将固件写入开发板的工具:

cd ../
git clone https://git.gitorious.org/stm32flash/stm32flash.git
cd stm32flash
make

一切就绪。现在将开发板的BOOT0拉高(ISP模式),接上TTL线并插入PC,给开发板上电,然后用stm32flash将固件写入开发板:

sudo ./stm32flash/stm32flash -b 115200 -w ../serprog-stm32vcp/serprog_vcp.bin -v /dev/ttyUSB0

写完以后TTL线就可以拔掉了。将BOOT0拉低并插入USB线,dmesg会有以下输出:

[ 2707.384103] usb 1-1.4: new full-speed USB device number 8 using ehci-pci
[ 2707.478418] usb 1-1.4: New USB device found, idVendor=0483, idProduct=5740
[ 2707.478423] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2707.478426] usb 1-1.4: Product: flashrom.org serprog-STM32VCP
[ 2707.478429] usb 1-1.4: Manufacturer: STMicroelectronics
[ 2707.478431] usb 1-1.4: SerialNumber: 84FF05086333
[ 2707.519125] cdc_acm 1-1.4:1.0: This device cannot do calls on its own. It is not a modem.
[ 2707.519155] cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device
[ 2707.519585] usbcore: registered new interface driver cdc_acm
[ 2707.519589] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

然后应该就可以用了:

sudo flashrom -p serprog:dev=/dev/ttyACM0:4000000,spispeed=36000000 -r flash_orig.bin
sudo flashrom -p serprog:dev=/dev/ttyACM0:4000000,spispeed=36000000 -v flash_orig.bin
sudo flashrom -p serprog:dev=/dev/ttyACM0:4000000,spispeed=36000000 -w somefile.bin

实际效果方面,我这边用一块MX25L12845测试下来,spispeed参数只能设置为18000000才可以稳定运行。一次读取耗时约21s左右,平均780KiB/s。这个速度倒是跟dword给出的数据差不多,不过写入方面却没想象的快。

flashrom为了减少flash芯片的损耗,在写入时会先读取一次以确定要更新的块,写完了会再校验一次,所以一次完整的写入要读两次写一次。我测试了几次,整个过程耗时大概在5到6分钟的样子。以6分钟计算,扣除两次读取,写入的速度大概是51.5KiB/s。

根据dword的说法,spispeed是根据flash芯片的工作频率来的。至于我这里的测试结果虽然不理想,但也“不算太离谱”,或许跟SPI连接线和USB电缆有关。嘛,暂时不管了,能用就行。

另外就是,flashrom目前在Windows下也是可用的,只是需要自己编译。有需要的话,可以用我这里编译好的版本,Ubuntu 14.04 x64和Windows版的flashrom都有。

如果要在Windows里用,除了libusb-win32-bin-1.2.4.0.zip外,还需要STM32的VCP驱动

2014年5月22日星期四

Native Linux for TMall MagicBox

一开始对这个问题有兴趣,是想看看能不能通过原生linux解决魔盒伪1080输出的问题。毕竟国内厂商靠不住这件事人尽皆知,而且新版魔盒都已经出来了,阿里肯定是指望不上的。

经过这段时间里无穷无尽的折腾,成果固然是有一些,不过要说解决问题的话,还差得有些远。从这次的经历也可以看得出来,不管是拿来玩还是拿来用的硬件,充分的技术支持和成规模的社区都是很重要的。

单纯就视频播放而言,可能回头去找个1186的机器会更好。如果有更高的要求,x86是个更好的选择。arm嘛,嗯。

uboot

因为我希望保留nand上的安卓系统,所以linux就只能安装到tf卡里,这需要对uboot环境变量进行一定的修改。虽然这件事安卓系统里也能做,但是没有uart就看不到输出,折腾起来很不方便,所以就目前来说拆机焊线还是有必要的。

为了两个系统里都用得上,我把一张16G的tf卡分了两个区,第一个4G的fat32,剩下的则格式化为ext3。

想要启动时加载fat32分区上的uImage内核文件,需要在uboot中进行如下操作:

mmcinfo
fatload mmc 0 ${loadaddr} uImage
bootm

如果希望启动时默认加载tf卡上的linux内核,则可以这样做:

setenv bootlnx 'mmcinfo; fatload mmc 0 ${loadaddr} uImage; bootm; '
setenv bootcmd 'run bootlnx'
saveenv

另外还有个法子,可以在上电时通过狂按遥控上的菜单键加载tf卡上的系统:

setenv bootlnx 'mmcinfo; fatload mmc 0 ${loadaddr} uImage; bootm; '
setenv irremote_update 'if irkey 0x1f2d12e 500000 ;then run bootlnx; fi'
saveenv

uboot还支持脚本文件,如将以下内容以auto_script文件名保存:

mmcinfo
fatload mmc 0 0x82000000 uImage
bootm 0x82000000

使用u-boot-tools软件包中的mkImage生成aml_autoscript:

mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n “auto_script” -d auto_script aml_autoscript

将aml_autoscript放入fat32分区,uboot中run update即可执行该脚本。

内核

amlogic官方放出的代码这里有:http://openlinux.amlogic.com:8000/download/ARM/

不过直接用这里的代码虽然能够成功编译,但实际用起来问题非常多。wjb@github修改整理的版本相对比较靠谱一点,目前的版本是3.0.96+。

编译过程大概是这样:

sudo apt-get install gcc-arm-linux-gnueabihf

git clone https://github.com/wjb/mx-common.git
cd mx-common

export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
make mrproper
make meson6_g18_mx2_defconfig
make menuconfig
make uImage -j4
make modules -j4

sudo cp arch/arm/boot/uImage /media/BOOT
sudo make INSTALL_MOD_PATH=/media/AMLinux modules_install

一个linux跑不跑得起来,一大半都在内核上,可m6内核离完善真心差很远。

一开始我使用的是gcc 4.8,且打上了如下补丁:

diff --git a/drivers/amlogic/gpio/am_gpio.c b/drivers/amlogic/gpio/am_gpio.c
index c4ab581..771b529 100755
--- a/drivers/amlogic/gpio/am_gpio.c
+++ b/drivers/amlogic/gpio/am_gpio.c
@@ -196,7 +196,7 @@ static ssize_t am_gpio_write(struct file *file, const char __user *buf,

    if(buf == NULL || op == NULL)
        return -1;
-   val = copy_from_user(tmp, buf, size);
+   val = copy_from_user(tmp, buf, bytes);
    if (0 > val) {
        printk("am_gpio_write: Some bytes could not be copied: %d\n", val);
        return -EFAULT;
diff --git a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c
index 80391ed..5020450 100755
--- a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c
+++ b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c
@@ -233,7 +233,7 @@ static unsigned char Edid_TimingDescriptors[204]=    //12x17
 //-----------------------------------------------------------
 void Edid_CompareTimingDescriptors(HDMI_TX_INFO_t * info, unsigned char *Data)
 {
-   int index1,index2;
+   volatile int index1,index2;

  for(index1=0;index1<17;index1++)
     {

其中第二处修改,如果不加上volatile,index1会出现远大于17的情况,这显然是gcc的bug。

这样编译出来的内核可以启动,但是usb不能用音频也存在问题。尝试换用gcc 4.7,结果问题更严重了,三次上电只能成功启动一次,而且失败时没有任何错误信息,就是直接挂在那里不动。

wjb@github提供的mx2ref内核可以直接拿来用,版本号是3.0.50。这个内核问题略少,但也就是略少而已。

debian

ubuntu和debian都提供了arm支持,下面的方法两个发行版都适用。不过只用命令行的话,ubuntu远不如debian,再加上stable的debian软件包都太老,所以这里装的是sid的debian。

sudo apt-get install qemu-arm-static debootstrap
mkdir debian-armhf-sid
sudo debootstrap --foreign --arch armhf sid debian-armhf-sid http://ftp.tw.debian.org/debian/
sudo cp /usr/bin/qemu-arm-static debian-armhf-sid/usr/bin/
sudo chroot debian-armhf-sid /debootstrap/debootstrap --second-stage
sudo chroot debian-armhf-sid

qemu-arm-static在ubuntu 14.04中包含在qemu-user-static中,这东西很好用,可以直接在pc里chroot进arm系统。这样很多操作就可以在pc上完成,再慢也比在目标机器上弄要快。

然后就是一些基本设置:

passwd
echo AMLinux > /etc/hostname
echo deb http://ftp.tw.debian.org/debian sid main contrib non-free >> /etc/apt/sources.list
apt-get update
apt-get install locales
dpkg-reconfigure locales
apt-get install wireless-tools wpasupplicant
mknod -m 660 /dev/ttyS0 c 4 64

编辑/etc/inittab,将ttyS0所在行改为:

T0:2345:respawn:/sbin/agetty -L ttyS0 115200 vt100

其他设置去看debian文档吧,很详细。弄完cp -a将debian-armhf-sid复制到tf卡的ext3分区,到这里该tf卡就可以在魔盒中成功启动了。

现有问题

音频

gcc 4.8编译的内核,aplay只能播放特定格式的wav,mpg123无法成功播放mp3,xbmc只能放得出爆音。wjb预编译的内核,xbmc中可以成功播放音频视频文件,但声音听起来有点怪,有点像跑调了。

视频

wjb预编译内核跑xbmc,加载libamplayer,可以全速播放avc1/ac3(瞬时码率最高约30Mbps)。因为usb不能用,samba也遇到点小问题所以更多的没有测试。

效果方面,第一印象很一般,感觉颜色有些暗淡。

usb

无论哪个内核,不管是启动前还是启动后插入的设备均不能用。

eth0的mac地址问题

在启动linux时,log里有一句未配置mac地址,使用随机地址的信息。进入linux后重启进入android,系统会自动运行一个叫MiptAutoTestForAli-10030的程序。虽然看起来很吓人,但其实只要在这个程序中选择写入随机mac地址再退出,就可以正常使用android系统了。

这个问题应该可以通过修改驱动解决,不过我暂时没去管。

遥控器不能用

遥控使用的是BK2433,没找到驱动。不过问题不大,xbmc可以用android或ios设备当遥控。

2014年5月11日星期日

Mini ITX

乔伯他娘亲抱怨家里的机器太慢想要换一台,而这事儿发生至今已经好几个月了。再这么拖下去指不定要拖多久,所以我就当仁不让滴把事情揽了过来。说起来这也是我第一次弄ITX板子的机器,值得记一笔的东西还不少。

最后的配置定下来是这个样子:

  • CPU I5 4570
  • 主板 华擎 H87E-ITX/ac
  • 硬盘 浦科特 M5S 120G
  • 内存 金士顿 Genesis 4G*2
  • 机箱 乔思伯 V3+
  • 电源 海韵 S12II-430
  • 散热器 九州风神 加百利

虽然就目前而言,娘亲辈用I3也差不多,不过考虑到他家换机器的周期比五年计划还长,选个I5还是比较合适的。至于架构,既然不打算上独显,Haswell的GPU还是值得多花一点钱的。

主板则是第一个难选的东西。另外两个备选项分别是微星H87I AC和技嘉B85N Phoenix。

除了ALC892略次和价钱小贵之外,微星那块本来是不错的。可这块板子CPU插槽离PCIE太近,导致CPU散热器的选择和安装很受限制,很容易挡到未来有可能插入的PCIE设备,放弃。而技嘉和华擎之间,除了牌子略好之外,单纯用眼睛来看技嘉那块就没一样比华擎强的。这一点上真的不能不佩服华擎,配置、接口、用料都是看得见的,虽然在华擎身上也遇到过不愉快,可到最后选择的时候,华擎还是很有可能会胜出…

因为是娘亲机,并不会存放什么重要的数据。SSD本打算再买一块我现在用的万胜。怎么说都是MLC,性能也还不错,质量拼一下人品无妨。可万胜堕落到阉掉了缓存,写入掉到了90M/s的级别,这实在不能忍。翻了老半天,只发现金泰克的性能还不错价钱也不错,无奈没货。三星和金士顿之间几番踌躇怎么都下不了手,还是回头去找了浦科特。

内存最近又狂涨,无马甲金士顿标准版和低压版一个价。又是低压又是矮版,上ITX本是极好的,可4G版你就只给我剩了一条叫我怎么买。这次虽然还不得不选了骇客神条,可在ITX这种寸土寸金的板子上,矮版才是绝配啊。

整个系统弄下来,待机功率预计在30w左右,满载功率则是100w左右。为了转换效率考虑,电源应该选个小些的。可现如今的电源,更小更便宜的也选不出什么好货了。再加上前些日子遇到家里的电压异常偏高,一个充电器都烧掉了,我机器里的海韵却一点反应都没有,证明这个牌子还是很不错的。

其实关于电源,模组与否也是个让人纠结的地方。对ITX来说,模组电源当然比较好,最起码对风道的干扰就会比较小,也不需要找地方塞用不上的线。可是海韵X系列贵到飞起,反正装进去了以后也看不见,不管了…

机箱和CPU散热器绝对是ITX系统最难选的东西,没有之一。

一开始我倾向于小巨蛋,材质、做工、外观没什么可挑的。可是因为小巨蛋的宽度达到了250mm,电源开关和前置端口还很缺心眼地放在了右侧板上,跟乔伯家使用环境有不少冲突,放弃。

接着我选中的是乔思伯 U2。这个机箱形制上更接近传统机箱,可以从下往上,由CPU风扇再通过电源风扇将热量排出,形成一条完整的风道,散热应该比较好。可是这样的话,CPU散热器就需要找一个不能太宽了的,不然有可能跟内存插槽冲突。为了保险,最后只选了超频三红海mini。这个的散热片8cm宽,几乎是塔式里最窄的了。至于散热效果,不行再换吧。

本来选件的部分到此就应该告一段落了的,可在京东上成功下单以后,却发现后台显示机箱没有货。如果换个比U2还大的,那跟小一点的中塔也没什么区别,失去了ITX的意义。看来看去,最后选了乔思伯的V3+。这个机箱体积更小,但由于电源是直接悬在CPU之上,散热就成了一个问题。风扇换了个九州风神加百利,具体效果等装好了再看吧。

正式安装时一切都还算顺利,遇到的问题不算多。

首先是CPU散热器必须要先安装到主板上,再将主板放入机箱。但这样一来,四颗主板固定螺丝中的一颗就被散热片挡住了。随机附带的又只有螺丝而没有卡口型支撑柱,把另外三颗螺丝上紧以后试了试还算稳定,所以也只能这样了。

主板上各插针都比较分散,所以除了8PIN供电需要在安装CPU散热器之前先插好之外,其他插针都没遇到什么问题。

金士顿马甲条跟加百利马甲条没出现冲突。

虽然官方说明书也提到了风扇反装,可我试了试,感觉加百利这个风扇如果不加脚垫直接放上去很有可能会卡住扇叶,为了保险所以我也没试。实际跑下来效果也还过得去,就是不知道夏天的时候怎么样。

这么小的机箱塞入非模组电源果然有些麻烦,好在不用的线缆绑一起刚好可以塞在电源后面,应该也不影响什么。标准ATX电源对这么小的机箱来说真心显得太大,期待以后吧。

整机要说有什么不满意的,那就是机箱了。板材边缘没怎么处理,赤手触摸有锋利感,即使很小心小指头还是被割了个口子。加工精度也不大好,安装完成后能明显发现很多缝隙。不过考虑到价钱,好像也不能要求太多。更何况在京东上翻遍了小机箱,即使不去考虑价格,类似尺寸似乎也没有更好的可选。

总的来说,不考虑一两年以后机箱会变成什么样,最后成品的效果看着还成。

乔妈,母亲节快乐~