標題只是一篇文章的開始罷了.
一開始知道有這種轉接環, 是無意在拍賣裡翻到的, 以前從來也沒想過 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月26日 星期一
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.
注意你的性格,它會變為你的命運。
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),
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 當撥接器..
首先的, ublox G350 它可以對 UART 的波型做相位修正的工作, 也就是 baud auto-detect, 所以這裡並沒有 UART 的通訊與控制等.
首先的要在 control-panel 裡設定網路 (Network and Dial-up Connections), 設定撥號 (Make new Connection),
- 設定電話簿名稱 (註: 這個名字十分重要, 請盡可能用英文名), Dial-up connection, next.
- 選擇好 COM (device properites 有些該注意的設定像 baud, data bits, parity, stop bits, flow-control 要注意, 還有第二頁的 "Extra settings" 請一定要在這裡設定好 APN 名稱指令, 如 +cgdcont=1,"IP","internet" ), next.
- 設定 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;
}
------------
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 不會知道也不會關心.
這是 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,
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 是相反的..
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 是相反的..
2013年4月6日 星期六
所謂景深
其實在這之前就有人寫過一篇專文專門講景深:
寫給新手:景深概論
這裡只是再貼幾張實拍圖佐證而已.
理論在那篇文裡已經提了很多, 總之淺景深決定在
主體物靠最近對焦距離越近, 效果越明顯.
再來就是焦段. 實際上, 實體焦段越長的, 越容易拍出淺景深:
這是 Tamron A005 300mm 焦段拍的. 這個光圈更小, F 9.0
長焦段其實意味另一個物理意義, 就是影像的光學放大比例, 焦段越長, 光學放大倍率越高, 所以沒有被合焦到的地方, 影像會因為散焦的關係, 成像會更加的柔和.
這張就是一個例子, 這張照片是拿 Nikon D600 + Nikon 16-35 拍的, 左邊看起來景深很深, 右邊看起來景深很淺. 但這兩張其實是同一張圖. 左邊是原圖 6106x4016 縮 640x480, 右邊是原圖切割出其中的 640x480, 相當於 300.8mm 的焦段. 所以, 這邊只是要簡單的說明, 柔焦是另一種影像被放大, 但不合焦後的成像.
再來要講的就是焦距, 特別是最近對焦距. 最近對焦距通常要透過查詢 (通常會標在鏡頭上) 或實測來得到這個值, 基本上越長的焦段, 但越短的最近對焦距, 會擁有更深的景深效果. 如下面這張, 這張拍照時使用的光圈也不大, F5.6, 但因為這顆鏡頭最近對焦距離只有 0.28m (即使是在 70mm 焦段), 前景和背景分離的效果變的很出色:
但因為最近對焦距離已經算是被鏡頭訂死的限制, 所以除非鏡頭本身就可以對焦對很近, 否則不要把這個因素擺在平常會考慮的項目裡.
再來才是光圈和片幅. 光圈和片幅一個被訂死在鏡頭, 一個被訂死在機身, 鏡頭的光圈值有時會因為實拍環境下的亮度, 還有畫面清析程度, 甚至是對焦的易難考量下, 除非是夜間, 否則基本上很少會去用極大光圈去拍,
當然不可否認的, 大光圈有它的效果在. 只是我會建議先滿足前面的距離比條件後, 再去開大光圈才會有用, 像這張 (50mm F1.4D F2.8):
並不是即使離很遠, 狂開光圈也會有淺景深, 絕對不會是這個樣子.
我不把大光圈寫在前面是因為, 把光圈開大其實有很多壞處, 畫質下降和對焦失焦率大增是很嚴重的影響. 像這張我就拍了五六張才準焦兩張, 挑其中的一張出來 (50mm F1.4D F2.8):
夜間拍攝時, 大光圈絕對是必要之惡... (AiS 55mm F1.2, F1.2)
景深的確很淺, 沒錯.
但很柔的背景中卻沒有清楚的前景, 這跟直接失焦有什麼差別? :P
最後最後, 講到片幅嘛... 這是相機裡根本不可能變動的因子, 基本上討論它沒有太大意義, 不過還是拿來講一下...
試想, 底片上所產生的成像, 這個影像就是你在觀景窗或 lifeview 裡看到的影像, 所以這個影像裡的相對距離分離的有多遠, 就相對於在底片上的相對距離有多遠.
這張是拿 Panasonic GF2 拍的, GF2 的片幅只有多小, 我想不需要我再提..
其實會有這個效果是因為它裝的是 50mm 焦段的鏡頭. (canon FL 50mm F1.8 S.C.)
這張是 Panasonic FS-12, 片幅是 1/2.33 吋, 這時鏡頭焦段只有 5.5mm, 所以不用期待它會有什麼景深...
這是後來 (20130521) 做的測試, 跟上一張不一樣的地方在, 這次有開微距. 在足夠近的對焦距離下, 就可以構成分離度夠好的前景與背景:
可以確定的是只有 5.5mm 這種極短焦距的鏡頭也可以做的到散景, 但必需要靠的很近就是它先天 (廣角焦段) 的限制.
以下是手機 Sony ericsson Xperia ARC.
這張是 Sony ericsson Xperia ARC 照的. 片幅有多大我忘了, 總之不會有 DC 那麼 "巨大". 這個鏡頭焦段只有多少我不清楚, 我是猜比 DC 還要短. 所以跟 DC 一樣光學放大率都不高, 基本上也不要期待有太好的景深...
片幅, 也就是底片有效範圍的影響, 其實也是另外一種距離因素, 只是它是橫寬, 不是縱深. 但是相機裡的空間不管再怎麼寬, 也不會比外在要拍的環境縱深來的深, 換言之, 用片幅的橫寬來換取外在景物的縱深, 是完全的捨本逐末.
總之, 片幅有影響, 但都遠遠不如前面四個因素 (距離, 焦長, 對焦距離, 光圈) 的影響來的大, 幾乎是可以被忽略的因素.
ok. 最後!! 希望大家都能只用手機, 就可以拍的出想要的淺景深.
寫給新手:景深概論
這裡只是再貼幾張實拍圖佐證而已.
理論在那篇文裡已經提了很多, 總之淺景深決定在
- 距離. 特別是前景離的有多遠
- 焦段. 焦段越長其實效果越明顯.
- 焦距. 越貼近最近對焦距, 效果會越明顯.
- 光圈. 這個是很多論譚大大最愛提的
- 片幅. 老實講這是最不重要的.
這是用 50mm, 光圈 F4.0 下拍的:
這是 50mm, 也是光圈 F4.0 下拍的. 不一樣的是離的比較近.
這是 50mm, 但光圈更小, F5.6. 不一樣的是距離靠的非常近, 用最近焦距在拍.
再來就是焦段. 實際上, 實體焦段越長的, 越容易拍出淺景深:
這是 Tamron A005 300mm 焦段拍的. 這個光圈更小, F 9.0
長焦段其實意味另一個物理意義, 就是影像的光學放大比例, 焦段越長, 光學放大倍率越高, 所以沒有被合焦到的地方, 影像會因為散焦的關係, 成像會更加的柔和.
這張就是一個例子, 這張照片是拿 Nikon D600 + Nikon 16-35 拍的, 左邊看起來景深很深, 右邊看起來景深很淺. 但這兩張其實是同一張圖. 左邊是原圖 6106x4016 縮 640x480, 右邊是原圖切割出其中的 640x480, 相當於 300.8mm 的焦段. 所以, 這邊只是要簡單的說明, 柔焦是另一種影像被放大, 但不合焦後的成像.
再來要講的就是焦距, 特別是最近對焦距. 最近對焦距通常要透過查詢 (通常會標在鏡頭上) 或實測來得到這個值, 基本上越長的焦段, 但越短的最近對焦距, 會擁有更深的景深效果. 如下面這張, 這張拍照時使用的光圈也不大, F5.6, 但因為這顆鏡頭最近對焦距離只有 0.28m (即使是在 70mm 焦段), 前景和背景分離的效果變的很出色:
但因為最近對焦距離已經算是被鏡頭訂死的限制, 所以除非鏡頭本身就可以對焦對很近, 否則不要把這個因素擺在平常會考慮的項目裡.
再來才是光圈和片幅. 光圈和片幅一個被訂死在鏡頭, 一個被訂死在機身, 鏡頭的光圈值有時會因為實拍環境下的亮度, 還有畫面清析程度, 甚至是對焦的易難考量下, 除非是夜間, 否則基本上很少會去用極大光圈去拍,
當然不可否認的, 大光圈有它的效果在. 只是我會建議先滿足前面的距離比條件後, 再去開大光圈才會有用, 像這張 (50mm F1.4D F2.8):
並不是即使離很遠, 狂開光圈也會有淺景深, 絕對不會是這個樣子.
我不把大光圈寫在前面是因為, 把光圈開大其實有很多壞處, 畫質下降和對焦失焦率大增是很嚴重的影響. 像這張我就拍了五六張才準焦兩張, 挑其中的一張出來 (50mm F1.4D F2.8):
夜間拍攝時, 大光圈絕對是必要之惡... (AiS 55mm F1.2, F1.2)
景深的確很淺, 沒錯.
但很柔的背景中卻沒有清楚的前景, 這跟直接失焦有什麼差別? :P
最後最後, 講到片幅嘛... 這是相機裡根本不可能變動的因子, 基本上討論它沒有太大意義, 不過還是拿來講一下...
試想, 底片上所產生的成像, 這個影像就是你在觀景窗或 lifeview 裡看到的影像, 所以這個影像裡的相對距離分離的有多遠, 就相對於在底片上的相對距離有多遠.
這張是拿 Panasonic GF2 拍的, GF2 的片幅只有多小, 我想不需要我再提..
其實會有這個效果是因為它裝的是 50mm 焦段的鏡頭. (canon FL 50mm F1.8 S.C.)
這張是 Panasonic FS-12, 片幅是 1/2.33 吋, 這時鏡頭焦段只有 5.5mm, 所以不用期待它會有什麼景深...
這是後來 (20130521) 做的測試, 跟上一張不一樣的地方在, 這次有開微距. 在足夠近的對焦距離下, 就可以構成分離度夠好的前景與背景:
可以確定的是只有 5.5mm 這種極短焦距的鏡頭也可以做的到散景, 但必需要靠的很近就是它先天 (廣角焦段) 的限制.
以下是手機 Sony ericsson Xperia ARC.
這張是 Sony ericsson Xperia ARC 照的. 片幅有多大我忘了, 總之不會有 DC 那麼 "巨大". 這個鏡頭焦段只有多少我不清楚, 我是猜比 DC 還要短. 所以跟 DC 一樣光學放大率都不高, 基本上也不要期待有太好的景深...
片幅, 也就是底片有效範圍的影響, 其實也是另外一種距離因素, 只是它是橫寬, 不是縱深. 但是相機裡的空間不管再怎麼寬, 也不會比外在要拍的環境縱深來的深, 換言之, 用片幅的橫寬來換取外在景物的縱深, 是完全的捨本逐末.
總之, 片幅有影響, 但都遠遠不如前面四個因素 (距離, 焦長, 對焦距離, 光圈) 的影響來的大, 幾乎是可以被忽略的因素.
ok. 最後!! 希望大家都能只用手機, 就可以拍的出想要的淺景深.
2013年4月4日 星期四
Sigma 8-16mm F4.5-5.6 DC 小小測試
這裡只是做一點小比較, photozone 做的測試較精準且量化的多, 當然我絕對不是因為這顆拿到 Highly Recommend 才買它的.. 會買這顆是考慮幾個理由:
缺點唷.... 目前的感想:
先來幾張外觀照:
打開的樣子. 花瓣照是死的, 不能上保護鏡

