2011年6月29日 星期三

最後一天

會寫下這文章其實並不代表今天是什麼的最後一天, 也不是紀念什麼日子, 而我想講的是, 每天都是最後一天.

其實這是一年多前開始到現在都有的想法, 我每天都曾面對一種心情, 像父親每天為我準備的早餐, 但今天是最後一天為我準備早餐, 也是我最後一份父親為我準備的早餐, 我會怎樣去面對呢? 哽咽著, 放在一邊, 還是若無其事的吃掉? 沒了它之後, 哪一天哪一刻想再回到那個感覺時呢? 嗯, 沒錯, 現在就是我想要找的那一刻, 回頭看同樣的事物, 會有失而復得的感受.

這樣看起來會負面, 會灰色嗎? 嗯, 沒錯, 是非常的灰色, 我只是把事情擺在最壞的角度去想它而已, 當日常的某些事物消失了, 開始想念起它了, 總是會有那種 "當初為什麼沒有好好珍惜呢!?" 的想法, 把未來的時間點拉回到現在, 就如同把現在的時間點拉回過去一樣. 但是, 已經有的, 很多人會把它當理所當然, 不會去珍惜, 因為不曾去考慮過這些被認為理所當然存在的事物不見時的樣子.

當今天是你生命中的最後一天, 最後一刻, 也許第一個想到的是, 想要做什麼, 但實際上走到那一刻時, 想到的卻是什麼還沒做. 而我們曾擁有過完成它的時間跟機會嗎? 通常有, 而且很多很多, 多到不會去注意.

也就所以這樣, 我不會當拿別人的好處聽別人的好話是應該的, 享受自由跟衣食無虞的生活是天賦人權, 每一刻的美好, 都有機會成為最後一次, 不珍惜就沒有後悔的機會.

2011年6月23日 星期四

PDF-XChange Viewer

在這裡挖來的, 而且又免安裝, 又有中文化:
簡而言之, 現在換這個 PDF reader, 只是它預設不會把書籤 (bookmark) 功能打開, 要在 view -> bookmarks 裡另外打開它.

adobe 的東西嘛.... ignore it....

2011年6月9日 星期四

busybox 下的校時

[修正一下以前的問題..]
busybox 我不知道幾版開始有支援 ntpd (ntp server/client), 而這個 ntpd 的用法跟以前的 ntptime/ntpdate 有點差別...

ntpd 對 time server 校時 (假設 server 用 watch.stdtime.gov.tw):
#
mv /etc/localtime /etc/_localtime
ntpd -nqp watch.stdtime.gov.tw
hwclock -w
mv /etc/_localtime /etc/localtime
#

這樣就可以將 ntpd 抓回來的時間設定在 RTC 上.

但如果此時 /etc/localtime 沒有東西的話, ntpd 會抓回沒有 GTM 修正的時間, 系統時間 (date) 也不會有 GTM offset 修正. 這時還要再加上 /etc/localtime 的設定, 才會有 GTM 的 offset.
這裡是中華民國臺北 (嚴正強調絕不是中國台北), 時區是 GTM+8, 時區資料在 /usr/share/zoneinfo/Asia/Taipei, 可以直接 ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime 或乾脆直接把檔案 co 過去變 localtime 檔案, 這樣系統時間會參考 /etc/localtime 的資料, 修正為當地時區時間.

但 1.18.4 版的 busybox 似乎有個問題, /etc/localtime 存在時, ntpd 抓回來的時間也會自動做 GTM offset 修正, 如果此時剛上述一樣, 後面再做一個 hwclock -w 的動作時, h/w RTC 被存進去的時間就不再是沒有 GTM offset 的時間, 而是被加過的時間, 然後下次開機回來看時, 會發現系統時間被設定成 GTM offset 被加過兩次的時間....

所以 ntpd 在抓時間時, 要先把 /etc/localtime 先給 hidden 起來, 讓 ntpd 抓到的都是 GTM+0 的時間. 待 ntpd 設定好時間後, 再把 /etc/localtime 修正回來, 讓系統時間回到 GTM+offset 的時間上..

gpio driver 筆記整理

簡單的說, 是 CPU register 的 access driver, 像 freescale 那種 EIM bus access 應該不能這樣寫. 這是用很老式的 file_operations 寫法, 要用到 /dev/??? 的 character 檔案去做媒界, 所以僅參考用:

static int libGPIO_open(struct inode *inode, struct file *file)
{ return 0; }

static int libGPIO_release(struct inode *inode, struct file *file)
{ return 0; }

static ssize_t libGPIO_read(struct file *filp, char *buffer, size_t count, loff_t *f_pos)
{
// ...
}

