2013年9月18日 星期三

筆記 xz + dd

It's note for note, just note..

assume file is "DDimage.img.xz", target device is "/dev/sda"
decompress:
xzcat DDimage.img.xz | dd of=/dev/sda bs=1M

compress:
dd if=/dev/sda | xz -cz9 > DDimage.img.xz

please don't ask me why not multi-thread with xz, I don't know how to do.....

see the progress every 5's
watch -n 5 pkill -USR1 ^dd$

2013年9月8日 星期日

kernel 3.2.50 on i.MX35

1. 這篇是筆記文, 備份用+自爽用, 所以不具參考價值.
2. 這篇重點在講 cross kernel build. 所以 BSP 支援的怎樣那我不管...
3. 我不保證其它平臺這樣 cross-compile 可以用, 最少我 Marvell 88F6281 就沒成功過.

拿 kernel source 前先弄到 toolchain, toolchain 就很多來源了, 所以不討論. 拿到 3.2.50 解開後, 因為我是要 build 到 i.mx35, 它是 ARM, 所以先來這裡看:
find arch/arm/configs/ |grep "mx"
arch/arm/configs/imx_v4_v5_defconfig
arch/arm/configs/mx3_defconfig
arch/arm/configs/mx5_defconfig
arch/arm/configs/mxs_defconfig

好吧, 精簡成這樣. 我要的是 mx35, 所以是 mx3_defconfig.
make ARCH=arm CROSS_COMPILE=${請自行代入 tool-chain 的東西} mx3_defconfig
可以先看到一些 kernel.org 預設的一些選項, 在這建議加上幾個 framebuffer 用的東西:

Device Drivers->Character devices->
[*] Virtual terminal
[*]   Enable character translations in console
[*]   Support for console on virtual terminal
[*]   Support for binding and unbinding console drivers

這樣才可以在 Graphics support 裡看到 Console display driver support.
有這個東西, 在不需要掛 rootfs 就可以測試 framebuffer 是不是運作正常, 像 console message, 像那欠打的企鵝. 那企鵝還可以拿來當校色標準, 看要調整成 RGB565 還 RGB666 還 RGB24 或其它. 當然, Support for frame buffer devices -> MX3 Framebuffer support 也別忘了選上.

panel 的設定可以參考 arch/arm/mach-imx/mach-pcm043.c 裡的設定與註冊方法, SDHC 也可以參考它的. Phytec 這個 PCM043 有相當多有用的 code 可以參考來當自己 target board 的設定.

NAND 的 partition 註冊:
static struct mtd_partition mxc_nand_partitions[] = {
        {
         .name = "nand.bootloader",
         .offset = 0,
         .size = 4 * 1024 * 1024,
        },
        { //自己加, 這個是最後一段.
         .name = "nand.rootfs",
         .offset = MTDPART_OFS_APPEND,
         .size = MTDPART_SIZ_FULL,
        },
};

static const struct mxc_nand_platform_data mx35pdk_nand_board_info __initconst = {
        .width = 1,
        .hw_ecc = 1,
        .flash_bbt = 1,
        .parts = mxc_nand_partitions,
        .nr_parts = ARRAY_SIZE(mxc_nand_partitions),
};

//board_init 加上
//imx35_add_mxc_nand(&mx35pdk_nand_board_info);

再來頂多是自己在 kernel 裡新增加自己的板子代號, 不過老實講意義不大... 所以略過.

ps. 20130930 3.11.1 裡是 imx_v4_v5_defconfig 這一個

2013年8月26日 星期一

轉接環 M4/3 to E-mount

標題只是一篇文章的開始罷了.

一開始知道有這種轉接環, 是無意在拍賣裡翻到的, 以前從來也沒想過 M4/3 還有再被轉接的機會, 有了這種轉接環..

以前買的 M4/3 用的轉接環也就可以直接套用上去了:

