Arch Linux安装IBus

安装ibus

# pacman -S ibus
# pacman -S ibus-qt

安装输入法

ibus-pinyin:拼音输入法
ibus-table:一个框架,五笔信赖于它

# pacman -S ibus-{pinyin,table}
# yaourt -S ibus-table-wubi

在~/.bashrc文件中添加如下内容:

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

然后执行命令运行ibus: # ibus-daemon

Arch Linux安装

1、首先用Arch Linux的引导盘引导进入live CD。ISO文件下载地址:http://www.archlinux.org/download/

2、以root身份执行脚本: # /arch/setup 然后你就会看到 ArchLinux 安装框架的屏幕。

3、根据自己的情况进行选择
注意在第4项进行磁盘分区时要小心选择,否则操作失误会丢失数据。

安装完后重启即可进入Arch Linux

https://wiki.archlinux.org/index.php/Beginners'_Guide_(简体中文)#.E5.AE.89.E8.A3.85.E5.9F.BA.E6.9C.AC.E7.B3.BB.E7.BB.9F

arm9-2440 linux下烧写

超级终端:使用minicom加ckermit组合,也可以单独使用Gtkterm来代替SecureCRT。
将Port设为设备名,如ttyUSB0。speed改为115200。如图:

ckermit安装好后,进行配置
vi /etc/kermit/kermrc
set line /dev/ttyUSB0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5

USB下载驱动
dnw_for_linux.tar.gz下载地址: http://115.com/file/aqy4rodm

其中secbulk.c是PC端USB驱动。dnw.c是写入工具,这个是经过我修改的,可以将程序下载到指定的地址。
编译并加载secbulk.c内核模块

$cd secbulk  
$make -C /lib/modules/`uname -r`/build M=`pwd` modules  

编译成功后在当前目录下可以看到secbulk.ko

用insmod命令加载模块,这需要root权限
$sudo insmod ./secbulk.ko

编译dnw写入工具
$cd dnw
$gcc -o dnw dnw.c
编译成功后生成可执行档dnw

使用DNW下载
先使用kermit选择下载模式后再用dnw下载程序。
出现“USB host is connected. Waiting a download.”
Usage: dwn <addr> <filename>
$sudo ./dnw 30000000 led.bin

至此 在linux 下刷机完成
另有usb2ram,使用方法类似。
编译usb2ram需要先安装libusb-dev
Usage: usb2ram addr filename
$sudo usb2ram 30000000 led.bin

Ubuntu 10.10 crosstool ARM交叉编译

弄了两天,经过了N次失败后现在终于编译成功了,赶紧做个笔记。

1、下载crosstool(http://www.kegel.com/crosstool/crosstool-0.43.tar.gz)

2、下载编译过程中需要用到的源代码,虽然crosstool也会自动下载不过速度很慢,建议还是自己先下载好,源代码的版本根据自己的情况选择:
binutils-2.15 http://ftp.gnu.org/gnu/binutils/
gcc-3.4.5 http://ftp.gnu.org/gnu/gcc/
glibc-2.3.6 ftp://ftp.gnu.org/gnu/glibc/
glibc-linuxthreads-2.3.6 ftp://ftp.gnu.org/gnu/glibc/

linux-2.6.10 http://ftp.cc.uoc.gr/mirrors/ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.gz
linux-libc-headers-2.6.12.0 http://ep09.pld-linux.org/~mmazur/linux-libc-headers/linux-libc-headers-2.6.12.0.tar.bz2

将以上七个压缩包放在同一个目录下。

3、编译过程依赖这几个软件,没有的请自行安装。Bison、flex 、build-essential、patch 、libncurses5-de
还有gcc的编译依赖于gmp、mpfr、mpc这几个软件,没有的请先安装。
mpc-0.9.tar.gz http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz
mpfr-3.0.1.tar.bz2 http://www.mpfr.org/mpfr-current/mpfr-3.0.1.tar.bz2
gmp-5.0.2.tar.bz2 ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2
这几个软件之间也存在依赖关系,请按顺序依次安装gmp、mpfr、mpc

4、修改配置
1)、ubuntu10.10自己的GCC是4.4版本,使用这个版本的进行编译会出错,建议使用gcc-4.1。
sudo apt-get install gcc-4.1
sudo rm /usr/bin/gcc
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc

2)、修改sh,ubuntu10.10默认的sh是用的dash
如果运行 ls -la /bin/sh 看到链接是dash,则需要修改一下。不改的话编译会出错。
我是直接运行命令 sudo ln -sf /bin/bash /bin/sh 修改。改完后重启下,或者切换工作台以使其生效。

3)、修改编译脚本
解压crosstool然后进入解压目录,这里我选择demo-arm.sh这个脚本。
cp demo-arm.sh arm.sh

修改arm.sh
vi arm.sh

TARBALLS_DIR=(刚刚下载的源码存放目录)  
RESULT_TOP=(生成工具链要安装到的目录)  
eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh –notest #这个根据自己的情况选择

然后修改gcc-3.4.5-glibc-2.3.6.dat这个文件
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.10
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6

再修改arm.dat这个文件

KERNELCONFIG=`pwd`/arm.config  
TARGET=arm-linux #生成的工具链名称  
TARGET_CFLAGS=”-O”  

还有ubuntu10.10自带的ar、ld是2.20版本的,而这个编译时需要的是2.13~2.19版本的,所以会出错。
解决方法:
(1)、像上面的gcc一样,再安装个低版本的ls、ar。
(2)、如果不想再另外安装就可以用这个方法。修改glibc-2.3.6.tar.bz2这个压缩包内的configure文件。将3920行和3981行处的”2.1[3-9])”改为”2.[1-2][0-9])”。

5、开始编译
都配置好了之后就可以开始了
./arm.sh
漫长的等待开始了……,我的是奔腾双核处理器,整个过程花了半个多小时

6、测试
现在用刚刚编译安装好的arm-linux-gcc来编译一个C程序试试。
先将arm-linux-gcc的安装目录添加到环境变量中。

1
2
3
4
5
//文件名:hello.c
int main()
{
printf(&quot;www.xefam.com&quot;);
}

$ arm-linux-gcc -o hello hello.c
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
这就说明这个已经成功了!

7、现在可以恢复之前的系统配置了
将gcc修为gcc-4.4
将sh修改dash

如果嫌麻烦不想自己编译的可以直接下载已经编译好的来用,下面这个就是我编译好:
gcc-3.4.5-glibc-2.3.6.tar.gz http://115.com/file/e65akpi1

I2C串口总线驱动程序(汇编语言)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
;I2C串口总线驱动程序
;作者:龙昌
;博客:http://www.xefan.com
;请根据自己的实际情况定义SCL和SDA

;延时4.7us以上,我的是12MHz的晶振,请根据自己的晶振频率相应增删NOP条数
_NOP: NOP
NOP
NOP
NOP
NOP
RET

;发送开始信号
I2CB: SETB SDA
NOP
SETB SCL
ACALL _NOP
CLR SDA
ACALL _NOP
CLR SCL
RET

;发送结束信号
I2CE: CLR SDA
NOP
SETB SCL
ACALL _NOP
SETB SDA
ACALL _NOP
CLR SCL
RET

;发送应答(ACK)
MACK: CLR SDA
NOP
SETB SCL
ACALL _NOP
CLR SCL
RET

;发送非应答(/ACK)
MNACK: SETB SDA
NOP
SETB SCL
ACALL _NOP
CLR SCL
RET

;发送一个字节数据,要发送的数据存放在A寄存器中
SendB: MOV R5,#8
SendB1: RLC A
MOV SDA,C
NOP
SETB SCL
ACALL _NOP
CLR SCL
DJNZ R5,SendB1
;接收ACK
SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
MOV ACK,C
CLR SCL
RET

;接收一个字节的数据,接收完后存放在A寄存器中
RecvB: MOV R5,#8
RecvB1: SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ R5,RecvB1
RET

I2C协议说明

IIC(Inter - Integrated Circuit)总线是菲利浦公司推出的芯片间串行传输总线。它用两根线实现了完善的全双工同步数据传送。

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

I2C总线在传送数据过程中共有三种类型信号,它们分别是:

开始信号、结束信号和应答信号。

开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:数据接收完后,受控单元向主控单元发送一个应答信号。

开始信号是必需的,结束信号和应答信号可以不要。

数据传输格式如下:

主控写: 开始| 寻址字节(写)| 应答| 数据| 应答| …| 数据| 应答| 结束

