2012年5月26日 星期六

[14 Apr 2012][USER/DEV] USB Host Support & Development [CM7/CM9]

http://forum.xda-developers.com/showthread.php?t=1459892



USB Devices Support Extended Info

There are Countless possible uses , Currently only 6 known to work
please share your experience here
Nook Color USB HOST Device Compatibility List

Standard Support
  • External Storage - Disk-On-Key / Card-Reader / HDD

    CM7 - FAT32 ( should Auto-Mount , CM7 users please confirm )
    CM9 - FAT32 / NTFS ( Mount using StickMount / Drive Mount )

    *NTFS support is not native , so keep reading this post if you plan to use it
  • Keyboards & Mice
    Most should be supported - Re-Mapping how-to on post 3
  • Game Controllers
    CM7 - Try Gamepad IME , no reports on successful attempts
    Testimonials : Link 1 | Link 2 | Link 3 | Link 4 | Link 5 | Link 6

    CM9

    USB/BT Joystick Center
    USB Joystick Center has Driver-Settings included for these Devices (ready to use, others you can create at your own):
    Wireless:
    - PS3 Controller without root (* CSR Bluetooth 2.x/EDR+ USB Stick is needed)
    - X360 Controller ("Microsoft Wireless Gaming Receiver for PC" USB is needed)
    - Bluetooth Keyboards
    - iCade
    - iControlPad (SPP Mode)
    - PhoneJoy
    - Wii Remotes 1-4 + Nunchuck + Classic
    - Zeemote
    * Please read the Sixaxis pairing instructions on the help site of the app!

    USB:
    - X360 Controller - Wired
    - PS3 Sixaxis - Wired
    - Hyperkin N64 Moonlight Controller
    - Logitech (Rumble, F310, F710)
    - Microsoft Sidewinder 2 Precision
    - Trust GXT 24
    - X360 Rockband: USB Guitars + Drums
    - N64 "Controller Adapter for PC USB" (for 2 Controllers)
    - PSX 1/2 "USB Gamepad Converter Dualschock" with 2 Player support
    - PSX + N64 USB Dual Converter
    - SNES "Controller Adapter for PC USB"
    - C64/Atari/Amiga "Donalds USB-Joystickadapter" for 2 Players
    - C64/128/A600 "Keyrah" USB Keyboard + 2 Joysticks Adapter
    - Stelladapter 2600 to USB
    - "PC/Gamepad/Joystick Adapter" (15 Pin D-Sub)
    - PSX - USB 4 "Buzz Junior" Wired Controllers
    - PSX 1/2 (EAXUS) "Super Dual Box Advanced" Adapter for PC USB

    If you have an adapter that is not natively supported and you have trouble to use it, enter the support forum.
  • Custom HID Input Controllers
    You can try to make a custom "driver" in USB/BT Joystick Center ( see Game Controllers ^ )
    Or , Go to post 3 which describes the manual way using the key layout file if your input controller contain mainly buttons
  • DSLR & VDSLR Cameras
    Many apps on Google Play , Here is what I could find

    DSLR Controller (BETA) - Known to work

    Remote Your Cam USB Lite
    ML Controller
    DslrDashboard 0.25.3 beta
  • Audio Output
    If your device doesn't require special drivers , and recognized as a USB Audio on your PC - It should work
    Testimonials : Logitech DAC A-5572A | Beresford TC-7520SE Caiman | FiiO E7
Ready For User Testing

[VB .NET] Microsoft.Office.Interop.Excel 讀 / 寫 Excel 語法概全

http://www.dotblogs.com.tw/yc421206/archive/2009/01/11/6741.aspx


