2 回答

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

TA貢獻1812條經驗 獲得超5個贊
嵌入式Linux中如何實現應用程序與驅動程序函數接口問題,以GPIO為例
驅動中的函數定義:
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;
}
}
應用程序中的函數定義:
ioctl(fd, on, led_no);
不明白的地方是函數名都不一樣,應用程序中的ioctl函數是如何將參數傳遞到驅動程序sbc2440_leds_ioctl中的?
- 2 回答
- 0 關注
- 176 瀏覽
添加回答
舉報