static ssize_t libGPIO_write(struct file *filp, const char *buffer, size_t count, loff_t *f_pos)
{
unsigned long lADDR = 0x73f8400L;
unsigned long lDATA = *(unsigned long *)buffer;
void *pvPTR = 0;
struct resource *ptRES = 0;

//在有 OS 保護下, 要存取實際位址的東西前, 要做一些動作
//尋問這段記憶體有沒有其它程式佔用
ptRES = request_mem_region(lADDR, 8, "GPIOmem");
if(!ptRES)
{
printk("mem_rgn_req_fail\n");
return -1;
}

//把這段記憶體位址映射到一塊可存取的空間上, 使用 8byte 大小的空間.
pvPTR = ioremap(lADDR, 8);
if(!pvPTR)
{
printk("ioremap_fail\n");
return -1;
}

//對這段記憶體做存取動作
iowrite32(lDATA, pvPTR);
iounmap(pvPTR); //釋放映射位址.
release_mem_region(lADDR, 8); //解除使用鎖定.
}

static int libGPIO_ioctl(struct inode *inode, struct file *file, unsigned int ctl_code, unsigned long param)
{
// ...
}

static struct file_operations tMODULE =
{
.open = libGPIO_open,
.release = libGPIO_release,
.read = libGPIO_read,
.write = libGPIO_write,
.ioctl = libGPIO_ioctl,
};

static int __init ____init(void)
{
return register_chrdev(240, "gpio_acs", &tMODULE);
}

static void __exit ____exit(void)
{
unregister_chrdev(240, "gpio_acs");
}

module_init(____init);
module_exit(____exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("spam ");
MODULE_DESCRIPTION("GPIO read/write module");

其中 iowrite32 跟以前 writel 一樣, 但兩個參數剛好顛倒.
其它還有 ioread8/16/32 (做用和 readb/w/l一樣), iowrite8/16/32 (做用和 writeb/w/l一樣)可用.

然後 AP 這邊就要應用 open/close/read/write/ioctl 這些動作去觸發 driver 裡的對應動作:

int GPIOopen(void)
{
return open(_LIB_NOD_FILENAME_, O_RDWR);
}

int GPIOclose(unsigned int nHeader)
{
return close(nHeader);
}

int GPIOopt(unsigned int nHeader, unsigned long lADDR, unsigned long *plValue)
{
int ret = -1;

if(!plValue || !nHeader) return -1;

ret = ioctl(nHeader, 1, lADDR);
ret = read(nHeader, plValue, 4);
// ret = write(nHeader, &lValue, 4);
return ret;
}

這樣的動作. 只是 ioctl 第二個 parameter 要非 0, 否則無法觸發. read/write 原本的 count 定義是 ssize_t, 在 -m32 下最大就到 2G, 2G 以上的數字會被直接擋掉, 不會進到 module 裡面運作..

btw, 這是實驗用的東西才這樣寫, 真正商業的東西已經不能這樣搞了...

2011年6月4日 星期六

忠犬小八

會知道這個電影, 是因為台北愛樂電臺撥的電影原聲音樂, 電影用的鋼琴樂原本就很好聽, 不過聽了電影的界紹說明後, 我比聽它的音樂還要感動.

以下引自愛樂電臺內容
------------------------

瑞 典導演Lasse Hallström執導的《忠犬小八(Hachiko: A Dog's Story)》是一部平凡的人與狗的故 事,強調的是人生中一種不變的信念與堅持。首先,電影反映人生的期待,本片透過對手的手法,讓人們看見了愛的內涵:(01).怕狗的女主人,接納了狗兒, 因為她看見了老公的喜悅。 (02).老公過世10年,女主人舊地重遊,發現狗兒依舊在守候,人癡狗也癡。

其 次,秋田狗小八是有所為有所不為的狗兒,永遠不肯聽從主人帕克教授(由李察.吉爾/Richard Gere飾演)的指揮,演出「揀球」秀:只要主人把網 球(或棒球)往前一拋,狗兒就會欣然前奔,再把球兒銜回給主人。但是平常不肯做的事,最後卻做了,事出必有因,這個因就是狗兒的真心與癡情,觀眾很難不動 容的。這段戲因而也可以和張曉風把自己為202兵工廠的溼地抗爭的心情,自比為狗吠火車,做對比了。

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

這隻狗, 當初被寄到車站時, 郵件標籤不見了, 所以無從聯絡收件人, 只能留下來, 不過狗不是物品, 過了保管期限就丟掉, 是於有不忍的. 漸漸的, 原本保管狗的人慢慢帶起這隻狗, 帶牠出去散步, 帶牠出去玩, 替牠清理大小便. 養過狗的人都會有一種感覺, 那不是狗, 那是家裡的一份子.

而狗主人的太太看在眼中, 很敏感的看出他先生的改變, 一開始, 有人如果來領走這隻狗, 他們都會很理所當然的說 "交給你吧", 而幾個月過去後, 女主人覺的, 如果這隻狗的主人哪天出現了, 她會對他說 "狗已經找到主人了".

其實整個聽下來, 很有末代皇帝的感覺, 優雅的旋律裡卻總是讓人感覺的到那股哀傷, 彷彿大家都在害怕彼此離開的那一天到來. 不知道為什麼, 很深受感動, 被它的平凡所感動.