Desire版核心移植HD2已全,大部分作者都換跑道改移植DHD rom,因為有原始的zImage所以移植很快,以下是GPC做的版本,功能差不多都OK只有點小頓。








傑克鼠 發表在 痞客邦 留言(2) 人氣()

開發ActiveX時候,原本程式執行好好的,註冊OCX/反註冊OCX都很正常,當照著MSDN步驟進行安全碼加註後,每次返註冊OCX都會出現DllUnregisterServer函數出錯,錯誤代碼:0x80070002 可能不敢相信,但以下是MSDN程式碼: STDAPI DllUnregisterServer(void)
{
   HRESULT hr; // HResult used by Safety Functions
   AFX_MANAGE_STATE(_afxModuleAddrThis);
   if (!AfxOleUnregisterTypeLib(_tlid))
      return ResultFromScode(SELFREG_E_TYPELIB);
   if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
      return ResultFromScode(SELFREG_E_CLASS);
   // Remove entries from the registry.
   hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
  if (FAILED(hr)) return hr;
   hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
   if (FAILED(hr)) return hr;
  return NOERROR;
}

傑克鼠 發表在 痞客邦 留言(0) 人氣()

先前介紹了一個簡單的字元範例,這個範例不需要任何硬體線路單純只使用printk函數輸出,一個標準的HELLO WORLD程式。那建立完範本該如何編譯? 如何掛載? 如何使用? 往後一一講解。 首先我的開發環境是使用ubuntu,核心版本是2.6.24,PC環境基本上用哪個版本的套件對以下步驟無多大影響,在這先以PC環境為主,往後在介紹ARM的cross compiler。而我們開發的是linux driver,因此編譯的時候linux核心src是不能缺少,所編譯的driver版本與核心版本必須是近似甚至相同的,反則會面臨雖然編譯程公卻無法掛載的命運,所幸PC環境上的套件都會有src,因此這部分無需擔心。 現在先將先開啟一新的資料夾,並將先前介紹的範本檔案建立存入該資料夾中。在開一個新檔案叫Makefile,對linux開發不熟的可能對此檔不清楚,這是make編譯程式的批次檔,方便開發使用,該檔案內容如下:TARGET=demo
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
obj-m:=$(TARGET).o
default:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko modules.* Modules.* *.mod.c

傑克鼠 發表在 痞客邦 留言(1) 人氣()




1. 引入標頭檔

在撰寫 driver 前必須先 include 一些標頭檔:


#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>

2. 撰寫控制元件的函式

struct file_operations 即為定義各個 function pointer 的 structure。


static ssize_t drv_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
{
printk("device read\n");
return count;
}
static ssize_t drv_write(struct file *filp, const char *buf, size_t count, loff_t *ppos)
{
printk("device write\n");
return count;
}
static int drv_open(struct inode *inode, struct file *filp)
{
printk("device open\n");
return 0;
}
int drv_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
printk("device ioctl\n");
return 0;
}
static int drv_release(struct inode *inode, struct file *filp)
{
printk("device close\n");
return 0;
}
struct file_operations drv_fops =
{
read: drv_read,
write: drv_write,
ioctl: drv_ioctl,
open: drv_open,
release: drv_release,
};

3. 撰寫初始化、結束元件的函式
#define MAJOR_NUM 60
#define MODULE_NAME "DEMO"
static int demo_init(void) {
if (register_chrdev(MAJOR_NUM, "demo", &drv_fops) < 0) {
printk("<1>%s: can't get major %d\n", MODULE_NAME, MAJOR_NUM);
return (-EBUSY);
}
printk("<1>%s: started\n", MODULE_NAME);
return 0;
}
static void demo_exit(void) {
unregister_chrdev(MAJOR_NUM, "demo");
printk("<1>%s: removed\n", MODULE_NAME);
}
module_init(demo_init);
module_exit(demo_exit);

其中 MAJOR_NUM 即為 driver 所對應的 device 的 major number




傑克鼠 發表在 痞客邦 留言(0) 人氣()

軀動程式本身是屬於「軟體硬介面」的程式設計技術,不管是學習WinCE或是Embedded Linux,最精彩的部份絕對是驅動程式莫屬。由於嵌入式系統整體來看,除了軟體開發外,也包含硬體的客制化,因此驅動程式在嵌入式系統技術領域中,佔了舉足輕重的地位。

學習驅動程式需要確實瞭解硬體的規格與微處理器架構,並且工程師還要能分得清楚哪些東西是介面(interfacing)也就是與硬體無關的程式(machine-independent);以及哪些是站在第一線做硬體控制的程式(machine-dependent)。各種軟體硬介面與滙流排也都要精通。

 

現在的嵌入式系統學習主軸

