星期一, 8月 25, 2008

很奇怪的一個禮拜

這禮拜的實在很~!@#$%^&*()_+

莫名奇妙的就在公司渡過兩個夜晚.

假日也莫名奇妙的出現在公司.

還被嫌做不好...真無言.

雖然也和上級反應過, 但, 為了種種的理由...我想我也只能對主管發發牢騷...然後還是承受下來吧.

但, 在開會的過程中, 情緒和情緒化的字眼發洩過後, 自己坐下冷靜反省, 自己也確實有做錯的地方.

可是, 最近的工作模式好像在幾個月前也曾出現過, 當時的狀況實在很糟糕. 現在又有同樣的感覺.

不過, 還是把自己的心情收拾整理一下, 把自己的事做好.

其他的事就交給該負起責任的人吧.

星期二, 8月 19, 2008

最近在工作上遇到了...

最近在工作上接觸到了許多新東西,像是MAC controller & PHY chip, NC-SI, SPI Flash.

Media Independent Interface(MII)是一種標準的介面用來將MAC controller和PHY chip連接在一起. [1]和[2]介紹了幾個MII的變種. 即然是標準的介面, 當然就有一些規範, 但最近遇到的PHY chips好像並沒有完全遵守規範在做. 使得driver在透過MII取得PHY chip status時, 必需針對使用的PHY chip做些調整, 真麻煩.

NC-SI[3]則沒有摸哪麼多, 只是知道在搞什麼鬼而已. 從功能面來講, 它可以用來設定MAC controller將特定MAC address的frame forward到特定的目的地, 當然也要MAC controller支援這種功能才行. 而這功能稱之為Sideband.

至於SPI Flash則是老掉牙了, 一句話帶過, 就是透過SPI存取Flash.

這些東西雖然簡單, 但是, 要讓driver能徹底發揮硬體特性的同時source code又俱有延展性和可讀性, 可真是需要一番功夫啊.

[1] Media Independent Interface
[2] MII (Media Independent Interface 介质无关接口)
[3] Network Controller Sideband Interface (NC-SI) Specification

星期日, 8月 17, 2008

Free Accounting Software | GnuCash

GnuCash是一個記帳軟體,用來記記帳,分析自己平常都把錢花在什麼地方我想是很足夠的.

不過,事實上,也是因為我的需要也就是記記帳,所以對GnuCash的認識也僅止於此.

GnuCash, http://www.gnucash.org/

星期五, 8月 01, 2008

java.awt.Toolkit.getLockingKeyState on Linux

最近終於突破一個SUN JVM在Linux下的限制. 雖然只是一件小事. 就是在Linux X Window的環境下取得鍵盤Caps Lock, Num Lock, Scroll Lock目前的狀態. 看起來很簡單的小事, 可是卻花了我很久的時間才知道要怎麼做.

首先講在MS Windows下的做法, 很簡單, 利用java.awt.Toolkit就可以簡單的做到.

public class KeyLockDemo {
  public static void main(String[] args) {
    java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit();
    System.out.println("Caps Lock is " + (tk.getLockingKeyState(java.awt.event.KeyEvent.VK_CAPS_LOCK) ? "on" : "off"));
    System.out.println("Num Lock is " + (tk.getLockingKeyState(java.awt.event.KeyEvent.VK_NUM_LOCK) ? "on" : "off"));
    System.out.println("Scroll Lock is " + (tk.getLockingKeyState(java.awt.event.KeyEvent.VK_SCROLL_LOCK) ? "on" : "off"));
  }
}

非常簡單...

但同樣的code在Linux下卻不行用, 因為SUN JVM在Linux下的java.awt.Toolkit沒有實作getLockingKeyState這個method, 因此會丟出UnsupportedOperationException.

哪怎麼辦呢? 其中一條路是利用JNI (我也只知道這條路).

首先引用我在網路上找到的資料, 在[1]中提到三個方法可以"控制小鍵盤及鍵盤燈狀態".

第一個方法是利用ioctl的方式存取stdin以獲得狀態, 最理想的方法, 但僅能在console的模式下使用, 即進入X Window後就不能用了.

第二個方法我個人沒試過, 但它是利用X11的函式庫實作.

第三個方法則是利用ioperm的方式直接操作鍵盤燈, 但仍無法取得locks目前的狀態. 附帶一提, 這個方法其實是下Keyboard Command達成控制LED的, 可以參考[2].

咦? 這樣不就又沒解了嗎? 是的, 所以, 我現在要講的是怎麼修改第一個方法使得在X Window下也能取得locks的狀態.

首先, 第一種方法是利用stdin這個file descriptor[3]來實作. 但在X Window下, stdin似乎被別的input device取代了, 所以對stdin做ioctl也無法取得狀態. 所以, 我們要自己open在console mode下的stdin (i.e., /dev/tty0 or /dev/tty1). Source code如下:

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/kd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>

#define NUMLOCK 0x02
#define CAPS 0X04
#define SCROLL 0X01

int main(int argc,char **argv) {
  int fd = 0;
  unsigned char leds = 0;

  fd = open("/dev/tty1", O_RDONLY);
  ioctl(fd, KDGETLED, &leds);

  printf("Caps Lock is %s\n", (leds & CAPS ? "on" : "off"));
  printf("Num Lock is %s\n", (leds & NUMLOCK ? "on" : "off"));
  printf("Scroll Lock is %s\n", (leds & SCROLL ? "on" : "off"));
}



方法有了, 剩下就是自己在Java裡面寫個JNI method呼叫C的function把狀態取回來吧!!!

[1] 控制小鍵盤及鍵盤燈狀態, http://blog.csdn.net/cceczjxy/archive/2008/06/25/2584796.aspx

[2] Keyboard scancodes, http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html

[3] File descriptor, http://en.wikipedia.org/wiki/File_descriptor