不過手上所有 M4/3 可用的鏡頭裡, 當然是選用當然是接以前底片機用的鏡頭, 自動鏡頭本身就沒有機械對焦環, 轉上去 100% 有暗角, 所以全部放棄. 而過去的手動鏡裡最喜歡的還是 canon FD 這顆老鏡:

於是再跟友人借了 NEX-7 來重新玩玩這顆鏡頭, 果然它的表現是值得一用再用的

不過, 真的要為了老鏡轉接再去準備一臺 NEX? 老實講我覺的太貴了... 後來考慮了很久, 決定先用這個暫代..


它鏡片其實是可以取下的.

相較於其它手動鏡接環來說, 個人喜歡用 FD 有一點就是因為它有對焦用的測光連動桿:

當然, 有了校正鏡片, 也就會有幾個影響.. 下面寫目前看起來很明顯的:
1. 可視角變窄. 這樣說, 等效 x1.2 焦段. (x1.2 又怎樣呢, 轉 APS-C 上是 x1.5 啊.. XD)
2. 全開光圈下感覺銳利度有上升.. 以前開 F1.8 時根本不能看..:

3. 對比較亮的場合, 如天空, 會泛光泛的非常嚴重...


光線暗一點時, 無限遠端的畫質有提升很多... (這張是 1:1, 100% crop)

總之感覺上不甚滿意, 但總比花大錢再弄個機身划算那麼一點...

update 2014/03/27 補上 canon s.c. 50mm f/1.8 加鏡後距校正鏡片的星芒照

2013年8月20日 星期二

名言

其實這幾句話意義很深刻. 源自於 The Rt Hon. Margaret Thatcher, 柴契爾夫人.

Watch your thoughts , for they become words.
注意你的思想,它們會變為言語。

Watch your words , for they become actions.
注意你的言語,它們會變為行動。

Watch your actions , for they become habits.
注意你的行動,它們會變為習慣。

Watch your habits , for they become character.
注意你的習慣,它們會變為性格。

Watch your character , for it becomes your destiny.
注意你的性格,它會變為你的命運。

2013年6月21日 星期五

Windows CE, GPRS.

實驗的筆記, 沒有在 ublox G350 以外的 GPRS modules 確認過.

首先的, ublox G350 它可以對 UART 的波型做相位修正的工作, 也就是 baud auto-detect, 所以這裡並沒有 UART 的通訊與控制等.

首先的要在 control-panel 裡設定網路 (Network and Dial-up Connections), 設定撥號 (Make new Connection),

  1. 設定電話簿名稱 (註: 這個名字十分重要, 請盡可能用英文名), Dial-up connection, next.
  2. 選擇好 COM (device properites 有些該注意的設定像 baud, data bits, parity, stop bits, flow-control 要注意, 還有第二頁的 "Extra settings" 請一定要在這裡設定好 APN 名稱指令, 如 +cgdcont=1,"IP","internet" ), next.
  3. 設定 phone number, 一般用 *99#, 但並不是所有的電信業者都一模一樣, 請注意.
因為在 code 裡面是呼叫電話簿來使用, 所以電話簿本身的設定正不正確, 直接影響 GPRS 能不能正常連線.

再來是 code.
//pwEntryName 就是電話簿名稱, 所以前面提這個名字非常重要.
//pRasConn 是之後連線狀況取得與斷線會用上的 handle, 必需保留.


int RAS_Dial(TCHAR pwEntryName[20], HRASCONN *pRasConn)
{
RASDIALPARAMS tRasDialParams = { 0 };
int nERR = 0;

tRasDialParams.dwSize = sizeof(RASDIALPARAMS);
_tcscpy_s(tRasDialParams.szEntryName, 20, pwEntryName);

RasGetEntryDialParams(pwEntryName, 0, 0);

nERR = (int)RasDial(0, 0, &tRasDialParams, (DWORD)-1, 0, pRasConn);

return nERR;
}

