Design Consulting services

Accept embedded system design now.

include MCU/Embedded Linux/Android/Windows Embedded Compact services.

please visit if you have any request

And seeking an offer, online resume


Ubuntu Dropbox 自動更新有問題

這一兩天 我的Dropbox client 一直出現更新但沒成功過, 也不會秀 error message

剛手動重新安裝才發現問題點所在 (目前版本是 2.6.18 )

因為我用的的是 Ubuntu 12.10 x64 所以下載 dropbox-lnx.x86_64-2.6.18.tar.gz 這個版本

下載完放到Home 下面, 然後執行 tar xvf dropbox-lnx.x86_64-2.6.18.tar.gz 他會解開到 ~/.dropbox-dist 目錄下

然後按照說明 執行 dropboxd 會出現一個錯誤

importing ‘/home/{your account}/pylinux/__pycache__/’: No module named _cffi__xa0c4f46bx1d95b4de

根據這個訊息可以找到一個 bugreport 參照裏面的解法, 發現應該是本來舊的程式移除不完全

sudo rm -rf /var/lib/dropbox/.dropbox-dist ; 這步我不確定機器上到底有沒有這個folder
rm -rf ~/.dropbox-dist
tar xvf dropbox-lnx.x86_64-2.6.18.tar.gz ; 一樣是在 HOME 下執行, 會重新產生 ~/dropbox-dist
dropbox start -i

Note: an UNetbootin tip

Today I need to setup a host machine to run Ubuntu 10.04 for my work(Android development), so I download an Ubuntu 10.04.4 LTS (Lucid Lynx)  ISO and UNetbootin for Windows version. Just went make a USB disk for Ubuntu install.

But always got a “NTLDR is missing”message when use the Install USB Disk to boot system.

I to try again and again to fixed the issues until reformat the USB Disk and file system change to FAT32.

Keypoint:should check your USB disk is FAT system first when use UNetbootin or similar program

Note: Rebuild Notepad++

當下載 Notepad++ 的source code 用Microsoft VC 來rebuild Scintilla 時, 也許會出現下列的錯誤訊息

Creating library ..\bin\SciLexer.lib and object ..\bin\SciLexer.exp Catalogue.obj : error LNK2001: unresolved external symbol “class LexerModule lmUserDefine" (?lmUserDefine@@3VLexerModule@@A) Catalogue.obj : error LNK2001: unresolved external symbol “class LexerModule lmSearchResult" (?lmSearchResult@@3VLexerModule@@A) Catalogue.obj : error LNK2001: unresolved external symbol “class LexerModule lmObjC" (?lmObjC@@3VLexerModule@@A) ..\bin\SciLexer.dll : fatal error LNK1120: 3 unresolved externals NMAKE : fatal error U1077: ‘link’ : return code ‘0x460’ Stop.

我的解決之道是, 執行 Scintilla\src\ 它將重新產生 scintilla.mak 吻合實際狀況

另一個問題是在中文語系, 系統內定的codepage是950 時, 用VC2005將產生下列問題

..\src\Notepad_plus.cpp(1594) : error C2220: warning treated as error – no ‘object’ file generated
..\src\Notepad_plus.cpp(1594) : warning C4819: The file contains a character that cannot be represented in the current code page (950). Save the file in Unicode format to prevent data loss

會產生這個問題的檔案 menuCmdID.h & Notepad_plus.cpp (Notepad++ 5.9 at Mar 31 2011)

解決之道是用Notepad++ 打開, 將檔案編碼改成 UTF-8 存檔後即可!


