天天看點

Linux下序列槽、網卡驅動

一、序列槽

1、一台有輸入、顯示部件,然後能夠連接配接的計算機的裝置叫做終端。Linux中用tty表示終端。控制台和終端相比隻是多了一項功能,它可以顯示系統資訊,比如核心消息、背景服務消息。啟動Linux核心前傳入的指令行參數“console=…”就是用來指定控制台。

2、序列槽也是一種終端裝置,在基本硬體操作的基礎上,還增加了很多軟體功能。驅動程式從上到下分為四層:終端裝置層、行規層、序列槽抽象層、序列槽晶片層。

Linux下序列槽、網卡驅動

drivers/serial下序列槽晶片層各晶片具體函數抽象為drivers/serial下serial_core.c和serial_core.h,字元裝置集中于drivers/char。行規層指定資料交換的規則,比如接收到TAB轉換為8個空格,接收到Ctrl+C轉換為SIGINT。終端裝置層向上提供統一的裝置接口,使得使用者不必關心具體終端的類型。

3、序列槽接收資料,以接收ls為例

(1)shell一直休眠,序列槽接收‘l’,儲存(緩沖區)、回顯

(2)接收‘s’儲存、回顯

(3)接收回車符喚醒shell程序,shell讀取儲存的“ls”,進一步處理

二、網卡

Linux下序列槽、網卡驅動

核心空間即網絡子系統。

系統調用接口:為使用者空間的應用程式提供一種通路核心網絡子系統的方法。

協定無關接口:提供通用方法使用底層傳輸層協定。

網絡協定:實際協定如TIC/IP、UDP

裝置無關層:提供各個裝置驅動程式通信的通用接口。

裝置驅動程式:移植重點,每個裝置具體的驅動程式。

如網卡dm9000,源檔案位于/driver/net/dm9000.c(具體操作函數)。既可以編進核心也可以編譯成一個子產品。入口函數都是dm9000_init

//向核心注冊平台驅動dm9000_driver
//名稱為dm9000,如果核心中有該裝置,就會調用dm9000_probe函數
dm9000_init(void)
{
    printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);

    return platform_driver_register(&dm9000_driver);    /* search board and register */
}

static struct platform_driver dm9000_driver = {
    .driver = {
        .name    = "dm9000",
        .owner   = THIS_MODULE,
    },
    .probe   = /driver/net/dm9000.c,
    .remove  = dm9000_drv_remove,
    .suspend = dm9000_drv_suspend,
    .resume  = dm9000_drv_resume,
};
           

1、增加DM9000平台裝置

(1)增加平台裝置結構,在arch\arm\plat-s3c24xx\common-smdk.c

//确定該裝置使用的資源
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
    [] = {
        .start = S3C2410_CS4,       /* ADDR2=0,發送位址時使用這個位址 */
        .end   = S3C2410_CS4 + ,
        .flags = IORESOURCE_MEM,
    },
    [] = {
        .start = S3C2410_CS4 + ,   /* ADDR2=1,傳輸資料時使用這個位址 */
        .end   = S3C2410_CS4 +  + ,
        .flags = IORESOURCE_MEM,
    },
    [] = {
        .start = IRQ_EINT7,         /* 中斷号 */
        .end   = IRQ_EINT7,
        .flags = IORESOURCE_IRQ,
    }

};
           

(2)加入核心裝置清單,也在arch\arm\plat-s3c24xx\common-smdk.c

static struct platform_device __initdata *smdk_devs[] = {
    &s3c_device_nand,
    &smdk_led4,
    &smdk_led5,
    &smdk_led6,
    &smdk_led7,
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
    &s3c_device_dm9k,
#endif    
#ifdef CONFIG_SERIAL_EXTEND_S3C24xx
    &s3c_device_8250,
#endif
#ifdef CONFIG_TOUCHSCREEN_S3C2410
    &s3c_device_ts,
#endif
};
           

(3)修改/driver/net/dm9000.c中dm9000_probe、dm9000_reset、dm9000_open(注冊中斷等)等函數。

2、使用網卡

在核心根目錄下執行 make menuconfig 在圖像界面中配置網卡(選擇編譯進核心或編譯成子產品)
然後執行 make uImage 在arch/arm/boot/uImage生成核心鏡像
           

繼續閱讀