int RAS_HangUp(HRASCONN tRasConn)
{
return (int)RasHangUp(tRasConn);
}

int RAS_GetConnectState(HRASCONN tRasConn)
{
RASCONNSTATUS tStatus = { 0 };

RasGetConnectStatus(tRasConn, &tStatus);

if(tStatus.rasconnstate == RASCS_Connected)
{
return 1;
}

return 0;
}

其中比較奇怪的在 RasDial 這裡的 hwnd 要直接給它 null 不能傳入 cWnd 裡的 hwnd 參數, 否則無法工作, 這個不知道是為什麼.

純筆記.

2003/06/23 update:
如果覺的沒有撥號圖示感覺好像少了什麼似的, 的話, 來試試第二個方法. 第二個方法比較簡單:
rnapp.exe -m -n -p -eDIALUPNAME
DIALUPNAME 就是在電話簿裡取的名字.

以下就是可有可無的東西了, 但是很多...

這樣做通常還要再搭配另一個東西, windows-message receiver, 專門去接收 WM_NETCONNECT 這個訊息, 在 MFC 底下可以設定一個很簡單的訊息接收器, 像這樣:

.h
------------
#ifndef WM_NETCONNECT
#define WM_NETCONNECT 0x3feL
#endif

#ifndef RAS_MaxEntryName
#define RAS_MaxEntryName 20

#endif

typedef struct tagRNAAppInfo {
   DWORD dwSize;
   DWORD hWndRNAApp;
   DWORD Context;
   DWORD ErrorCode;
   TCHAR RasEntryName[RAS_MaxEntryName+1];
} RNAAPP_INFO, *PRNAAPP_INFO;

class Ctheapp : public CWnd
{
afx_msg LRESULT msg_NetConnect(WPARAM, LPARAM);
}
------------

.cpp
------------
BEGIN_MESSAGE_MAP(Ctheapp, CWnd)
ON_MESSAGE(MSG_UI_INIT, msg_NetConnect)
END_MESSAGE_MAP()

LRESULT Ctheapp::msg_NetConnect(WPARAM wParam, LPARAM lParam)
{
BOOL bConnect = (BOOL)wParam;
PRNAAPP_INFO pInfo = (PRNAAPP_INFO)lParam;

if(bConnect)
wprintf(L"connect to %s\n", pInfo->RasEntryName);
else
wprintf(L"%s Disconnect\n", pInfo->RasEntryName);

return 0;
}
------------

要斷線更麻煩, 要用 findwindow 去找到 rnaapp.exe 後對它發 message. 所以一開始就不使用 rnaapp 當撥接器..


2013年6月7日 星期五

Windows CE 下 flash memory raw data 操作

這個部份的操作, 其實在有 BSP code 時就有注意到了, 但是微軟有關 "IOCTL_FLASH_PDD" 方面的資料並不算很多, 網路上更是少的可以..
這是 FLASH_PDD 整個 driver 的架構一覽:
http://msdn.microsoft.com/en-us/library/bb821532.aspx
從這裡可以知道, FLASH PDD driver 其實是比一般 disk IO 更底層的 driver, 一般皆使用 DeviceIoControl 去操作, 在這裡有 CE 提供的既有功能:
http://msdn.microsoft.com/en-us/library/ee484253(v=winembedded.60).aspx

好的, 從這裡可以知道有哪些工具可以用. 至於這些 DeviceIoControl 用的 header, 其實要用 OpenStore() 去開, 而非 CreateFile 開 DSK?:
http://msdn.microsoft.com/en-US/library/ee489981(v=winembedded.60).aspx

到這裡, 才算是真正可以拿到 flash memory (可能是 NAND, 可能是 NOR, 不一定) 的 RAW data.

example code: (read only)