在上一篇介紹用C#讀Excel,這次就VB.NET來展現對Excel的讀寫,對我來說用VB.NET操作Excel比較簡單,不像C#.Net有那麼多限制,Excel VBA果然跟VB.NET是兄弟,讓我不費吹灰之力就能溝通、控制,接下來就來寫實作方法:
第一步:加入EXCEL.EXE當參考,基本上跟上一篇一模一樣,請參考[C# .Net] Microsoft.Office.Interop.Excel 讀 / 寫 Excel 語法概全
第二步:引用Microsoft.Office.Interop.Excel命名空間
Imports Microsoft.Office.Interop.Excel

第三步:引用Excel類別


 '用於存放Microsoft Excel 引用的變數。 
Public xlApp As Application
Public xlBook As Workbook
Public xlSheet As Worksheet
Public xlRange As Range



第四步:為專案引用Excel,開啟 / 不開啟 一個新的Excel
   On Error Resume Next
       '#一部電腦僅執行一個Excel Application, 就算中突開啟Excel也不會影響程式執行
        '#在工作管理員中只會看見一個EXCEL.exe在執行,不會浪費電腦資源
        '#引用正在執行的Excel Application
        xlApp = GetObject(, "Excel.Application")
        '#若發生錯誤表示電腦沒有Excel正在執行,需重新建立一個新的應用程式
        If Err.Number() <> 0 Then
            Err.Clear()
            '#執行一個新的Excel Application
            xlApp = CreateObject("Excel.Application")
            If Err.Number() <> 0 Then
                MsgBox("電腦沒有安裝Excel")
                End
            End If
        End If



第五步:快樂使用Excel
      '打開已經存在的EXCEL工件簿文件
        xlBook = xlApp.Workbooks.Open(Directory.GetCurrentDirectory() & "\" & "Sample.xlt")
        '停用警告訊息
        xlApp.DisplayAlerts = False
        '設置EXCEL對象可見
        xlApp.Visible = True
        '設定活頁簿為焦點
        xlBook.Activate()
        '顯示第一個子視窗
        xlBook.Parent.Windows(1).Visible = True
        '引用第一個工作表
        xlSheet = xlBook.Worksheets(1)
        '設定工作表為焦點
        xlSheet.Activate()
 
        '===================================================
        '#用Array寫資料至EXCEL
        Dim myRows As Long, myCols As Long
        myRows = UBound(DataArray, 1) + 1
        myCols = UBound(DataArray, 2)
        '選擇儲存格範圍
        xlSheet.Range(xlApp.Cells(2, 1), xlApp.Cells(myCols, myRows)).Select()
        '陣列一次寫入Excel
        xlSheet.Range(xlApp.Cells(2, 1), xlApp.Cells(myCols, myRows)).Value = xlApp.Transpose(DataArray)
        '呼叫Excel的巨集
        xlApp.Run("Sample.xlt" & "!Caculater")
        '另存新檔
        xlBook.SaveAs(Directory.GetCurrentDirectory() & "\" & "TETS.XLS")
        '關閉當前活頁簿EXCEL
        xlBook.Close()
        'xlApp.Quit()
        '回收excel
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
        xlApp = Nothing
        xlBook = Nothing
        xlSheet = Nothing
        xlRange = Nothing
        GC.Collect()



範例下載:VB.NET讀Excel.rar

Android 4.0 on virtualbox - networking issues

http://nil.uniza.sk/linux-howto/android-40-virtualbox-networking-issues


Android 4.0 x86 port installed on virtualbox have problem to provide networking services over Internet as it requires wifi adapter. We should solve this issue with following settings:

and type
ip a 
to display networking adapters. You should be able to see adapter named eth0, as it is displayed on the following picture

Now, we will assign networking parameters (address, mask, dns server, default gateway). To do that we have two ways available, using the dhcp service, but there have to be a DHCP server available on your LAN. Or to assign IP address manually.
Manual assignments
Manually type the IP address and the mask from a address pool, which we are using in a LAN environment, where host with virtualbox is connected, in my case:
su
ifconfig eth0 192.168.10.250 netmask 255.255.255.0 up
then add a default gateway, which is needed for routing packets that are not local and have to be routed out of the LAN
route add default gw 192.168.10.1 dev eth0
and finally we have to check connectivity, for examle by using ping command with target IP address.
Dynamical assignments
We have to type
dhcpcd eth0
and that is all!
Assgin DNS server address
Finally, in both cases we have to add the IP address of a DNS server, in my case 
setprop net.dns1 158.193.152.2
and check ping connectivity, but now using DNS name of a target host (www.google.com for example).
Final notes
Unfortunatelly, all these settings are lost after reboot and we have to set up them again!

如何解包/編輯/打包boot.img文件

http://www.cnblogs.com/shenhaocn/archive/2010/05/25/1743704.html


感謝本文的作者:Alansj, DarkriftX, RyeBrye, Will, Try OP9, Tonyb486, Timmmm, Lxrose還有好多不知名的作者們在wiki上的不懈努力。
來源:http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images 

目錄
1、背景知識
2、boot和recovery映像的文件結構
3、對映像文件進行解包、編輯、打包的常規方法
3.1、另一種解包、編輯、打包的方法
4、將新的映像刷回到手機
5、解包、編輯、打包為我們帶來了什麼
6、本文講的內容與使用update.zip刷機包不是一碼事正文1、背景知識Android手機的文件系統有許多存儲器組成,以下是在adb shell下面的輸出:





複製代碼
#cat  / proc / mtd
dev: size erasesize name
mtd0:  
00040000  00020000  " misc " 
mtd1:  
00500000  00020000  " recovery " 
mtd2:  
00280000  00020000  " boot " 
mtd3:  
04380000  00020000  " system " 
mtd4:  
04380000  00020000  " cache " 
mtd5: 04ac0000  
00020000  " userdata "
複製代碼

注意,不同的手機在上述存儲設備的順序可能會各不相同!一定要檢查您的手機,確定在以下的操作中選擇正確的設備號(mtdX,這個X的序號一定要檢查清楚)。在本嚮導中,我們主要描述對"recovery"和"boot"的存儲設備進行操作;"system"存儲設備保存了android系統目錄的所有數據(在系統啟動後會掛載到“system/”目錄) ;“userdata”存儲設備將保存了android數據目錄中的所有數據(在系統啟動後會掛載到“data/”目錄,裡面是會有很多應用數據以及用戶的preference之類的配置數據)。從上面的輸出可以看出來,recovery和boot分區對應著/dev/mtd/mtd1和/dev/mtd/mtd2,在你您開始做任何修改之前一定要做兩件事情,第一件事情,一定要先對這兩個分區進行備份。可以使用如下命令進行備份:





# cat  / dev / mtd / mtd1  >  / sdcard / recovery.img
# cat  
/ dev / mtd / mtd2  >  / sdcard / boot.img

(注意added by lxros,只有手機獲取了ROOT權限以後才能夠執行上述的備份命令)第二件事情,你您應該把你您最喜歡的update.zip刷機包放置到你您的sd卡的根目錄上面。如此一來,即使你您在後續的操作中出了問題,也可以啟動到recovery模式進行恢復。另外一個你您需要知道的重要文件是在android系統目錄下的/system/recovery.img,此文件是mtd1存儲設備的完全拷貝。這個文件在每次關機的時候,會自動地被寫回到mtd1存儲設備裡面。這會意味著兩個事情:(1)任何對/dev/mtd/mtd1中數據的直接修改都會在下一次重啟手機以後消失。(2)如果希望對/dev/mtd/mtd1進行修改,最簡單的做法是用你您自己的recovery.img替換掉/system/recovery.img。當你您創建自己的update.zip刷機包的時候(特別是在做刷機包的適配的時候),如果你您忘記替換這個/system/recovery.img,這個recovery.img就會在關機的時候被燒寫到mtd1裡面去或許會變磚。一定要注意這一點!(譯者的話,關於這個/system/recovery.img文件,在2.1的android的平台裡面並沒有找到,或許這個機制已經out了?!或者偶本人對這段話的理解不夠深入?!希望明白的朋友不吝斧正)2、boot和recovery映像的文件結構boot和recovery映像並不是一個完整的文件系統,它們是一種android自定義的文件格式,該格式包括了2K的文件頭,後面緊跟著是用gzip壓縮過的內核,再後面是一個ramdisk內存盤,然後緊跟著第二階段的載入 ​​器程序(這個載入器程序是可選的,在某些映像中或許沒有這部分)。此類文件的定義可以從源代碼android-src/system/core/mkbootimg找到一個叫做bootimg.h的文件。(譯者的話,原文是一個叫做mkbootimg.h的文件,但從Android 2.1的代碼來看,該文件名 ​​應該是改為bootimg.h了)。
















複製代碼

/* 
** +-----------------+
** | boot header | 1 page
** +---------------- -+
** | kernel | n pages 
** +-----------------+
** | ramdisk | m pages 
** +---------- -------+
** | second stage | o pages
** +-----------------+
**
** n = (kernel_size + page_size - 1) / page_size
** m = (ramdisk_size + page_size - 1) / page_size
** o = (second_size + page_size - 1) / page_size
**
** 0. all entities are page_size aligned in flash
** 1. kernel and ramdisk are required (size != 0)
** 2. second is optional (second_size == 0 -> no second)
** 3. load each element (kernel, ramdisk, second) at
** the specified physical address (kernel_addr, etc)
* * 4. prepare tags at tag_addr. kernel_args[] is
** appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
** else: jump to kernel_addr 
*/
複製代碼


ramdisk映像是一個最基礎的小型文件系統,它包括了初始化系統所需要的全部核心文件,例如:初始化init進程以及init.rc(可以用於設置很多系統的參數)等文件。如果你您希望了解更多關於此文件的信息可以參考以下網址:http://git.source.android.com/?p=kernel/common.git;a=blob;f=Documentation/filesystems/ramfs- rootfs-initramfs.txt以下是一個典型的ramdisk中包含的文件列表:


複製代碼
. / init.trout.rc
. 
/ default .prop
. 
/ proc
. 
/ dev
. 
/ init.rc
. 
/ init
. 
/ sys
. 
/ init.goldfish.rc
. 
/ sbin
. 
/ sbin / adbd
. 
/ system
. 
/ data
複製代碼


recovery映像包含了一些額外的文件,例如一個叫做recovery的二進製程序,以及一些對該程序支持性的資源圖片文件(當你您按下home+power組合鍵的時候就會運行這個recovery程序)。
典型的文件列表如下:
複製代碼

. / res
. 
/ res / images
. 
/ res / images / progress_bar_empty_left_round.bmp
. 
/ res / images / icon_firmware_install.bmp
. 
/ res / images / indeterminate3.bmp
. 
/ res / images / progress_bar_fill.bmp
. 
/ res / images / progress_bar_left_round.bmp
. 
/ res / images / icon_error.bmp
. 
/ res / images / indeterminate1.bmp
. 
/ res / images / progress_bar_empty_right_round.bmp
. 
/ res / images / icon_firmware_error.bmp
. 
/ res / images / progress_bar_right_round.bmp
. 
/ res / images / indeterminate4.bmp
. 
/ res / images / indeterminate5.bmp
. 
/ res / images / indeterminate6.bmp
. 
/ res / images / progress_bar_empty.bmp
. 
/ res / images / indeterminate2.bmp
. 
/ res / images / icon_unpacking .bmp
. 
/ res / images / icon_installing.bmp
. 
/ sbin / recovery
複製代碼


3、對映像文件進行解包、編輯、打包的常規方法
(注意,下面我給你您介紹的是手工命令行方式進行解包以及重新打包的方法,但是我仍然創建了兩個perl腳本,這兩個腳本可以讓你您的解包和打包工作變得輕鬆許多。
可以參考本文的附件

如果你您很擅長使用16進制編輯器的話,你您可以打開boot.img或者recovery.img,然後跳過開始的2K的頭數據,然後尋找一大堆0的數據,在這一堆0的數據後面,緊跟著1F 8B這兩個數字(1F 8B是gzip格式的文件的結束標記)。從此文件開始的地方(跳過2K的頭),一大堆0後面緊跟著到1F 8B這兩個數字為止的全部數據,就是gzip壓縮過的linux內核。從1F 8B後面緊跟著的數據一直到文件的結尾包含的全部數據,就是ramdisk內存盤的數據。你您可以把把內核和ramdisk兩個文件分別保存下來,在進行分別的修改和處理。我們可以通過un-cpio和un-gzip操作來讀取ramdisk文件中的數據,可以使用如下的命令來實現這個目的,以下操作會生成一個目錄,直接cd進去就可以看到ramdisk中的數據了:

gunzip  - c .. / your - ramdisk - file  |  cpio  - i


此命令可以將ramdisk中的所有的文件解包到當前的工作目錄下面,然後就可以對它進行編輯了。當需要重新打包ramdisk的時候,就需要re-cpio然後re-gzip這些數據和目錄,可以通過如下命令來實現:(cpio會把所有當前目錄下面的文件都打包進去,因此,在進行此步驟之前,請把不需要的文件都清除掉。)



find .  |  cpio  - o  - H newc  |  gzip  >  .. / newramdisk.cpio.gz


最後一步就是通過mkbootimg這個工具,把kernel和ramdisk打包在一起,生成一個boot.img:

mkbootimg  -- cmdline  ' no_console_suspend=1 console=null '  -- kernel your - kernel - file  -- ramdisk newramdisk.cpio.gz  - o mynewimage.img


這裡的mkbootimg工具會在編譯android的源代碼的時候會在~/android-src/out/host/linux-x86/bin目錄下面自動生成。
下載地址:
http://git.source.android.com/?p=platform/system/core.git;a=tree;f=mkbootimg 現在,如果不想背這些複雜的命令或者擺弄那個讓人眩暈的16進制編輯器的話,可以嘗試使用我編寫的用於解包和打包的perl腳本了。希望這些腳本能夠節約各位的鍵盤。3.1、另一種解包、編輯、打包的方法下載split_bootimg.zip文件,在此zip文件中包含一個perl文件,split_bootimg.pl腳本,該腳本可以讀取boot.img頭(根據Android源碼中的bootimg .h讀取)將kernel和ramdisk讀取出來,此腳本也會輸出內核命令行和板子名字。http://android-dls.com/files/linux/split_bootimg.zip (注意,不要使用從/dev/mtd/mtd2直接拷貝出來的boot.img,此映像可能在讀取過程遭到損壞。)下面是一個從TC4-RC28更新中提取出來的boot.img進行解包操作:








複製代碼

%  . / split_bootimg.pl boot.img  Page size:  2048  ( 0x00000800 ) Kernel size:  1388548  ( 0x00153004 ) Ramdisk size:  141518  ( 0x000228ce ) Second size:  0  ( 0x00000000 ) Board name:  Command line: no_console_suspend = 1 
Writing boot.img - kernel ... complete. Writing boot.img - ramdisk.gz ... complete.
複製代碼


解包ramdisk的命令如下:
%  mkdir ramdisk %  cd ramdisk %  gzip  - dc .. / boot.img - ramdisk.gz  |  cpio  - i %  cd ..


解碼完畢後,就可以修改了(例如,在default.prop設置ro.secure=0等等)使用mkbootfs工具(mkbootfs工具是編譯完畢Android源代碼以後,就會在~/android-src/out/host /linux-x86/bin自 ​​動生成)來重新創建ramdisk,可以使用如下命令來操作:


%  mkbootfs . / ramdisk  |  gzip  >  ramdisk - new .gz


使用mkbootimg來重新創建boot.img,mkbootimg也可以在~/android-src/out/host/linux-x86/bin目錄中可以找到:
%  mkbootimg  -- cmdline  ' no_console_suspend=1 console=null '  -- kernel boot.img - kernel  -- ramdisk ramdisk - new .gz  - o boot - new .img

(注意:console=null的命令行選現是從TC4-RC30的boot.img引入的,用以去掉root shell)4、將新的映像刷回到手機可以將recovery.img拷貝到/system目錄下面,然後重新啟動手機,讓手機自動為你您刷寫到mtd裡面(工作原理在上面已經提過了)。對於boot.img可以通過將其拷貝到sd卡的根目錄,然後通過手機內的刷寫工具將此映像寫入到手機中。例如,使用adb工具(Android SDK中的一個工具)將boot.img拷貝到手機的sd卡的根目錄:





adb push . / mynewimage.img  / sdcard

然後通過adb shell登錄手機(獲取過ROOT的)的shell交互模式,利用命令行進行交互:
# cat  / dev / zero  >  / dev / mtd / mtd2    write: No space left on device [ this  is  ok, you can ignore] # flash_image boot  / sdcard / mynewimage.img

然後重啟手機。如果手機能夠正常啟動,那麼祝賀你您,你您的修改和替換已經成功了;如果不能夠順利啟動,則需要重新啟動進入recovery模式,並且使用update.zip來恢復。5、解包、編輯、打包為我們帶來了什麼可以修改手機開機啟動時候的畫面,具體的操作的地址為:http://forum.xda-developers.com/showthread.php?t=443431 6 、本文講的內容與使用update.zip刷機包不是一碼事








您可以很容易地在其他論壇上看到關於如何自製update.zip刷機包的方法,也可以下載到很多在網絡上共享的自製刷機包。例如:近期的多數刷機包都來自對rc30包的修改和調整。在update.zip刷機包裡面會包括新的boot.img,recovery.img以及整個system/目錄下的若干文件的替換和更新。如果您希望自己自製boot.img以及recovery.img,建議您選取相對較新的更新和版本。(選用較老的映像的話,或許會出現兼容性問題)。