2014年3月25日 星期二

Linux使用Serial Port

  • dmesg |grep tty   // 確認serial使用狀況
  • setserial -g /dev/ttyS0
  • getty
  • minicom

2014年3月20日 星期四

Android Intel CedarTrail整合MTK MT7610U USB WiFi Dongle

1. 首先拿到WiFi driver,看一下driver的Makefile
  • 看來這driver並非Kernel driver,可以直接丟到driver下並透由menuconfig選擇。
  • 這driver是可以直接在Linux PC環境下編譯的。
P.S. 因為改成Kernel driver很麻煩,所以改了一下Android.mk的描述,儘量不改driver。

2. 將driver放到Kernel底下
  • 如果直接編譯driver,會出現沒有.config的設定。
  • 也非Kernel driver所用的makefile,無法跟著Kernel一起編譯。

3. 修改Kernel底下的Android.mk,增加WiFi driver路徑描述
    $(mk_kernel) oldnoconfig
    $(mk_kernel) $(KERNEL_TARGET) $(if $(MOD_ENABLED),modules)
    $(hide) $(ACP) -fp $(BUILT_KERNEL_TARGET) $@
    $(if $(FIRMWARE_ENABLED),$(mk_kernel) ... ... ...
    $(mk_kernel) -C XXXu
    cp $(CURDIR)/kernel/XXXu/MODULE/os/linux/XXXu_sta.ko     
    $(KBUILD_OUTPUT)/drivers/net/
    cp $(CURDIR)/kernel/XXXu/NETIF/os/linux/XXXu_sta_net.ko
    $(KBUILD_OUTPUT)/drivers/net/
    cp $(CURDIR)/kernel/XXXu/UTIL/os/linux/XXXu_sta_util.ko
    $(KBUILD_OUTPUT)/drivers/net/

  • 改完後,在Kernel編譯完後,會自動編譯WiFi driver。
  • 編譯完後會將WiFi driver拷貝到output driver路徑下。

4. 將所有的drivers拷貝到Platform目錄下

5. 在Platform/Platform.mk修改mk檔,將driver及wpa_supplicant.conf包進image
    PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/XXXu_sta.ko:system/XXXu_sta.ko \
    $(LOCAL_PATH)/XXXu_sta_util.ko:system/XXXu_sta_util.ko \
    $(LOCAL_PATH)/XXXu_sta_net.ko:system/XXXu_sta_net.ko \
    $(LOCAL_PATH)/XXXSTA.dat:system/XXXSTA.dat \
    $(LOCAL_PATH)/wpa_supplicant.conf:data/wpa_supplicant.conf \


6. wpa_supplicant.conf寫法如下
    update_config=1
    ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
    eapol_version=1
    ap_scan=1
    fast_reauth=1


7. 在BoardConfig.mk修改WiFi設定如下
    # This enables the wpa wireless driver
    #BOARD_WPA_SUPPLICANT_DRIVER := NL80211
    BOARD_WPA_SUPPLICANT_DRIVER := WEXT
    #BOARD_WPA_SUPPLICANT_PRIVATE_LIB ?= private_lib_driver_cmd
    WPA_SUPPLICANT_VERSION := VER_0_5_X

P.S. Driver是搭配WPA_SUPPLICANT VER_0_5_X版本

8. 在platform_defconfig設定相關所需要用到的config,如wext

9. 在init.rc載入driver module
    insmod system/XXXu_sta_util.ko
    insmod system/XXXu_sta.ko
    insmod system/XXXu_sta_net.ko


    mkdir /data/misc 01771 system misc
    # give system access to wpa_supplicant.conf for backup and restore
    mkdir /data/misc/wifi 0770 wifi wifi
    mkdir /data/misc/wifi/sockets 0770 wifi wifi
    mkdir /data/system 0771 system system
    mkdir /data/system/wpa_supplicant 0771 wifi wifi
    chmod 0771 /data/system/wpa_supplicant
    chown wifi wifi /data/misc/wifi/wpa_supplicant.conf   
    chmod 0660 /data/misc/wifi/wpa_supplicant.conf
    chown wifi wifi /data/wpa_supplicant.conf   
    chmod 0660 /data/wpa_supplicant.conf

10. 因為WiFi driver是走libhardware_legacy架構,wifi.c需要做對應修改
  • 修正相關檔案路徑
static const char SUPP_CONFIG_FILE[]    = "/data/wpa_supplicant.conf";
  • 因為已在init.rc載入driver,所以直接return 1
int is_wifi_driver_loaded() {
... ... ...
... ... ...
... ... ...
#ifdef WIFI_DRIVER_MODULE_PATH
... ... ...
... ... ...
... ... ...
#else
    return 1;
#endif

}
  • 已經定義了ctrl_interface=,所以code裡拿掉
int update_ctrl_interface(const char *config_file) {
... ... ...
... ... ...
... ... ...

    if (!strcmp(config_file, SUPP_CONFIG_FILE)) {
        property_get("wifi.interface", ifc, WIFI_TEST_INTERFACE);
    } else {
        strcpy(ifc, CONTROL_IFACE_PATH);
    }
#if 0
    if ((sptr = strstr(pbuf, "ctrl_interface="))) {
        char *iptr = sptr + strlen("ctrl_interface=");
        int ilen = 0;
        int mlen = strlen(ifc);
        int nwrite;
        if (strncmp(ifc, iptr, mlen) != 0) {
            LOGE("ctrl_interface != %s", ifc);
            while (((ilen + (iptr - pbuf)) < nread) && (iptr[ilen] != '\n'))
                ilen++;
            mlen = ((ilen >= mlen) ? ilen : mlen) + 1;
            memmove(iptr + mlen, iptr + ilen + 1, nread - (iptr + ilen + 1 - pbuf));
            memset(iptr, '\n', mlen);
            memcpy(iptr, ifc, strlen(ifc));
            destfd = open(config_file, O_RDWR, 0660);
            if (destfd < 0) {
                LOGE("Cannot update \"%s\": %s", config_file, strerror(errno));
                free(pbuf);
                return -1;
            }
            write(destfd, pbuf, nread + mlen - ilen -1);
            close(destfd);
        }
    }
#endif

    free(pbuf);
    return 0;
}

11. 利用dmesg、logcat、netcfg、wpa_supplicant及wpa_cli觀看並除錯

12. WiFi正常運作了

P.S. 如果在Android看不到WiFi選項,請做下面的步驟
  • 在裝置的/system/etc/permissions中會列出裝置支援的設備
  • 相關設備支援檔案放在本機的frameworks/base/data/etc
  • 要支援WiFi,
將本機frameworks/base/data/etc下的android.hardware.wifi.xml
放置到裝置/system/etc/permissions

2014年3月9日 星期日

Linux各版本使用心得

Ubuntu家族:
Ubuntu-
很方便的PC OS,純粹是習慣的問題,Unity介面真的是讓人找不到軟體,
搜尋軟體也會出現太多太雜的結果,切換視窗也沒那麼直覺,這真的是使用習慣問題

就像Windows一樣,Linux的使用介面也朝適合觸碰螢幕的方向演進

Xubuntu-
較Ubuntu輕量,介面類似Windows XP,有修改Menu的介面,很適合新手
就是預設的檔案總管搜尋上不像Ubuntu那麼直覺,且常常會有莫名其妙的報錯,不影響運作

lubuntu-
很輕量,在小筆電也跑的很順,但是介面與設定的功能太簡略,使用上就沒那麼方便
不過很適合資源少的小筆電

Kubuntu-
KDE介面,很華麗,而且有很多好用的軟體,尤其是照片管理軟體的功能超強,還可以直接在地圖上顯示拍攝照片的位置,但是KDE介面太過複雜,設定也太過繁複,讓人眼花撩亂,
個人還是喜歡簡單的介面,Kubuntu有很嚴重的問題,系統常常當機且鎖定後就回不來了
實在沒時間去找問題點

Linux Mint:
Cinnamon-
這介面很像Windows XP,很適合新手使用,而且整個設定上很便利,尤其是軟體中心比Ubuntu更便利好用,只是ibus中文輸入法在某些情況選字的視窗會超出螢幕無法選字,gcin沒有問題,但有些情況輸入中文並不在輸入的窗格上,而是在另一輸入視窗

Xfce-
就如Cinnamon一樣好用,比較輕量,一樣有中文輸入法的問題搜尋上比較沒那麼直覺
Menu沒有設定介面可自訂

Fedora:
堅持用自由軟體的OS,網站將理念呈現的很清楚,但是因為已經習慣Debian系列了,所以用起來比較不習慣,不過是一個很重要的發行版本

openSUSE:
用openSUSE就是要用KDE,不知道那來的念頭,第一眼看到很美,整個介面很美,功能也很強大,KDE的軟體功能也很強大,不過真的太複雜,個人一直用不習慣,不過真的很美,習慣用KDE介面的話很合適使用

Arch Linux:
可以製造自己的Linux,不過用久了會發現都手動真的太累了

Debian:
很簡潔,沒有太多多餘的東西,不過發行版只用自由軟體,安裝時有些驅動沒有需手動安裝,有些設定也需要手動設定,提供新的Gnome介面,也提供傳統的Gnome Classic介面,有用Ubuntu的經驗後,來用Debian也不錯啦

來看看Linux發行版的排名 DistroWatch.com,網站上第一名是Linux Mint
一個可以讓你參考,如何選擇發行版的網站Linux Distribution Chooser

2014年3月8日 星期六

UNetbootin顯示缺少syslinux

查看add/remove software已經安裝了syslinux
原來缺少extlinux,安裝就解決了

Debian沒辦法使用fdisk

因為Debian使用gnu-fdisk取代傳統的fdisk
在Add/Remove裡搜尋安裝gnu-fdisk
安裝完後就可以使用fdisk了

2014年3月5日 星期三

使用Virtual Machine Manager與KVM安裝Windows 7

因為電腦等級不夠,virtualbox安裝Windows 7實在是跑太慢了,主機與virtualbox都慢 ><
但因為office與ie的關係又一定要執行
Windows 7~~~
一切都是因為公司文件跟網路銀行與ATM都不能在Linux下用呀 ><
但Android開發又一定要Linux,又只配一台NB,又等級不高,搞死人呀!!!

換上KVM,雖然也是慢,
但是比virtualbox順多了
文字管理很麻煩,透過Virtual Machine Manager來管理方便多了
  1. 在軟體中心搜尋virt-manager安裝virt-manager (Virtual Machine Manager)
    • 啟動後會自動安裝KVM套件
  2. 確認電腦是否可支援KVM
    • 執行egrep -c '(vmx|svm)' /proc/cpuinfo
    • 假設結果是0,代表doesn't support hardware virtualization
    • 假設結果大於等於1,表示有支援,記得確認BIOS是否有將這功能打開
    • 執行kvm-ok,確認是否能完整支援
  3. 接下來的操作就跟virtualbox很像,記得將virt type設為KVM
  4. 成功跑啟Windows 7囉

使用Virtual Machine Manager安裝Windows時出現0x0000005d錯誤

這錯誤還找不出原因
但將Virt type從qemu換成kvm就沒問題了

安裝Windows出現0x80300001錯誤

這是一個很瞎的錯誤
因為要安裝額外的driver將Windows光碟退出,放進driver光碟,
繼續安裝Windows時出現的錯誤 ><

只要將Windows安裝光碟放回去即可~~~
=.= 無言,這是叫誰猜得到呀 ... ...

安裝Windows時出現0x80070570錯誤

0x80070570:檔案或目錄損毀且無法讀取

果然ISO檔有問題
拷貝後雖然檔案大小正確但似乎檔案有問題
重新拷一個就可以順利安裝了