int GetNandAssignData(void *pvDstData, int nSectorAddr, int nSectorCount)
{ //for XP35C6, iVC1 only.
HANDLE hndDSK = 0;
int nERR = -1;
FLASH_PDD_TRANSFER
tPDDtrans;

FLASH_READ_STATUS
tPDDstate;

hndDSK = OpenStore(L"MSFlash");

if(!hndDSK || hndDSK == INVALID_HANDLE_VALUE) return -1;

tPDDtrans.pData = (unsigned char*)pvDstData;
tPDDtrans.pSpare = 0;
tPDDtrans.RegionIndex = 0;
tPDDtrans.SectorRun.StartSector = nSectorAddr;
tPDDtrans.SectorRun.SectorCount = nSectorCount;

nERR = (int)DeviceIoControl(
hndDSK, 
IOCTL_FLASH_PDD_READ_PHYSICAL_SECTORS,
&tPDDtrans,
sizeof(FLASH_PDD_TRANSFER),
&tPDDstate,
sizeof(ULONG),
0,
0);

CloseHandle(hndDSK);

if(nERR) return 0;
else return -2;
}

版權沒有, 僅管拿去用.

到這裡還需要的, 尚有:
1. BSP 設定的 flash memory map. 有這個地圖, 才會知道哪區擺的是哪個.
2. Flash 的 page size, spare size, block size.
3. NAND 需要 ECC 產生器, 而且必需要跟原本用的格式一樣.

目前試過 physical read 跟 block erase 沒有問題, 寫入因為欠 ECC 產生器作罷.

ps. 20130610後記: 在 FreeScale 官方 Windows CE BSP 上 page read/write 皆無 spare, spare 的部份設定只能借 block get/set (FLASH_BLOCK_STATUS_BAD, FLASH_BLOCK_STATUS_RESERVED) 得到或設定這個 flag.
別家的 SoC 的 BSP 有沒有把這部份 implement 的夠完整? 我不知道, 我也沒辦法做任何保證. 畢竟 BSP code 裡有多少地雷, 老闆跟 PM 不會知道也不會關心.

2013年4月8日 星期一

i.MX51 u-boot splash screen supported

其實我是下載這包 code 後才發現現在 u-boot (2013.04.rc2) 有支援 i.MX51, 53 的 splash screen (boot-screen), 而且也支援 console stdout 轉向.

http://www.eewiki.net/display/linuxonarm/i.MX51+EVK

附帶一提, USB EHCI 也支援了, 而且傳輸速度相當的快 (實測有 34MiB/s, 不知道是我眼花還是怎樣..)

只是目前有兩個東西還沒打通, 還在試. 一個是 SPI NOR flash, 一個是 NAND flash (有人有出 patch, 我有照著改, 但還是不會動).

擺在這筆記一下.

ps. 2013/04/10 在 denx u-boot 官方的 mxc-spi.c code 裡, 它操作 SS0/SS1 這些 chip-select 動作都是用 gpio_set_value 的方式達成. 這樣的做法有好有壞, 以下就以不更動 denx 的 driver code 前提下修改板子的定義 header ( include/configs/%board%.h )

我是修改自 vision2, 還有 mx51_efikamx 的設定而來.
-------------------------------------------------

/*
 * SPI Configs
 */
#define CONFIG_CMD_SPI
#define CONFIG_MXC_SPI

#define CONFIG_FSL_SF
#define CONFIG_CMD_SF

#define CONFIG_SPI_FLASH
#define CONFIG_SPI_FLASH_ATMEL   //看需要更改.

/*
 * Use gpio 4 pin 25 as chip select for SPI flash
 * This corresponds to gpio 121
 */
#define CONFIG_SF_DEFAULT_CS     ( 1 | (121 << 8 ) )
#define CONFIG_SF_DEFAULT_MODE   (SPI_MODE_0)
#define CONFIG_SF_DEFAULT_SPEED  25000000

#define CONFIG_ENV_SPI_CS        ( 1 | (121 << 8 ) )
#define CONFIG_ENV_SPI_BUS       0
#define CONFIG_ENV_SPI_MAX_HZ    25000000
#define CONFIG_ENV_SPI_MODE      (SPI_MODE_0)

