2013年12月8日 星期日

Helios 40-2

很多人都知道這顆鏡頭的歷史, 它的前身就是 zeiss biotar 75mm f/1.5, 二戰後蘇聯接手東德蔡司後, 做出它的仿版 helios 40, 跟 40-2. 不過這裡講的 helios 40-2 其實都不是以上講的鏡頭. 這裡講的 helios 40-2 是 zenit (KMZ 的鏡頭品牌) 於 2013 年做的復刻版, 追加多抗耀光鍍膜, 也追加推出 EOS, NIkon-F 兩種接環. 至於這顆, 純粹是個人一時手滑, 不小心就敗了...

然後 2013 年的版本上市後, 它又多一個名號, 叫毒神.........

有攜行袋, 有保證書, 但包裝裡沒有任何的緩衝材... =_= 賣給我的賣家很貼心的裡外都包了一大堆包材.

它 950g, 非常的重. 

我買的是原生 Nikon 接環版, 理所當然鏡後蓋是 Nikon 口. 不過這個蓋子很小巧, 我真的覺的應該推廣... (右邊那個是跟機身蓋合一起的樣子)

光圈的開法跟 helios 44 同樣為 preset, 下圖可以看到從鏡頭前到後, 共三個色點, 第一個色點, 紅色色點的是光圈環, 有段, preset 光圈 "設定" 到多少是參考這個值. 第三個色點, 白色色點, 是手轉光圈環(也是最大的那個手轉環), 無段. 以圖中來說, 左圖是光圈設定為 f/22, 但現在全開光圈, 機身看到的光圈是 f/1.5. 右圖是光圈設定為 f/22, 現在全關光圈, 機身看到光圈為設定值 (f/22) 光圈.

也就是說, 手轉光圈環的轉法跟 preset 光圈環是相反方向.

一般建議是 preset 光圈設定到 f/11, 然後轉手轉光圈環去縮光圈, 觀察哪個光圈是你想要的. 因為 preset 光圈環並不好摸到, 也不好轉, 阻尼也大, 遠不如轉手動光圈環, 又好轉, 阻尼又小, 又是無段, 去調整光圈, 這樣還比較直接去轉光圈環好用....


它的光圈形狀也很特別, 有幾個段落並不是圓的, 而是刻意做出菱角狀.. (左到右, 上到下依序為
1.5, 2.0, 2.8,
4.0, 5.6, 8.0,
11, 16, 22)

眼尖的人會發現光圈有磨痕了...

放上一些測試照... (其實網路上很多了)




實際使用是沒碰上耀光的問題, 倒是會在高光環境 + 全開光圈下紫邊會變的明顯, 不過個人覺的這不是什麼問題就是...


這裡前半段日間景物是用這顆鏡拍的, 後面夜景只有沒 EXIF 的才是
https://plus.google.com/u/0/photos/115857288009801884274/albums/5954300724571831857
另一組
https://plus.google.com/u/0/photos/+zettashao/albums/5952777075402081569

這顆鏡的一些使用感想:
  1. 沉重. 但實拍感覺起來還好, 負擔不會太重. 是非常重
  2. 光圈全開 (f/1.5) 時沒想像中亮, 只比 AF-D 85mm f/1.8D 全開光圈時亮一點點..
  3. 因為它焦段夠長, 放大率夠高, 要拍出招牌散景遠較 44/44M 容易.
  4. 建議距離 1m ~ 10m. 4~8m, 其實比起 helios 44/44M 好用很多.
  5. 最近對焦距約鏡前 50cm.
  6. 對焦行程有點長, 從最近到最遠轉約 270度, 而且不很好轉.
  7. 光圈開合建議去轉測光環, 前面有說.
  8. 有招牌散景的建議光圈? f/1.5 ~ f/4.0 間. 不過我覺的要配合背景..
  9. 銳利度? 這個我真的沒去測.. 這顆目前的感想是沒辦法拍很銳利

ps. 20140112 後記
之前並沒有時間去測過最佳散景出現的對焦距離, 以下是在士林官邸實驗幾個對焦距離 (以鏡頭上刻的為準) 的結果 (以下光圈皆開到最大 f/1.5):
2M

3M