現今嵌入式系統的實作,幾乎都會加入嵌入式作業系統(embedded OS)的元素,有了作業系統,我們都可以為目標裝置「寫軟體」。總合來看,如果要學習所謂的嵌入式系統,從熱門的WinCE或Embedded Linux領域切入是相當不錯的選擇。

驅動程式是「寫軟體」與「做硬體」的 “connectivity”,因此現今資訊業界最熱門的嵌入式系統學習主軸為驅動程式的設計。

 

WinCE驅動程式

WinCE驅動程式的核心人物當然就是在WDM(Windows Driver Model)身上了。WDM是Windows 98/2000之後的驅動程式架構,WDM是一個嚴密的分層(layered)架構,架構層間以IRPs(I/O Request Packets)做通訊。

WDM驅動程式分為三種類型:bus driver、function driver與filter driver。Bus driver是device-independent的驅動程式,主要在驅動I/O bus,例如:PCI bus driver、USB bus driver;function driver是 “device” 的驅動程式,我們常講的「驅動程式設計」大部份都是講 function driver,function driver 主要在驅動各種裝置,因此大多是由裝置廠造商撰寫並提供給使用者安裝,function driver 的設計大多著墨在「讀/寫」外部裝置。Filter driver是非必要的驅動程式,主要在過瀘 I/O requests。

WDM驅動程式的設計是使用Windows DDK,學習資源豐富並且完整;相較於Linux驅動程式,WDM驅動程式的學習材料較系統化。

 

Linux驅動程式

Linux驅動程式採取嚴謹的分層式架構設計(layered architecture),利用分層的架構設計來徹底區分generic device driver(machine independent)與machine dependent driver。

Linux驅動程式採用分層架構的觀念設計,透過「註冊」與「回呼」的機制來清楚地區分每一層的關係。分層架構的實作必須在下層將自己註冊給上層,上層再回呼下層;上層的驅動程式必須提供註冊函數供下層呼叫,下層驅動程式所使用的註冊函數也將決定自己的上層架構。

與 user application 如何互動,是撰寫驅動程式時所要考慮的重要一環,因此在撰寫驅動程式時,要提供什麼「功能」給應用程式引用,就必須事先定義清楚。Linux的generic device driver層已經幫我們把這些功能定義清楚了。Linux驅動程式如何透過 I/O port 或 I/O memory來控制裝置,也就是與晶片組的溝通,方式是使用 Linux kernel 所提供的I/O函數來存取並控制實體硬體裝置。

Linux驅動程式的學習困難度較高,並且也沒有像是Windows DDK這樣的完整開發工具;但是若能掌握正確的學習步驟,要邁向高手之路並非遙不可及。

 

-- 作者/陳俊宏 (jollen)
原文刊載於 Run! PC 雜誌 8 月號
歡迎任意轉貼引用.但請務必註明出處

傑克鼠 發表在 痞客邦 留言(0) 人氣()

說道.Net Framework 3.5最強的新功能,莫過於LINQ了,它簡化了更多資料處理的指令,讓設計者有更多的時間關注在系統核心,其中,最不可思議的莫過於LINQ to SQL這部份,方便的感動如同小弟當年乍見的Typed DataSet,LINQ to SQL更直覺的解決資料庫的操作,底下有幾部影片範例,無須多言,看完就能知道他的強大。

http://www.asp.net/learn/linq-videos/
Part 1: Introduction to LINQ to SQL
Part 2: Defining our Data Model Classes
Part 3: Querying our Database
Part 4: Updating our Database
Part 5: Binding UI using the ASP:LinqDataSource Control
Part 6: Retrieving Data Using Stored Procedures
Part 7: Updating our Database using Stored Procedures
Part 8: Executing Custom SQL Expressions
Part 9 - Using a Custom LINQ Expression with the <asp:LinqDatasource> control

傑克鼠 發表在 痞客邦 留言(0) 人氣()

RTX51 Tiny是基於Timesharing的RTOS,與系統中斷不同,它以非搶佔式的任務切換。所以在一個任務被執行時不能對其進行中斷,除非該任務主動放棄CPU的資源,中斷才可以打斷當前的任務,中斷完成後把CPU的控制權再交還該被中斷的任務。任務切換有兩種情況,一種是當前任務主動讓出CPU資源;另一種情況是在當前任務的時間片已經用完的情況下,進行任務切換。CPU執行時間被分成若干個時間片,RTX51 TINY為每個任務分配一個時間片。時間片是通過對變量INT_CLOCK與TIMESHARING兩個參數的設置來確定的。系統內定INT_CLOCK為10000、TIMESHARING為5,如果晶振頻率為11.059 2 MHz,則最大的時間片為(1/11.0592Mhz)×10000×5=4.52ms。
RTX51 TINY的任務切換共有 TASKSWITCHING 和SWITCHINGNOW兩個入口,前者供定時器Timer0的中斷服務程序,後者供系統函數os_delete和os_wait使用。相應地也有兩個不同的出口,分別是恢復保護現場和清除狀態標誌位。系統首先將當前任務置為「TIMEOUT」狀態,等待下一次時間片循環,然後找到下一個處於「READY」狀態的任務,通過堆棧管理,將自由堆棧空間分配給該任務,使其成為當前任務。清除使該任務進入「READY」或「TIMEOUT」狀態的相關位後,執行該任務。