16mm (可用範圍):
老實講比起 nikon 16-35 F/4G 這個變形王起來好太多了 =_=
- 10mm 的焦段加上 APS-C 的 crop-size 約等於 135片幅下 15mm 焦段的裁切範圍, 而 135 片幅用的鏡頭也有 16mm 廣角. 而且我自己有一顆 16-35, 我會覺的買 10-24 等於再買一顆 16-35 一樣..
- 有人很喜歡呱呱呱的說啥等效焦段, 但實際上 10mm 焦段下的所有光學特性 (焦距, 放大比例, 廣角的峽狀變形, 遠近物的分離感, ...) 跟 15mm 根本不一樣. 有興趣深究的人可以找找 sigma 8-16 和 12-24 這兩顆鏡頭拍出來的感覺, 12-24 的 12 端再怎樣都不會有 8-16 的 8 端那麼誇張的峽狀變形效果. 簡單的說, 焦段本身是無法被取代的一樣參數, 也不會是被等於的東西, 它最多只能被稱為 等效.
- 8-16 這種焦段, APS-C 底片用, 而且還是非魚眼, 以我所知除了 sigma 以外沒有第二家有做這種產品, 而 10mm 以下的非魚眼變焦, 另一顆更有名的是 Olympus 7-14mm F4 這顆 (4/3 mount), Panasonic 的版本應該也是拿這顆再改成 M4/3 mount, Panasonic 這顆在 photozone 的測試裡, 解析力也蠻強的, 也同樣拿到四顆星的推薦獎.
可是這顆市價比 Sigma 貴, Olympus 那顆的價格是 Panasonic 大約再乘以二, 相較之下這顆就算只能 MF 都比較超值, 但是, 它是 4/3 (M4/3) mount, 別的機種 (ex. NEX, samsung NX, ...) 沒有用它的機會, 對我是沒有吸引力的 :P (這顆有機械光圈) - 光圈葉片數比較多, 這顆是七片, 12-24 和 12-24II 是六片, 夜拍的效果會好上一點點. 而且其實這顆跟 12-24II 之間我比較過很久, 有部份是因為畫質的因素選了這顆.
- Nikon 家的 135 DSLR 都可以吃 DX 鏡頭, 就算換 135 DSLR 也沒什麼差別..
- 因為它焦距短, 景深深, 所以手動對焦非常好對.
缺點唷.... 目前的感想:
- 可用光圈不夠大. 不過這是它的缺點同時也是優點.
- 沒防手震. 有防手振的話可能就不會那麼利了吧...
- 手動對焦環阻力頗大. 但我覺的這同時也是它的優點.
- 花瓣罩是死的, 也無法上保護鏡. 個人覺的不很適合當旅遊鏡.
- 花瓣罩用的鋁外框並沒有扣住鏡頭, 而鏡頭蓋是扣在鋁外框上的.
先來幾張外觀照:
打開的樣子. 花瓣照是死的, 不能上保護鏡

