歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

移植Linux的外圍設備驅動到QNX系統中

花了半年時間在QNX系統上,這是一個RTOS,這個系統是高安全級別的系統,在核物理站/天文空間站/電站/地鐵/交通運輸(飛機/汽車/地鐵)等工業系統領域占有70%以上的市場份額。

背景:本文將我個人在QNX上移植內核和開發驅動以及應用程序的部分經驗記錄在此,因公司商業機密,部分源碼不便公開。我會框架性的講解開發思路。為了簡化文章復雜性,我只討論相同板子的平台驅動轉移,我手中是at91sam9260-ek的板子。外部設備是公司硬件部單獨添加的。

目的:利用已有的Linux驅動,簡化QNX的驅動編寫。

大致思路:Linux的驅動是基於模塊的,每個驅動作為內核的擴展放進內存中,QNX的驅動就是一個進程,需要將模塊改為一個應用程序。調整內核與驅動的通信機制。

以RTC驅動為例子:

Linux的驅動開發框架為:

1.填充read/write/ioctl/probe等驅動回調函數,設置對應的接口。

static struct file_operations rtc8025_fops = {
    .owner  = THIS_MODULE,
    .open    = rtc_open,
    .release = rtc_release,
    .read    = rtc_read,
    .write  = rtc_write,
    .ioctl  = rtc_ioctl,
 };
 2.編寫每個部分的硬件相關代碼。以write為例:
 
static ssize_t rtc_write(struct file *filp, __user const char  *buf,
                          size_t len,loff_t *ppos){
    char buff[16];
    VR_TIME *tm;
 
    tm = kmalloc(sizeof(VR_TIME),GFP_KERNEL);
    if ( NULL == tm ){
        printk("Memory error!\n");
        return -1;
    }
   
    if ( copy_from_user(buff, buf, len) )
        return -EFAULT;
    buff[len] = '\0';
   
    set_time_value(tm, buff);
    set_sys_time(tm);
    kfree(tm);
 
    return len;
 }

Copyright © Linux教程網 All Rights Reserved