剛看到 “火柴棍式”程序员面试题 ,
它的題目,  下面是一個C語言程式,想要輸出20個減號,不過,粗心的程式員把程式寫錯了,你需要把下面的程式碼修正,不過,你只能增加或是修改一個字元,請你給出三種答案。

 int n = 20;

 for( int i = 0; i < n; i--){

  int n = 20; 
  for(int i = 0; -i < n; i--){

  int n = 20; 
  for(int i = 0; i < n; n--){
  int n = 20; 
  for(int i = 0; i + n; i--){

Note: Setting VC2010 compiler for Phoenix SCT2

Microsoft Download center provide  Windows 7 SDK with .Net framework 4 The SDK include a free VC 2010 compiler.

File: SetVars.bat,  VC 2010 Environment variables, see below

set VCROOT=D:\VC2010
IF NOT “%VC2010Install%" == “" set VCROOT=%VC2010Install%

SET INCLUDE=%VCROOT%\include;%VCROOT%\PlatformSDK\Include;
SET LIB=%VCROOT%\lib;%VCROOT%\PlatformSDK\Lib;

File: BuildEnv.bat in SCT Directory, see below

%comspec% /k call SetVars.bat

File: setvars.bat in SCT Directory, see below

call D:\VC2010\setvars.bat
CD projects\AlpineBayCrb00

the VC2010 just need the following parts

│  ├─1033
│  ├─dll
│  ├─ia64
│  │  └─1033
│  ├─x86_amd64
│  │  └─1033
│  └─x86_ia64
│      └─1033
│  └─src
│      ├─AMD64
│      ├─cliext
│      ├─cvt
│      ├─IA64
│      ├─intel
│      ├─msclr
│      │  └─com
│      └─sys
│  ├─cliext
│  ├─CodeAnalysis
│  ├─cvt
│  ├─Manifest
│  ├─msclr
│  │  └─com
│  └─sys
│  ├─amd64
│  └─ia64
│  └─gl
│  ├─AMD64
│  └─IA64
├─Include Updates

Note: A simple PCI device scan under DOS

Use OpenWatcom v1.9, Test on VMWare Workstation and FreeDOS 1.0

the demo code just check & show VID:DID

// FILE: main.c
#include <stdio.h>
#include “pcilib.h"

void printProgramInfo(void);
void printExitInfo(void);

int main(int argc, char *argv[])
    int bus = 0;
    int dev = 0;
    int func = 0;
    unsigned char cfg[256];

    do {
        if (dev > MAX_PCIDEV) {
            dev = 0;
        if (EnumerationPCIDevice(bus, dev, func, cfg, sizeof(cfg)) == 0) {
            PCI_COMMCFG *commcfg = (PCI_COMMCFG*)cfg;

            printf(“B%02X:D%02X:F%02X, VID:%04X, DID:%04X\n",
                bus, dev, func,
                commcfg->vid, commcfg->did);
            if (func == 0) {

        if (func >= MAX_PCIFUNC) {
            func = 0;
        } else {
        if (func == 0) dev++;
    } while (bus < MAX_PCIBUS);
    return 0;

void printProgramInfo(void)
    printf(“PCI SCAN by KunYi Chen\n");
    printf(“kunyi.chen (at)\n");

void printExitInfo(void)
    ; // do nothing!

// FILE: pcilib.c
#include <assert.h>
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include “pcilib.h"

static u32 mkconf(int bus, int dev, int func)
    assert((bus <= MAX_PCIBUS) && (bus >= 0));
    assert((dev <= MAX_PCIDEV) && (dev >= 0)) ;
    assert((func <= MAX_PCIFUNC) && (func >= 0));
    return ((1<<31) | (bus<<16) | (dev<<11) | (func<<8));

int EnumerationPCIDevice(int bus, int dev, int func, unsigned char *cfg, int buffsize)
    u32 conf;
    u32 id;
    int i;
    assert((buffsize <= 256) && (buffsize > 0));
    conf = mkconf(bus, dev, func);
    outpd(IO_PCICFG, conf);
    id = inpd(IO_PCIDATA);
    if (id == 0xFFFFFFFF) {
        return -1;

    // currently, buffsize should be 256 bytes, others value maybe will get a failed  result
    for (i = 0; i < buffsize; i+=4) {
    u32 tmp;
    outpd(IO_PCICFG, conf+i);
    tmp = inpd(IO_PCIDATA);
    *((u32*)(cfg+i)) = tmp;
    return 0;

// FILE: pcilib.h
#ifndef _PCILIB_H_
#define _PCILIB_H_

typedef unsigned long    u32;
typedef unsigned short    u16;
typedef unsigned char    u8;

#define MAX_PCIBUS    (255)
#define MAX_PCIDEV    (31)
#define MAX_PCIFUNC    (7)

#define IO_PCICFG    (0xCF8)
#define IO_PCIDATA    (0xCFC)

int EnumerationPCIDevice(int bus, int dev, int func, unsigned char *cfgbuf, int bufsize);

typedef struct _PCI_CFGSPACE_ {
    u16 vid; // Vendor ID
    u16 did; // Device ID
    u16 cmd; // Command
    u16 sts; // Status
    u8  rid; // Revision ID
    u8  itf; // Interface
    u8  scls; // Sub Class
    u8  bcls; // Base Class
    u8  reserve[244];
    u8  cache; // Cache line size
    u8  latch; // Latch Timer
    u8  typ; // Head type
    u8  bist; // BIST, Built In Self Test

#define BSCLS_BUILTIN                   (0x00)
#define BSCLS_MASS_STORAGE              (0x01)
#define BSCLS_NETWORK                   (0x02)
#define BSCLS_DISPLAY                   (0x03)
#define BSCLS_MULTIMEDIA                (0x04)
#define BSCLS_MEMORY                    (0x05)
#define BSCLS_BRIDGE                    (0x06)
#define BSCLS_BASE_SYSTEM               (0x08)
#define BSCLS_INPUT                     (0x09)
#define BSCLS_DOCKING_STATION           (0x0A)
#define BSCLS_PROCESSOR                 (0x0B)
#define BSCLS_SERIAL_BUS                (0x0C)
#define BSCLS_WIRELESS                  (0x0D)
#define BSCLS_IIO                       (0x0E)
#define BSCLS_CRYPTION                  (0x10)
#define BSCLS_DAQ                       (0x11)
#endif /* END OF _PCILIB_H_ */

#CC = wcc
CC = wcc386

#CFLAGS = -zq
#CFLAGS = -mf -zq -d3
CFLAGS = -mf -zq

# use CauseWay
# Debug command line: WD /trap=cw pciscan.exe
#LNKOPT = system CauseWay DEBUG all
LNKOPT = system CauseWay

.EXTENSIONS: .exe .lib .obj .c

pciscan.exe : main.obj pcilib.obj
    wlink $(LNKOPT) file main.obj, pcilib.obj name pciscan

    $(CC) $^& $(CFLAGS)