主控读: 开始| 寻址字节(读)| 应答| 数据| 应答| …| 数据| 非应答| 结束

下划线部分表示主控发送,被控接收;其余为主控接收,被控发送。

时钟脉冲如图所示:

Pygame学习笔记11:手柄

手柄

joystick模块管理计算机上的手柄设备(可能多于一个)。手柄设备包括轨迹球、类似电视游戏机的游戏手柄,允许使用多个按钮和’hats’。

pygame.joystick.get_count函数可以获得系统中手柄的个数。比如:

count = pygame.joystick.get_count()

如果系统没有手柄,数量是0。

如果系统有手柄,可以通过pygame.joystick.Joystick来创建手柄对象:

j = pygame.joystick.Joystick(0)

其中的整数是手柄的id,取值范围从0到count-1。

创建对象后,需要先初始化

j.init()

初始化后,事件队列中就可以收到来自手柄的事件了。事件类型分为:

JOYAXISMOTION joy, axis, value
JOYBALLMOTION joy, ball, rel
JOYHATMOTION joy, hat, value
JOYBUTTONUP joy, button
JOYBUTTONDOWN joy, button

要注意pygame.JOYAXISMOTION事件的value值在-1.0和1.0之间。值0.0表示轴在正中间。游戏手柄设备一般只有-1、0、1三个值,而没有中间的值。而老的模拟手柄并不一定能完全达到-1到1的区间,中间的值也可能是0附近的一个值。模拟手柄通常会有一点噪声,从而会产生很多很小很快的运动事件。当轨迹球滚动时,pygame.JOYBALLMOTION事件会发生。它会报告轨迹球总共滚动了多少距离。当按钮被按下和释放时,会产生pygame.JOYBUTTONDOWN和pygame.JOYBUTTONUP事件。当hat的位置改变时,pygame.JOYHATMOTION事件会产生。事件的位置属性包括一对值,它们是-1或者0或者1。位置(0,0)表示hat在正中间。

要获得手柄的轴数可以使用

j.get_numaxes()

要获得手柄上轨迹球的个数,可以使用

j.get_numballs()

要获得手柄上的按键数,可以使用

j.get_numbuttons()

要获得手柄上hat控制器的个数,可以使用

j.get_numhats()

除了通过事件获得手柄的输入外,也可以直接查询手柄的状态。通过

j.get_axis(axis_number)

可以获得某个轴的位置。通过

j.get_ball(ball_number)

可以获得某个轨迹球的相对位置。通过

j.get_button(button)

可以获得某个按键的状态。通过

j.get_hat(hat_number)

可以获得hat控制器的当前位置。

Pygame学习笔记10:鼠标

鼠标

当显示模式设置后,事件队列就会开始收到鼠标事件。当按下和释放鼠标的按键时,会产生 pygame.MOUSEBUTTONDOWN和pygame.MOUSEBUTTONUP事件。这些事件包含一个button属性表示哪些键被按下。滚动鼠标滚轮会产生pygame.MOUSEBUTTONDOWN事件。当向上滚动滚轮时button的值是4,向下滚动时button的值是5。除此外还有一个pos属性,表示按键按下或释放时鼠标指针的位置。当移动鼠标时,会产生pygame.MOUSEMOTION事件。鼠标移动事件会被分解成一组较小的精确的移动事件。当鼠标移动时,会有很多事件被放在队列中。鼠标移动事件没有被正确的清除,常常是事件队列被填满的主要原因。鼠标移动事件包括一个buttons属性,表示鼠标移动时,鼠标键的状态。还有一个pos属性,表示鼠标指针的位置。还有一个rel属性表示当前位置相对于上一次事件发生时指针位置的偏移量。

除了可以通过事件来接受鼠标输入外,还可以直接调用函数检查鼠标的状态。pygame.mouse.get_pressed可以获得当前所有鼠标按键的状态。pygame.mouse.get_pos获得当前鼠标的位置。pygame.mouse.get_rel获得当前鼠标位置相对于前一个位置的位移。

用pygame.mouse.set_visible可以隐藏鼠标的指针。如果鼠标指针被隐藏,输入被当前的display捕获,鼠标会进入虚拟输入模式,这种模式下鼠标的相对位移不会收到屏幕边界的影响。