4M
8M
12M
其實這裡可以看出 4-8M 距離時效果是最好的, 而 4M 也差不多是一個人體直立全身入鏡的拍攝距離 (這裡指 135 片幅, APS-C 要拉到 6~7M 遠, 但仍在最佳效果對焦範圍內), 而背景物的理想距離是 25米....
但背景物是什麼, 會影響到最好的取景距離. 光圈環可以控制散焦點的大小, 但效果並不好, 特別是對焦距在 3M 以內時, 壓不出遠對焦距會出現的那種散焦光點:
這張光圈開 f/8













所以... 還是要跟 44-2 一樣勤勞一點, 用距離先決會比較容易做的出想要的效果..

2013年11月25日 星期一

簡短感想

嘗試的去做自己討厭的事, 所得到的也往往超過自己以往的想像.

所以我很常會去嘗試我不喜歡做的事情, 像是拍人像.

2013年11月22日 星期五

[note] ubuntu 10.04 imx5

這個筆記是給 ubuntu 10.04 i.mx5 用的, 我不確定其它的 10.04 能不能這樣做, 不保證. 10.04 的套件更新在 ubuntu 官網將許多舊的 distro 從 archive.ubuntu.com 改到 old-releases.ubuntu.com 後, apt 就不能直接的更新甚至取得套件. 這個在 ubuntu 官方網站上有較詳細的說明
https://help.ubuntu.com/community/EOLUpgrades/

所以, 我們所要做的就是更改 /etc/apt/source.list 這個檔裡的內容. 參考這篇 QA:
http://askubuntu.com/questions/91815/how-to-install-software-or-upgrade-from-old-unsupported-release

使用:

sudo sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

sudo sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list.d/prerequists-sources.list

不過這樣也僅止於 apt-get update 安靜下來了而已, 並不完全.

目前試出來的方法比較奇怪, 要繞點路...
1. 先用上面講的方法, 做一次 apt-get update.
2. 修改 /etc/hosts, 加入 "91.189.88.17    archive.ubuntu.com", 存檔.
3. 執行 "do-release-upgrade", 會得到 Hash Sum mismatch 而失敗.
4. 再執行一次上面寫的 script.
5. 這時把 /etc/hosts 裡那行 "archive.ubuntu.com" 前面加 "#" 給它 remark 掉.
6. 執行 apt-get dist-upgrade 此時可以看到 5xx 個套件可以升級.

這樣就可以改造成 10.04.04 LTS, 當然我的目地是在 rtsp server 跟一些 12 才有的套件, 並不是為了看到多了那 .04 會爽到上太空, 或是去相信這樣會比較安全的謠言, 我並沒有無聊到那種程度...

因為機器很慢 (i.MX53 1.2Ghz) 網路也很慢 (這個沒有 mirror, 只有米國一個站) 的關係, 能不能順利升到 12.04.03 LTS, 後面再跟大家報告....

btw, 如果不 care GUI, xwindow 這些東西的話, FreeScale 板本的 2.6.35.3 可以直接使用 console 版的 ubuntu 13.10 armhf 沒有問題, 至於 13.10 能不能順利使用 xserver-xorg-imx 那我就不知道了, 我沒有裝成功過...

後記 2013/11/25
前面講的改 /etc/hosts 的怪方法只是為了對付改不掉 archive.ubuntu.com 的問題而來, 實際上最該做的處置是這樣...
http://askubuntu.com/questions/297757/why-after-fresh-ubuntu-12-04-installation-update-arent-being-installed