傑克鼠 發表在 痞客邦 留言(2) 人氣()

前篇簡單說明如何啟動WinCE上的FTPD功能,當然前提是必須在Platform Builder就已加入FTPD功能。但前所提的方式是以匿名方式存取WinCE FTPD,在獨立網域系統內這是最簡單便捷的方式,但若在開放網路環境下這方法就十分不保險,任何有心人士都能輕易找到這個匿名節點,所以至少要設專用的帳號密碼,以下說明如何讓WinCE FTPD具有登入特定帳號的功能。 Private Sub SetFTPD(byVal User as string, ByVal Password as string )      NTLMSetUserInfo(User , Password )      Dim strKeyName As String = "HKEY_LOCAL_MACHINE\Comm\FTPD"      Microsoft.Win32.Registry.SetValue(strKeyName, "AllowAnonymousUpload", 0)      Microsoft.Win32.Registry.SetValue(strKeyName, "AllowAnonymous", 0)

傑克鼠 發表在 痞客邦 留言(0) 人氣()

WinCE內建有簡單的FTPD服務,內定是關閉的,可透過修改註冊表將之開啟: [HKEY_LOCAL_MACHINE\Comm\FTPD]
    "IsEnabled"=dword:1
    "UseAuthentication"=dword:1
    "AllowAnonymous"=dword:1
    "AllowAnonymousUpload"=dword:1
    "DefaultDir"="\\temp"

傑克鼠 發表在 痞客邦 留言(0) 人氣()

想要用程式來變更WinCE的網路卡IP,微軟可能認為嵌入式系統的網卡IP在設備安裝後就不會更動,原因未知,但就是未提供方便API方便修改,因此想要更改IP就必須從修改Registry註冊表下手。
首先,要修改網卡IP就必須先知道網卡資訊在註冊表的位置與CreateFile時需要用的設備名稱。對於「設備名稱」,若系統只有單一網卡通常都會是"NDS0:",若是多張網卡就要找該網卡的Index了,沒錯,就是到BuiltIn區找驅動程式的設定,到下面位置取得下列兩參數:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\網卡名稱]
   "Prefix"="NDS" 
   "InstanceIndex"=dword:1 

傑克鼠 發表在 痞客邦 留言(4) 人氣()

【簡介】嵌入式系統應用很廣泛,無論家庭生活至工業生產都能有其應用範圍,對於家用而言,系統正常工作並非必要,不穩至停板只要一個Reset紐就可以解決,但對於工業應用而言,任何不正常的控制命令都可能導致重大損失。因此以「正常工作」是首要條件,「WatchDog Timer」這無時無刻監視著系統的小狗便是一個直接有效的工具,當系統遲緩或停擺時,可立刻發現並執行必要的工作。
【觀念】從軟體開發者的角度而言,「WatchDog Timer」就是一個倒數裝置,當時間倒數至0就會執行一內定工作,一般是給予Reboot,所以,程式必須在倒數結束內必須給予Strobe,告知狗狗程式還正常運行,狗狗將會恢復倒數時間重新倒數,如此週而復始的監視系統。
【實現】當然WatchDog這樣簡單的程式邏輯用一個高優先的執行緒便可搞定,但對於「監視」這樣重要的工作我是比較喜歡硬體中斷,在硬體上能選擇有此功能最好。在此以硬體WatchDog Timer為範例。
控制命令相當簡單,只需用CreateFile與DeviceIOControl配合IOCTL code即可,開啟方式:

傑克鼠 發表在 痞客邦 留言(3) 人氣()

一般錯誤的發生通常是在程式執行下,很容易在Debug-Mode或用Try Catch抓出,但這個Exception發生的時機與一般不同,並非出現在某行指令執行,因此光只是在事件or方法中用Try Catch包死死就可以抓出皮漏,至少在我發生的時機,完全無法取得錯誤資訊,害我被這個可惡的Bug攪和了一整天,好不容易才找到原因。
稍為描述我遇到這個Exception,由於是在WinCE環境下發生,當下沒有抓圖軟體可以用,完整的錯誤如下:
Fatal Application Error
Application TD_Control.exe has performed an illegal operation and
will be shut down.
If the problem persists, contact the program vendor.
Program: TDS_Control.exe
Exception: 0xC0000005
Address: 01B84871

傑克鼠 發表在 痞客邦 留言(2) 人氣()

1 2 3
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。