通过pygame.mouse.set_cursor可以设置鼠标指针的形状。

pygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None

当鼠标指针可见时,它会显示为给定的位域数组指定的黑白色的位图。size是包含指针高度和宽度的列表。hotspot是表示指针的热点位置的列表。xormasks是序列包含指针异或数据位域的序列,andmask是一组包含指针位域数据的序列。宽度必须是8的倍数,位域数组必须是size给定的正确的大小。

pygame.cursors模块包括了几个内置的指针形状。可以这样使用

pygame.mouse.set_cursor(*pygame.cursors.arrow)

可以使用的指针形状有:

pygame.cursors.arrow
pygame.cursors.diamond
pygame.cursors.broken_x
pygame.cursors.tri_left
pygame.cursors.tri_right

偶自己写的一个扫雷小游戏,全鼠标操作的。下载地址:http://app.xefan.com/小游戏/扫雷/

Pygame学习笔记9:键盘

键盘

当键盘的按键被按下时,事件队列会得到pygame.KEYDOWN和pygame.KEYUP事件。这两个事件都有一个叫做key的整型属性表示键盘上的键。pygame.KEYDOWN事件还有一个额外的属性unicode,表示键盘输入的转后对应的字符。这个字符会考虑shift键和其它组合键的状态。

有很多键盘相关的常量,他们表示键盘上的键。下面是所有键盘常量的列表:

