#include #include #include #include #include #include #include #include #include #include #include
/* 載入模式後,執行」cat /proc/devices」命令看到的裝置名稱 */#define device_name "key_poll"
/*自動建立裝置節點類*/struct class *key_poll_dev_class = null;
struct class_device *key_poll_dev_class_dev = null;
/* 用來指定按鍵所用的外部中斷引腳及中斷觸發方式, 名字 */struct button_irq_desc ;
static struct button_irq_desc button_irqs = , /* k1 */
, /* k2 */
, /* k3 */
, /* k4 */
};
/* 按鍵被按下的次數(準確地說,是發生中斷的次數) */static volatile int press_cnt = ;
/* 等待佇列:* 當沒有按鍵被按下時,如果有程序呼叫key_poll_dev_read函式,
* 它將休眠
*/static declare_wait_queue_head(button_waitq);
/* 中斷事件標誌, 中斷服務程式將它置1,key_poll_dev_read將它清0 */static volatile int ev_press = 0;
static irqreturn_t buttons_interrupt(int irq, void *dev_id)
static int key_poll_dev_open(struct inode *inode, struct file *file)if (err)
return 0;
}
static int key_poll_dev_close(struct inode *inode, struct file *file)return 0;
}
/* 應用程式對裝置檔案/dev/buttons執行read(...)時,* 就會呼叫key_poll_dev_read函式
*/static int key_poll_dev_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
static int key_poll_dev_poll(struct file *file, poll_table *wait)poll_table;
poll_wait的作用就是把當前程序新增到指定等待列表wait(poll_table)中。
需要注意的是這個函式是不會引起阻塞的,呵呵,誰給它取得個名字帶wait的,給咱們添這麼多麻煩。
*/poll_wait(file, &button_waitq, wait);
if (ev_press)
mask |= pollin | pollrdnorm;
/*pollin普通或優先順序帶資料可讀
pollrdnorm普通資料可讀
pollrdband優先順序帶資料可讀
pollpri高優先順序資料可讀
pollout普通資料可寫
pollwrnorm普通資料可寫
pollwrband優先順序帶資料可寫
pollerr發生錯誤
pollhup發生掛起
pollnval描述字不是乙個開啟的檔案
*/return mask;
}/* 這個結構是字元裝置驅動程式的核心
* 當應用程式操作裝置檔案時所呼叫的open、read、write等函式,
* 最終會呼叫這個結構中的對應函式
*/static struct file_operations key_poll_dev_fops = ;
/* * 執行「insmod key_poll_driver.ko」命令時就會呼叫這個函式
*/int key_poll_major = 0;
int key_poll_minor = 0;
static int __init initialization_key_poll_dev(void)
/*執行」rmmod key_poll_dev.ko」命令時就會呼叫這個函式*/
static void __exit cleanup_key_poll_dev(void)
/* 這兩行指定驅動程式的初始化函式和解除安裝函式 */
module_init(initialization_key_poll_dev);
module_exit(cleanup_key_poll_dev);
/*insmod傳參*/
module_param(key_poll_major, int, s_irugo);
module_param(key_poll_minor, int, s_irugo);
/* 描述驅動程式的一些資訊,不是必須的 */
module_author("lhbo"); // 驅動程式的作者
module_description("jz2440 key_poll driver"); // 一些描述資訊
module_license("gpl"); // 遵循的協議
/**************************==非同步通知驅動測試**************************/
#include #include #include #include #include #include #include #include int main(int argc, char **argv)
fds[0].fd = fd;
fds[0].events = pollin;
/* 這是個無限迴圈,程序可能在read函式中休眠,當有按鍵被按下時,它才返回
*/while (1)
else
/*讀取成功列印按鍵次數*/
for (i = 0; i < 4; i++)
printf("k%d has been pressed %d times!\n", i+1, press_cnt[i]);
} }
close(fd);
return 0;
}
poll驅動程式示例
1 驅動 include include include include include include include include include define queue count 256 int readqcount 0 int readqhead 0 int readqtail 0 c...
Linux驅動程式之poll機制
使用非阻塞i o的應用程式通常會使用select 和poll 系統呼叫查詢是否可對裝置進行無阻塞的訪問,這兩個系統呼叫最終又會引發裝置驅動中的poll 函式被執行 所以我們的問題就集中到了如何編寫裝置驅動中的poll 函式就可以了。先來看看裝置驅動中的poll 函式原型 這個函式要進行下面兩項工作 ...
linux 驅動程式 高階字元驅動程式
ioctl方法 驅動程式的原型實現 int ioctl struct inode inode,struct file filp,unsigned int cmd,unsigned long arg ioctl 命令選擇 位段結構 number direction ioc read ioc write...