外蓋. 72mm口徑. 鏡頭在裝上這東西時, 只有 16mm 焦段不會被擋到... XD
請小心, 它的帽子並沒有扣到鏡頭...
以下是測試照片, 都以 16mm 焦段, 全開放光圈為主. 機身 Panasonic GF2, 有外接閃光燈, 手動模式觸發, AWB為閃光燈, 4000x3000 大小, 100% 裁切 1024x768 大小 (相對座標為 x:1310, y:1250) 圖塊做比較:
Nikon 16-35mm F/4G ED VR 16mm段, F4.0
Panasonic 14-42 F3.5-5.6 (kit 鏡), 16mm 段, F5.6
Sigma 8-16 16mm段, F5.6
老實講如果不論發色, 這裡面 Panasonic 的 kit 鏡解析力較 Sigma 稍優....
而且 16mm 其實對 Sigma 這顆是最不利的焦段, 解析力都可以拼成這樣.
update 20130615: 新增 12, 14, 16 端在 full-frame (135) 機器上的成像範圍供參考:
12mm:
14mm (這時勉強算可用範圍):16mm (可用範圍):
其它的原始測試照片 (縮圖) 可以來這裡看
其它一些零散的測試照.
廣角星芒的一個共通點, 就是小... 沒辦法, 畫面收太廣, 單一個光源的折射光範圍一定會變小..
訂閱:
文章 (Atom)



























