2 回答

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是linux系統(tǒng)標(biāo)準(zhǔn)驅(qū)動(dòng)架構(gòu),通過在內(nèi)核驅(qū)動(dòng)程序運(yùn)用標(biāo)準(zhǔn)的模式實(shí)現(xiàn)在用戶空間的標(biāo)準(zhǔn)IO訪問。主要有以下幾個(gè)部分:
1 對于一個(gè)驅(qū)動(dòng)程序要有一個(gè)裝載函數(shù)XX_Init和卸載函數(shù)XX_Exit,通過module_init(XX_Init)和module_exit(XX_Exit),這樣編譯生成的.o(2.4版)或.ko(2.6版)就可以調(diào)用insmod加載和調(diào)用rmmod卸載了。
2在XX_Init初始化設(shè)備中要為設(shè)備alloc_chrdev_region獲取一個(gè)主設(shè)備號,并建立一個(gè)file_opertions結(jié)構(gòu)的變量將你的XX_open,XX_read,XX_write,XX_ioctl等函數(shù)賦值給結(jié)構(gòu)中相應(yīng)的函數(shù)指針,經(jīng)過對設(shè)備的cdev_init注冊后,你在用戶空間調(diào)用open函數(shù)就可以打開設(shè)備并獲取一個(gè)fd值,然后通過fd調(diào)用ioctl就能映射到你驅(qū)動(dòng)中的XX_ioctl函數(shù)。

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
嵌入式Linux中如何實(shí)現(xiàn)應(yīng)用程序與驅(qū)動(dòng)程序函數(shù)接口問題,以GPIO為例
驅(qū)動(dòng)中的函數(shù)定義:
static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}
應(yīng)用程序中的函數(shù)定義:
ioctl(fd, on, led_no);
不明白的地方是函數(shù)名都不一樣,應(yīng)用程序中的ioctl函數(shù)是如何將參數(shù)傳遞到驅(qū)動(dòng)程序sbc2440_leds_ioctl中的?
添加回答
舉報(bào)