KeyASCII      ASCII   Common Name
K_BACKSPACE   \b      backspace
K_TAB         \t      tab
K_CLEAR               clear
K_RETURN      \r      return
K_PAUSE               pause
K_ESCAPE      ^[      escape
K_SPACE               space
K_EXCLAIM     !       exclaim
K_QUOTEDBL    "       quotedbl
K_HASH        #       hash
K_DOLLAR      $       dollar
K_AMPERSAND   &amp;       ampersand
K_QUOTE               quote
K_LEFTPAREN   (       left parenthesis
K_RIGHTPAREN  )       right parenthesis
K_ASTERISK    *       asterisk
K_PLUS        +       plus sign
K_COMMA       ,       comma
K_MINUS       -       minus sign
K_PERIOD      .       period
K_SLASH       /       forward slash
K_0           0       0
K_1           1       1
K_2           2       2
K_3           3       3
K_4           4       4
K_5           5       5
K_6           6       6
K_7           7       7
K_8           8       8
K_9           9       9
K_COLON       :       colon
K_SEMICOLON   ;       semicolon
K_LESS        &lt;       less-than sign
K_EQUALS      =       equals sign
K_GREATER     &gt;       greater-than sign
K_QUESTION    ?       question mark
K_AT          @       at
K_LEFTBRACKET [       left bracket
K_BACKSLASH   \       backslash
K_RIGHTBRACKET ]      right bracket
K_CARET       ^       caret
K_UNDERSCORE  _       underscore
K_BACKQUOTE   `       grave
K_a           a       a
K_b           b       b
K_c           c       c
K_d           d       d
K_e           e       e
K_f           f       f
K_g           g       g
K_h           h       h
K_i           i       i
K_j           j       j
K_k           k       k
K_l           l       l
K_m           m       m
K_n           n       n
K_o           o       o
K_p           p       p
K_q           q       q
K_r           r       r
K_s           s       s
K_t           t       t
K_u           u       u
K_v           v       v
K_w           w       w
K_x           x       x
K_y           y       y
K_z           z       z
K_DELETE              delete
K_KP0                 keypad 0
K_KP1                 keypad 1
K_KP2                 keypad 2
K_KP3                 keypad 3
K_KP4                 keypad 4
K_KP5                 keypad 5
K_KP6                 keypad 6
K_KP7                 keypad 7
K_KP8                 keypad 8
K_KP9                 keypad 9
K_KP_PERIOD   .       keypad period
K_KP_DIVIDE   /       keypad divide
K_KP_MULTIPLY *       keypad multiply
K_KP_MINUS    -       keypad minus
K_KP_PLUS     +       keypad plus
K_KP_ENTER    \r      keypad enter
K_KP_EQUALS   =       keypad equals
K_UP                  up arrow
K_DOWN                down arrow
K_RIGHT               right arrow
K_LEFT                left arrow
K_INSERT              insert
K_HOME                home
K_END                 end
K_PAGEUP              page up
K_PAGEDOWN            page down
K_F1                  F1
K_F2                  F2
K_F3                  F3
K_F4                  F4
K_F5                  F5
K_F6                  F6
K_F7                  F7
K_F8                  F8
K_F9                  F9
K_F10                 F10
K_F11                 F11
K_F12                 F12
K_F13                 F13
K_F14                 F14
K_F15                 F15
K_NUMLOCK             numlock
K_CAPSLOCK            capslock
K_SCROLLOCK           scrollock
K_RSHIFT              right shift
K_LSHIFT              left shift
K_RCTRL               right ctrl
K_LCTRL               left ctrl
K_RALT                right alt
K_LALT                left alt
K_RMETA               right meta
K_LMETA               left meta
K_LSUPER              left windows key
K_RSUPER              right windows key
K_MODE                mode shift
K_HELP                help
K_PRINT               print screen
K_SYSREQ              sysrq
K_BREAK               break
K_MENU                menu
K_POWER               power
K_EURO                euro

还有一个mod属性表示一组修饰键的状态,可以通过位或把它们组合起来:

KMOD_NONE, KMOD_LSHIFT, KMOD_RSHIFT, KMOD_SHIFT, KMOD_CAPS,
KMOD_LCTRL, KMOD_RCTRL, KMOD_CTRL, KMOD_LALT, KMOD_RALT,
KMOD_ALT, KMOD_LMETA, KMOD_RMETA, KMOD_META, KMOD_NUM, KMOD_MODE

除了通过事件得到键盘输入以外,也可以直接访问键盘。通过pygame.key.get_pressed可以获得当前所有键的状态,pygame.key.get_mods可以获得所有修饰键的状态,比如:

1
2
3
4
keys = pygame.key.get_pressed()
mods = pygame.key.get_mods()
if keys[K_F8] and mods[KMOD_ALT]: #if Alt-F8 is pressed
pass

key模块下还有很多函数:

key.get_focused —— 当前激活的pygame窗口
key.get_pressed —— 获得当前所有键的状态
key.get_mods —— 按下的组合键(Alt, Ctrl, Shift)
key.set_mods —— 你也可以模拟按下组合键的效果(KMOD_ALT, KMOD_CTRL, KMOD_SHIFT)
key.set_repeat —— 设定允许pygame接受重复按键
key.name —— 接受键值返回键名

学完键盘模块后偶自己写了一个贪吃蛇的小游戏,下载地址:http://app.xefan.com/小游戏/贪吃蛇/

STC89C5XX单片机看门狗说明

下面是关于STC89C5XX-51 单片机看门狗的描述

WDT_CONTR 位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]

EN_WDT: 看门狗允许位,置 1 启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启动不能关闭(只能系统重新上电和看门狗复位可以关闭)

CLR_WDT: 看门狗计数器清零位,置1 清零看门狗计数器,当计数器开始重新计数,硬件清零该位。

IDLE_WDT: 单片机IDLE 模式看门狗允许位,当IDLE_WDT=1时,单片机在 IDLE 模式(空闲模式)依然启用看门狗

PS2~PS0: 看门狗定时器预分频器,下表中 Prescale 表示预分频数

PS2 PS1 PS0 Prescale
0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32
1 0 1 64
1 1 0 128
1 1 1 256

看门狗溢出时间:(NPrescale32768)/晶振频率,其中 N 表示指令周期数 N=12 表示 12 时钟周期模式;N=6 表示6时钟周期模式。如N=12,晶振频率为12MHz,PS2~PS0为100时,溢出时间=(123232768)/12=1048576us,差不多是1s。

例如:给WDT_CONTR写入0×34,即是激活看门狗,同时预分频数设为32。喂狗过程也是一样的。

顺便说一下ATMEL-51单片机的看门狗

下面是关于ATMEL-51单片机看门狗的描述

【看门狗计数器】(watchdog timer)是一个14位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0×3FFF)了就使单片机软复位;当启动了【看门狗计数器】之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个过程称作喂狗。

一般设置是给 WDTRST 先写入0×1E 再写入0xE1激活看门狗;喂狗过程也是一样的,给 WDTRST 先写入0×1E 再写入0xE1。