Nov 27, 2013
TechnologyFor those code files which contains gb2312 or gbk format, we can use following scripts for automatically convert them to UTF-8 conpatiable format files.
#!/bin/sh
export LANG="zh_CN.utf8"
export LC_ALL="zh_CN.utf8"
#for file in `find . -name "*.h"`
for file in `find . -name "*.c"`
do
echo $file
enca -L zh_CN -x UTF-8 $file
done
Nov 27, 2013
Technology板子是09年入手的,但是一直没时间好好玩,最近端起来觉得有必要好好研究一番。为了以后翻阅方便,全中文记下来。
###12864
通常所说的12864LCD显示块是所说的点阵液晶显示模块,就是由128X64个液晶显示点组成的一个128列X64行的阵列,所以也就叫成了12864。每个显示点都对应着有一位二进制数,0表示灭,1表示亮。存储这些点阵信息的RAM被称为显示数据存储器。如果要显示某个图形或汉字就是将相应的点阵信息写入到对应的存储单元中。图形或汉字的点阵信息是由自己设计,这时候问题的关键是显示点在液晶屏上的位置与其在存储器中的地址之间的关系。
显示点在64X64液晶屏上的位置由列号(line,0~63)与行号(line,0~63)确定。512X8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。也就是说,一个页的大小是8. 运算关系则是64x64=(64x8)x8=512x8.
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64X64液晶屏拼接而成,每半屏有一个512X8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。(少数厂商为了简化用户设计,在模块中增加译码电路,使得128X64液晶屏就是一个整屏,只需一个片选信号。)
如如果点亮12864的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。
这是为了为了使液晶点位置信息与存储地址的对应关系更直观关,将64X64液晶屏从上至下8等分为8个显示块,每块包括8行X64列个点阵。每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。(需要注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。即64X64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。因此存储单元地址包括列地址(Yaddress,0~63)和页地址(Xpage,0~7)。
以上就是对于12864点阵液晶显示器的原理介绍。
在DX32开发板上的液晶是怎么一回事呢?它的封装图如下:
Datasheet有72页,乱七八糟的会讲一大堆。但是事实上我们只需要关注和软件有关的方面,拿一个很简单的开启/关闭LCD的例子来说,DataSheet里有这样的表格:
Command | A0 /RD /WR | D7 D6 D5 D4 D3 D2 D1 D0 | Function |
---|
Display On/OFF | 0 1 0 | 1 0 1 0 1 1 1 1 | LCD Display ON |
Display On/OFF | 0 1 0 | 1 0 1 0 1 1 1 0 | LCD Display OFF |
那么会有对应的代码:
/**************************************************************
**函数名:LcdOnOff
**功能:开关LCD
***************************************************************/
void LcdOnOff(u8 onoff)
{
if(onoff>0)
LcdCmd(0xaf); //开显示
else
LcdCmd(0xae); //关显示
}
0xaf的二进制的值是1010 1111, 而0xae的值则是1010 1110, 这点在手册中容易引起混淆,因为它操蛋的把前面的一系列值都省略了,表格里的才是完整的应该发送的命令。
再拿一个例子来说,
/**************************************************************
**函数名:LcdInit
**功能:初始化LCD,初始化后需要用LcdCmd(0xaf)命令打开显示
***************************************************************/
const u8 LCD_Tab[] = { /*0x26改0x27可增加对比度*/
0xa2,0xa0,0xc8,0xf8,0x00,0x26,0x2f,0x81,0x05,0xa4,0xa6,0xac,0x00,0xee,0x40
};
void LcdInit(void)
{
u16 i;
RSTLCDS_L;
for(i=0;i<65530;i++);
RSTLCDS_H;
/* Why we have to write 15 times for the LCD_Tab? */
for(i=0;i<15;i++)
LcdCmd(LCD_Tab[i]);
LcdCmd(0xaf); //开显示
}
在初始化LCD的时候我们需要依次写入命令,这里我们把命令做成一个数组,就是LCD_Tab数组, 那么命令的格式如下:
0xa2 LCD bits set, 0 means normal displaying
0xa0 ADC Select. Set the display RAM address SEG output corresponding, 0 means normal.
0xc8 Common Output Set, means reverse direction.
0xf8 Booster ratio.
所有这些在DataSheet中均有详细说明。
总之,对于12864,我们只要把它看成是一个“黑盒子”,输入对应的值,盒子上就能显示出怎样的值,如此就可以得到我们要的结果。
Nov 26, 2013
Technology增加一个VLAN设备:
$ ip link add link eth0 name eth0.100 type vlan id 100
查看增加的VLAN设备详情:
$ ip -d link show eth0.100
增加一个IPV4地址:
$ ip addr add 192.168.100.1/24 brd 192.168.100.255 dev eth0.100
$ ip link set dev eth0.100 up
关闭一个VLAN设备:
$ ip link set dev eth0.100 down
移除一个VLAN设备:
$ ip link delete eth0.100
Nov 25, 2013
Technology###Preparation
####STM Standard Peripheral Lib
Download Link for STSW-STM32054STM32F10x standard peripheral library :
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257890
Unsip the downloaded library and you will get several folders, the Libraries folder is the pure libs.
####Cross-Compiler for STM32
Download the cross-compiler from CodeSourcery ARM EABI toolchain - Mentor Graphics:
https://sourcery.mentor.com/sgpp/lite/arm/portal/subscription?@template=lite
You have to choose EABI version. Download and install it, you will get “arm-none-eabi-” prefixed cross-compiler.
####Eclipse plugins
Help-> Install New Software, Add the URL for gnuarm:
http://gnuarmeclipse.sourceforge.net/updates
Then Install CDT GNU Cross Development Tools , after install the plugin, you will asked to reboot, just reboot. Now your preparation is OK.
###Create a new project
In Eclipse, Click File->New->C project, choose “ARM Cross Target Applcation (End of life)", choose “Empty Project” “ARM Linux GCC(Sourcery Lite Bare), give the Project name and click Next Button, then click Finish. you will see the newly created project in the Project Explorer.
Copy the Library files into your own project, take “stmExample” project for example:
[Trusty@DashArch STM32F10x_StdPeriph_Lib_V3.5.0]$ pwd
/media/y/embedded/stm32/dev/lib/STM32F10x_StdPeriph_Lib_V3.5.0
[Trusty@DashArch STM32F10x_StdPeriph_Lib_V3.5.0]$ cp -r Libraries/ ~/workspace/stmExample/
Your project should seem like this:
Now you have to prepare your startup file, notice you have to use “S” suffixed file name, and you have to remove the remaining directory except the .S file:
[Trusty@DashArch startup]$ pwd
/home/Trusty/workspace/stmExample/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup
[Trusty@DashArch startup]$ ls
arm gcc_ride7 iar TrueSTUDIO
[Trusty@DashArch startup]$ cp TrueSTUDIO/startup_stm32f10x_hd.s ./startup_stm32f10x_hd.S
[Trusty@DashArch startup]$ ls
arm gcc_ride7 iar startup_stm32f10x_hd.S TrueSTUDIO
[Trusty@DashArch startup]$ rm -rf TrueSTUDIO/ iar/ gcc_ride7/ arm/
[Trusty@DashArch startup]$ ls
startup_stm32f10x_hd.S
Create a directory named src to contains your own project files.
[Trusty@DashArch stmExample]$ mkdir src
[Trusty@DashArch stmExample]$ pwd
/home/Trusty/workspace/stmExample
[Trusty@DashArch stmExample]$ ls
Libraries src
Copy the project files into “src” directory:
[Trusty@DashArch STM32F10x_StdPeriph_Template]$ ls
EWARM HiTOP main.c MDK-ARM Release_Notes.html RIDE stm32f10x_conf.h stm32f10x_it.c stm32f10x_it.h system_stm32f10x.c TrueSTUDIO
[Trusty@DashArch STM32F10x_StdPeriph_Template]$ cp stm32f10x_* ~/workspace/stmExample/src/
[Trusty@DashArch STM32F10x_StdPeriph_Template]$ pwd
/media/y/embedded/stm32/dev/lib/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template
Copy the link script to root directory of your project:
[Trusty@DashArch STM32100B-EVAL]$ pwd
/media/y/embedded/stm32/dev/lib/STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM32100B-EVAL
[Trusty@DashArch STM32100B-EVAL]$ cp stm32_flash.ld ~/workspace/stmExample/
You have to modify the link script according to your own flash layout and memory layout, My CPU is STM32F103VC, which has 48K RAM and 256K Flash, so the configuration is listed as:
/*
Linker subscript for STM32F051 definitions with 64K Flash and 8K RAM
Copyright RAISONANCE 2007
!!! This file is automatically generated by RIDE !!!
Do not modify it, as it will be erased at every link.
You can use, copy and distribute this file freely, but without any warranty.
*/
/* Memory Spaces Definitions */
ENTRY(Reset_Handler)
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K
}
/* highest address of the user mode stack */
_estack = 0x2000c000;
/*
Common part of the linker scripts for STR71x devices in FLASH mode
(that is, the FLASH is seen at 0)
Copyright RAISONANCE 2005
You can use, modify and distribute this file freely, but without any warranty.
*/
/* Sections Definitions */
SECTIONS
{
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
/* the program code is stored in the .text section, which goes to Flash */
.text :
{
. = ALIGN(4);
*(.text) /* normal code */
*(.text.*) /* -ffunction-sections code */
*(.rodata) /* read-only data (constants) */
*(.rodata*) /* -fdata-sections read only data */
*(.glue_7) /* TBD - needed ? */
*(.glue_7t) /* TBD - needed ? */
/* Necessary KEEP sections (see http://sourceware.org/ml/newlib/2005/msg00255.html) */
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
_etext = .;
/* This is used by the startup in order to initialize the .data section */
_sidata = _etext;
} >FLASH
/* This is the initialized data section
The program executes knowing that the data is in the RAM
but the loader puts the initial values in the FLASH (inidata).
It is one task of the startup to copy the initial values from FLASH to RAM. */
.data : AT ( _sidata )
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_sdata = . ;
_data = . ;
*(.data)
*(.data.*)
*(.RAMtext)
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_edata = . ;
} >RAM
/* This is the uninitialized data section */
.bss :
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_sbss = .;
_bss = .;
*(.bss)
*(.bss.*) /* patched by elias - allows the use of -fdata-sections */
*(COMMON)
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_ebss = . ;
} >RAM
PROVIDE ( end = _ebss );
PROVIDE ( _end = _ebss );
__exidx_start = .;
__exidx_end = .;
/* after that it's only debugging information. */
/* remove the debugging information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}
Now create a sample main.c under the src directory and input your source code.
###Configure the project
Right click your project, select Properties, C/C++ Build -> Settings, ARM Linux GCC Assembler(Sourcery Lite Bare)/Preprocessor, add a Defined symbols(-D), also you have to add this into ARM Linux GCC Compiler(Sourcery Lite Bare):
STM32F10X_HD
USE_STDPERIPH_DRIVER
In ARM Linux GCC C Compiler(Sourcery Lite Bare)-> Directories, add Include paths(-i) add following:
Specify the link script:
ARM Linux GCC CLinker(Sourcery Lite Bare) -> General, Script file(-T)
/home/Trusty/workspace/stm32archlinux/stm32_flash.ld
###Build and Debug
Right click the project and click “Build project”, then you got your project compiling and linking, finally you got your Binary named stmExample.elf.
Now we can use OpenOCD for writing the image into the flash and debugging it.
Run->Debug Configuration, you will see Zylin Embedded debug(Native) is available, right click and choose “Create new”, create a new debug item.
Choose the Main:
Choose the Debugger:
Choose Commands:
The configuration file is :
target remote localhost:3333
monitor reset
monitor halt
monitor flash protect 0 0 11 off
monitor flash write_image erase /home/Trusty/workspace/stm32archlinux/Debug/stm32archlinux.hex 0 ihex
disconnect
target remote localhost:3333
monitor reset
monitor halt
Open your own openocd, and then using eclipse to connect the gdb. Remember “toggle breakpoint” and you will get a hardware breakpoint. Enjoy the debugging.
Nov 25, 2013
Technology###Hardware
Joggler
Intel(R) Atom(TM) CPU Z520 @ 1.33GHz Dual Core
MemTotal: 504480 kB
Harddisk: 500G External USB.
###System and Software
Download the Ubuntu Base/Server 12.04 LTS (Precise) (Joggler Image v1.4 - 09/04/2013) from the
http://joggler.exotica.org.uk/ubuntu/
From the ubuntu website we know 12.04 LTS will supported to 2017, I think that fits my needs.
Unzip the download image:
gunzip ubuntu_base_12.04-v1.4-ext4.img.gz
dd if=./ubuntu_base_12.04-v1.4-ext4.img of=/dev/sdc bs=1M
The use this external usb disk for booting up the joggler. After joggler has been booted up, install coresponding packages.
###Prevent Hard disk from hiberating
Add following lines to crontab -e
*/4 * * * * fdisk -l /dev/uba>/dev/null && echo abc>/root/done.txt