2015年11月6日星期五

Keyboards

DELL AQ6-7D40

(好吧,我必须要说一句,图片是网上找来的,这并不是我的键盘和桌子…)

这一套键鼠2008年购于淘宝,加上邮费一共170块。鼠标产自罗技,而键盘是NMB出品。因为鼠标加上电池太沉,耗电量感人而且DPI也不太够,没用很久就被我换了下来。不过让我也很意外的是,键盘却一直敲到了2014年,差不多用了5年半的样子。

时至今日,想起这一把键盘,我的印象任然是非常好的。按键的稳定性很好,手指放在键帽上做水平移动,并不会像廉价键盘那样哗啦啦的乱晃。确认感相当明显,并不是简单的按橡皮碗的感觉。压克力数大概比茶轴还要更重一点,手感偏硬。最下面一排按键面积加大,并且做出了一点坡度,拇指放在空格上确实会比较舒服。

当然,这仍然还是一把薄膜键盘,手感要跟机械比那是不可能的。橡皮碗加上火山口的结构就决定了,必须要从按键正中垂直按下才会有最佳的手感,稍微歪一点就会有卡键的感觉,这一点在大键上的表现尤其明显。

这一把键盘的存在充分说明,手感不错的薄膜仍然是有的。不过这样的产品好不好找那就是另外一回事了。比如曾经被吹上天了的DELL 8115,我接触过的基本都只能给同样一个评价:呵呵。

IKBC F104 黑茶

这一把键盘购于2014年初,时价549,还附送了一套PBT二色键帽。虽然我也曾经用过机械键盘,不过毕竟随便了这么些年,所以在买这一把键盘的时候,我也算是一个价格敏感型用户,可以说是几经挑选之后,才选中了这一把。

至今我也没闹明白,IKBC究竟是一家什么样的公司。看网上的资料,似乎是一些外设发烧友弄出来的。从产品透露出来的气息来看,倒真是蛮符合这个背景的。

不管是材质用料还是外形设计,整个键盘都给人一种相当用心的感觉。尤其特别的是键帽,“加厚二色成型黑色PBT”,搞不好还真的是独此一家了。

然而真的用起来,这一把键盘的毛病却很多。

F104的大键用的是卫星轴,虽然很多软文或者人品好的用户都说没什么问题,可我手上这一把的问题却非常的大,大到空格键可以卡在中间无法回弹的程度。网上传言,导致这个问题的正是“加厚二色成型黑色PBT”,键帽太厚太重,精度又没控制好,所以就卡住了。虽然IKBC发现这个问题后补送了一个用于替换的空格键帽,可是我拿到的却是一个原厂高度的键帽,装上去压根就不匹配,完全没法用。

跟大键巨肉无比甚至卡键相比,什么键盘指示灯亮瞎人眼都完全不算什么了。反正我从拿到这把键盘那天起,指示灯就是用黑色胶布遮住的。

基本上,我并不是个很爱惜外设的人。坐电脑桌前吃吃喝喝是常事,关机再来个防尘罩一类的就更是不可能了。不过这一把F104用了不到两年就出现左Ctrl和F5同时失效也是我完全没想到的。如果找原厂修势必需要快递来快递去,于是我索性也不打算修了,暂时就这么放着吧。

这么看来,这一把键盘给予我的使用感受应该并不怎么样才是。可很意外的是,我对这一把键盘却并没有什么怨气。

机械键盘的手感确实是比普通薄膜好很多的,然而这也确实是个神坑。青、茶、黑、红,ABS、PBT、POM,丝印、蚀刻、二色,原厂、OEM,各种概念不是一般的多。通过这两年的使用,我从这一把F104上体会到了很多其实没法用文字来描述的概念和感受,所以也算是交学费了吧。

平心而论,除开“卡键”和“两年坏”这俩很严重的问题,F104是一把挺不错的键盘。听起来很矛盾,所以我的结论是IKBC的东西烧友向,普通用户可能还是选别的牌子比较好。

Cherry G80-3000 黑茶

有些东西,一旦试过就再也回不去了,人的本性就是如此。左Ctrl和F5也确实没法忍,正好2015年购物季来了,所以我打算换一把键盘。

虽然很认真地考虑过Realforce,不过我仍然还是很介意没票没售后这件事,无奈放弃。到了正日子,罗技G710+说降价不降价,酷冷至尊那一把号称跟Filco同一生产线下来的型号不但预先提价还没货,最后干脆就入了一把原厂。