//384KiB
#define CONFIG_ENV_OFFSET       (6 * 64 * 1024)
#define CONFIG_ENV_SECT_SIZE    (1 * 64 * 1024)
#define CONFIG_ENV_SIZE         (4 * 1024)

//這邊的設定要注意擺在哪裡.
#define CONFIG_FSL_ENV_IN_SF
#define CONFIG_ENV_IS_IN_SPI_FLASH

// 這個定義建議一起改掉.
#define CONFIG_FSL_PMIC_CS      ( 0 | (120 << 8 ) )
-------------------------------------------------

以上還不是最主要的, 最主要的在 board init 的 code 裡. 以下翻改自 mx51evk.c, 紅色是刪除, 藍色是新增:
-------------------------------------------------

#ifdef CONFIG_MXC_SPI
static void setup_iomux_spi(void)
{
        /* 000: Select mux mode: ALT0 mux port: MOSI of instance: ecspi1 */
        mxc_request_iomux(MX51_PIN_CSPI1_MOSI, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_MOSI, 0x105);

        /* 000: Select mux mode: ALT0 mux port: MISO of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_MISO, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_MISO, 0x105);

        /* de-select SS1 of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_SS1, IOMUX_CONFIG_ALT3);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_SS1, 0x85);

        /* 000: Select mux mode: ALT0 mux port: SS0 ecspi1 */
        //mxc_request_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT0);
        //mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0, 0x185);
        mxc_request_iomux(MX51_PIN_CSPI1_SS0, IOMUX_CONFIG_ALT3);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_SS0, 0x85);

        /* 000: Select mux mode: ALT0 mux port: RDY of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_RDY, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_RDY, 0x180);

        /* 000: Select mux mode: ALT0 mux port: SCLK of instance: ecspi1. */
        mxc_request_iomux(MX51_PIN_CSPI1_SCLK, IOMUX_CONFIG_ALT0);
        mxc_iomux_set_pad(MX51_PIN_CSPI1_SCLK, 0x105);
        
        gpio_direction_output(IMX_GPIO_NR(4, 24), 0);   //SS0 active
        gpio_direction_output(IMX_GPIO_NR(4, 25), 1);   //SS1 active
        // IMX_GPIO_NR(4, 24) 可以用 120 取代, IMX_GPIO_NR(4, 25) 可以用 121 取代.
}
#endif

-------------------------------------------------

前面提到 SPI 的 chip-select 是用 GPIO 的方式操作, 所以
1. 只要找好 GPIO 編號拉好線, 理論上就可以再擴充 SPI NOR flash.
2. 操作是單一 pin 單一 chip-select 沒有二進位編碼, 需要更複雜的編碼制可能要自行修改 mxc_spi.c

後記 2013/04/14
SPI ROM 開機有幾點要注意:

1. ROM imae 起始點在 0x400
2. 起始點 0 ~ 0x3FF 這 1024 個 byte 最好全 erase 掉, 否則怪怪的.


後記 2013/09/01:

1. 有的 SPI 會這樣設:
#define CONFIG_SF_DEFAULT_MODE   (SPI_MODE_0 | SPI_CS_HIGH)
SPI_CS_HIGH 的用意是這個裝置 CS 為 high-active, 所以如果是 low-active 的, 千萬不要設...

2. SS0 跟 SS1 一開始不但要改成 GPIO, 還要注意這兩個分別是 hi 還 lo active, 記得預設要讓 bus 空著.


3. 這個設定在 SPI bus 同時有一個裝置以上時, 一定要設定:
#define CONFIG_FSL_PMIC_CS              (0 | 120 << 8) 
否則 gpio_set_value 會無法設定到正確的 GPIO pin.

前面文章是參考 mx51_efikamx 的設定, 卻沒有注意到 SST 跟 ATMEL 的 CS 是相反的..