直接寫重點:
-------------
sudo rm /var/lib/apt/lists/* -vf
sudo apt-get update
-------------

前面會有 Hash Sum mismatch 的根本原因就是在於舊的資料跟網站上抓的並不一致, 所以不把舊資料砍砍掉而且更新, 問題就永遠存在.
不過這樣一路更新套件到 12.04 後就開不了機了, 連基本 /etc/rc.local 都沒跑到.

不想玩它了...

2013年10月23日 星期三

Android 開機自動執行 AP

這篇只是純筆記, 環境使用 google 打包的 eclipse + android 工具包 + android NDK, 這個比較方便. 以下以新增一個 android application project 做界紹.

1. 新增一個 android application project (也就是 hello world 那個), 假設類別叫 Action. 主程式都不需要動. 通常長的如以下寫的. 而這裡面重要的只有關鍵字:
--------------
package boot.test;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class Action extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_action);          }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action, menu);
return true;                                                        }
}
--------------
2. src 下的 packet 裡新增一個 class (java class), 假設叫 MsgRcv. 這個 MsgRcv 是啟動 Action 用的. "public class MsgRcv" 後面請追加 "extends BroadcastReceiver" 讓它繼承自 android.content.BroadcastReceiver. 很重要. OnReceive 是加上去的, 名字最好一模一樣.
--------------
import boot.test.Action;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MsgRcv extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
Intent mBootIntent = new Intent(context, Action.class);
mBootIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mBootIntent);
}
}
--------------
OnReceive 其實可以接收其它雜七雜八的訊息, 只是 mainfest.xml 裡有特別指定接收 android.intent.action.BOOT_COMPLETED 這一個, 收到後再去啟動指定的 class.

3. Mainfest.xml (AndroidMainfest.xml) 裡 </application> 前加上這個:
--------------
receiver android:name="MsgRcv">
           <intent-filter >
               <action android:name="android.intent.action.BOOT_COMPLETED" />
           </intent-filter>
</receiver>
--------------
不是 ".MsgRcv", 前面沒有小數點.

2013/10/29 追加. AndroidMainfest.xml 在
--------------
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
--------------
android 2.2, 2.3 加不加這行無所謂, 但 4.0 沒有這行就一定不給你動..

2013年10月1日 星期二

google chrome

google chrome 四年前它很快, 四年後, 慢的跟龜一樣.
不過還是有人活在四年前 chrome 剛出時的年代婊 IE..

2013年9月30日 星期一

簡短感想

如果對一樣事物有什麼喜怒哀樂的話...

表示你真的不瞭解這個事物的全貌.

2013年9月29日 星期日

Helios 44-2

其實這顆鏡頭在我之前已經有太多人寫過它的心得, 我也只是寫好玩的而已, 也可以說是個人的一點筆記.


在拿到這顆鏡頭後我就來試拍它所謂的旋轉散景, 不過這顆鏡頭的旋轉散景其實有幾個出現條件, 目前整理出來的有..
  1. 不要使用鏡後距修正鏡片. 簡單的說, 裝上後就不會出現.
  2. 允許光圈範圍是 2.0~2.8, 2.8時已經不太明顯.
  3. 理想對焦距離 1.3m ~ 6m, 但要看比例. 後述.
  4. 物距跟背景物的距離差越大越好. 背景最好在無限遠端為佳.
  5. 物距太近造成散景太過強烈時也不會出現. 所以要抓好距離.

從第一點開始講. 鏡後距修正鏡片是因為鏡頭是 M42, 機身是 Nikon-F mount, 機身的法蘭距比較長, 會造成鏡頭 1.無限遠無法對焦 2.會變微距鏡, 所以需要矯正鏡片去拉到正確的鏡後投射點上. 不過這種鏡片也會有很多特別的地方, 以前這一篇有講, 邊緣畫質會下降, 一開始我就是故意要利用這一點才裝上矯正鏡片, 但是怎麼樣都拍不出旋轉散景... 也許是它光路修正的更正常了? 我不知道...  不過我覺的效果跟轉 FD 鏡時是完全不同的狀況.. 
於是在這之後的照片都是拿掉鏡後距校正鏡片拍的..

第二點, 光圈設定跟大眾所知的一樣, 開大光圈~ 開大光圈~ 開大光圈~ 開大光圈~ 開大光圈~ 開大光圈~ 開大光圈~ 開大光圈~ ..... -_-
這顆鏡頭它在光圈開 F2.0~F2.8 時會有這個效果, 再往下的光圈就幾乎不會再出現 (應該這樣說, 收光圈後這種光學暇疵就收斂到幾乎看不到). 所以! 在這樣的光圈下還要把前景拍到清析銳利的話, 我會建議刻意把鏡後距拉長, 就像 M42 直接接 Nikon-F 這樣來讓光路更收斂.

散焦影像的大小雖然會隨著光圈而變動, 但如果要唯持這個效果, 就等於光圈值不能動它, 能動的只剩下跟被攝物的物距...

第四點, 物距差一直都是拍散景很重要的因素, 像這兩張, 這一張物距離的較遠:

這張物距離的較近:

再近一點就可以變這樣:

其實從 lifeview 上就可以看出光點的變化. 近端拍攝會比較適用於片幅較小的機器.

第五點, 旋轉效果是跟著散焦成像的影像大小成正比的, 並不是靠的很近就一定會有這個效果出來...
這張的物距比上一張還要近, 所以即使是相距不到 10cm 的樹枝也會糊的不像話, 但此時想要的效果就會全部糊在一起, 做不出來.

拉遠一點就會發現不一樣了:

上面這張圖其實距離是特地抓的, 如第三點所述. 它有特定的物距內會比較容易生成這樣的效果. 而且這張可以看的出來, 背景 (或講無關的東西) 最好都離前景有段距離, 而且最好是統一的距離 (例如無限遠) 這樣最好, 不要有的前有的後, 這樣效果也不明顯.

其它的測試照片我先擺這裡.

還有值得一提的是, 這顆鏡頭也有支援測光, 而且比 canon FD 的好用 (FD 因為是機身連動, 所以變成轉接鏡時會不太好撥). 它前方其實有兩個轉環, 最前面轉起來有刻度感覺的那個才是光圈, 後面那個其實是測光連動圈:
但其實測光環做工做的不是很確實, 會讓前端整個前移... 所以不要用力轉...

這是光圈全開 (F/2.0). 此時測光環其實是不能動的.

這是光圈調整到 F/16, 測光為全開光圈. (相機看到是 F/2.0)

這是它光圈開 F/4.0, 測光為全開光圈. (相機看到是 F/2.0)

這是關測光, 可以看到第二個環停在 2 那裡. 這時相機看到的才是 F/4.0

不過這顆鏡最好的中央/邊緣收斂光圈值是 F/11, 中央最好時是 F/8.0. 不過我的機子看到的都不是真正 M42 機器上看到的效果, 會比較銳利, 收 F/4.0 時已經很夠我用了.

update 2014/01/27:
這個鏡頭後來拿來改, 臺灣區有找到兩篇文章, 另一篇要铣床的, 我沒辦法, 我只能參考這個比較動的了刀的文章:
http://www.bigeye.url.tw/big5/d_heli58_2_2.htm
來改. 特別是第六張圖那個環.
(沒辦法提供我自己改鏡結果的照片是因為... 我把螺絲幾乎都鎖壞掉了, 現在也很難再拆開來一一拍照記錄...) 我改了兩個地方, 僅供參考:
1. 去掉對無限遠的卡筍螺絲. 拿掉這個螺絲後, 還可以再往後退約 0.5mm
2. 我把這個環拿掉, 改用兩條鐵絲 (一般綁土司用的那種, 去掉塑膠皮後) 對絞後做成墊環墊在原本的位置. 這個部份的替代材料我找最久, 因為我沒辦法特別去車這麼一個環 (內徑 30.5mm 外徑 32mm), 還只能要 0.8mm 高....

ok, 然後就可以對無限遠了.....
不建議用這個改法是因為, 對焦環的無限遠刻度要改, 而且對無限遠時很容易打板 =_=

update 2014/03/20:
追加簡單改鏡筆記: http://yoko-hama.blogspot.tw/2014/03/helios-44-2.html

update 2014/03/27 星芒測試. 只要不是離的太近的都還不錯.




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 是相反的..

2013年4月6日 星期六

所謂景深

其實在這之前就有人寫過一篇專文專門講景深:
寫給新手:景深概論
這裡只是再貼幾張實拍圖佐證而已.

理論在那篇文裡已經提了很多, 總之淺景深決定在

  1. 距離. 特別是前景離的有多遠
  2. 焦段. 焦段越長其實效果越明顯.
  3. 焦距. 越貼近最近對焦距, 效果會越明顯.
  4. 光圈. 這個是很多論譚大大最愛提的
  5. 片幅. 老實講這是最不重要的.

這是用 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. 最後!! 希望大家都能只用手機, 就可以拍的出想要的淺景深.