名声在外的白茶瞬间卖光,所以也不用多考虑什么了。入手价格575,对于常年699的原厂来说,也算不小的优惠幅度了吧。

用下来的感觉,G80-3000真是一把很有意思的键盘。

手感方面,跟F104等一众OEM比起来真是非常的不同。因为没有钢板,震手的感觉自然就没有了。但同样因为没有刚性支撑,导致手感就没有那么脆,第一印象会有一点松散。可是仔细体会的话又会发现,或许是整个键盘和电路板的形变充当了一个大号弹簧的关系,G80-3000上的茶轴是要比F104要稍微重那么一点点的。

非要说的话,这一把键盘的手感确实没那么“机械”,有可能会让人联想起普通的薄膜。不过我觉得这也不是坏事,毕竟“机械”与否也不是评价一把键盘好坏的标准。没有钢板震手的感觉,茶轴干脆利落的确认感还在,不管打字还是打游戏都可以应付,挺好的其实。

我觉得吧,评价一把键盘好坏的标准很简单:如果在用的时候感觉不到他的存在,那就是一把好键盘。G80-3000的手感是不错的,然而以我这个标准来衡量的话,这一把键盘离好键盘却也有那么一点距离。

槽点无非也就是那几个。曾经是标准,然而今天看来却有如十万八千里一般远的F区。POM键帽的F键和J键上没有凸起的定位点,只是凹陷的曲面做得比其他按键稍微大一点,盲打的时候并没那么好分辨。蚀刻填充的键帽摸起来相当隔手,不但比不了二色,就连丝印都比不了。

我也相信,用一段时间习惯以后,这些问题都不会像刚接触时那么严重。可作为卖了这么多年的一个型号,一直都不改,或许这就是德国佬的固执吧?

最后,“原厂渣做工”什么的,我倒没有太特别的感觉。入手很轻,产品细节也确实不是很精致,不过渣不渣的,且看他什么时候坏吧…

Logitech K480

一直以来,我都想要一把蓝牙键盘,虽然我也不知道那是因为什么。

最想要的无疑是ThinkPad那一把,除了TP的品牌加持,小红点当然也是很重要的一个原因。然而小400的价钱我实在是下不了手,尤其跟USB版相比价差150,我只能说信仰不足了吧。

这次光棍节,某东罗技K480丢出了169的价钱,和之前249相比打了7折还多,脑子一热我就下单了。显然,这是一次典型的冲动消费。而实际使用下来的感受,似乎也应证了这一点。

K480的外观给人一种扎实而美观的感觉,颜值不错。键盘本身有点分量,至少我并不会想把它背出家门。插槽设计也很有趣,放入iPad,还真有那么一点变身笔记本的的感觉。而且键盘支持跟三个不同的设备配对,有一个旋钮可以快速切换,看起来很方便的样子。可以说,K480在输入体验以外的地方都做得很不错。

然而最大的问题,也就是输入体验了。

作为一把键盘,敲起来感觉怎么样无疑是最要紧的一件事。这一点上,我实在无法给K480打出一个超过及格线以上的分数。诡异的孤岛式,人为的减少了按键和手指的接触面积。键程很短,按键又偏硬,导致敲字的时候需要比较用力又很小心,不然很可能会按空某个键。最下面一排按键和键盘下沿几乎零距离,对手腕和手指完全没有支撑,只适合平放在桌面上使用,放膝盖上都不是很适合。总体来说,应付一下是可以,但如果有选择的话,我是决计不会用这一把键盘写东西的。

当然,手感能跟机械比的超薄键盘本来也不可能存在,所以我的标准确实会有些太苛刻。这一节内容我就是用K480在iPad上敲出来的,手指也并没有抽筋。对于有需要在平板设备上大量输入文字又没有被机械键盘惯坏的人来说,这一把键盘或许是个不错的选择。

至于我,大概也只能是家里停电的时候用来聊QQ才用得上了吧…

插个花。虽然输入法用着不太习惯,可能需要看看水果的文档之外,iOS对外接键盘的支持真是意外的好。再加上远比Windows好的字体和显示效果,iPad其实是完全可以胜任码字这项工作的。

于是我又忍不住在想了,如果用TP那一把键盘的话,感觉会不会好很多呢…

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设备当遥控。