#include #include #include #include #include #include #include #include #include #include #include #include static struct class *sixthdrv_class;
static struct class_device *sixthdrv_class_dev;
volatile unsigned long *gpfcon;
volatile unsigned long *gpfdat;
volatile unsigned long *gpgcon;
volatile unsigned long *gpgdat;
static declare_wait_queue_head(button_waitq);
/* 中斷事件標誌, 中斷服務程式將它置1,sixth_drv_read將它清0 */
static volatile int ev_press = 0;
static struct fasync_struct *button_async;
struct pin_desc;
/* 鍵值: 按下時, 0x01, 0x02, 0x03, 0x04 */
/* 鍵值: 鬆開時, 0x81, 0x82, 0x83, 0x84 */
static unsigned char key_val;
struct pin_desc pins_desc[4] = ,
, ,,};
//static atomic_t canopen = atomic_init(1); //定義原子變數並初始化為1
static declare_mutex(button_lock); //定義互斥鎖
/* * 確定按鍵值
*/static irqreturn_t buttons_irq(int irq, void *dev_id)
else
ev_press = 1; /* 表示中斷發生了 */
wake_up_interruptible(&button_waitq); /* 喚醒休眠的程序 */
kill_fasync (&button_async, sigio, poll_in);
return irq_retval(irq_handled);
}/* 1 阻塞操作
*程序進行裝置操作時,使用down()函式,若獲取不到資源則掛起程序,將被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。
*在read讀取按鍵時, 一直等待按鍵按下才返回資料
* 2 非阻塞操作
*程序進行裝置操作時,使用down_trylock()函式,若獲取不到資源並不掛起,直接放棄。
*在read讀取按鍵時, 不管有沒有資料都要返回
*/static int sixth_drv_open(struct inode *inode, struct file *file)
#endif
if (file->f_flags & o_nonblock) /* 非阻塞操作,獲取不到則退出 */
else /* 阻塞操作,獲取不到則進入休眠 */
/* 配置gpf0,2為輸入引腳 */
/* 配置gpg3,11為輸入引腳 */
request_irq(irq_eint0, buttons_irq, irqt_bothedge, "s2", &pins_desc[0]);
request_irq(irq_eint2, buttons_irq, irqt_bothedge, "s3", &pins_desc[1]);
request_irq(irq_eint11, buttons_irq, irqt_bothedge, "s4", &pins_desc[2]);
request_irq(irq_eint19, buttons_irq, irqt_bothedge, "s5", &pins_desc[3]);
return 0;
}ssize_t sixth_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
else /* 如果是非阻塞,則立馬判斷有沒有按鍵ev_press產生 */
/* 如果有按鍵動作, 返回鍵值 */
copy_to_user(buf, &key_val, 1);
ev_press = 0;
return 1;
}int sixth_drv_close(struct inode *inode, struct file *file)
static unsigned sixth_drv_poll(struct file *file, poll_table *wait)
static int sixth_drv_fasync (int fd, struct file *filp, int on)
static struct file_operations sencod_drv_fops = ;
int major;
static int sixth_drv_init(void)
static void sixth_drv_exit(void)
module_init(sixth_drv_init);
module_exit(sixth_drv_exit);
module_license("gpl");
sixdrvtest.c
#include #include #include #include #include #include #include #include #include /* sixthdrvtest
*/int fd;
void my_signal_fun(int signum)
int main(int argc, char **argv)
//fcntl(fd, f_setown, getpid());
//oflags = fcntl(fd, f_getfl);
//fcntl(fd, f_setfl, oflags | fasync);
while (1)
return 0;
}
互斥體 原子操作 自旋鎖 訊號量
一 互斥體 struct mutex my mutex 定義mutex mutex init my mutex 初始化mutex mutex lock my mutex 獲取mutex 臨界資源 mutex unlock my mutex 釋放mutex 二 原子操作 1 定義 原子操作指的是在執行...
017 linux驅動之 訊號量
訊號量 訊號量 semaphore 是用於保護臨界區的一種常用方法,只有得到訊號量的程序才能執行臨界區 當獲取不到訊號量時,程序進入休眠等待狀態。定義訊號量 struct semaphore sem 初始化訊號量 void sema init struct semaphore sem,int val...
IPC之 訊號量集 多個訊號量
如果兩個程序不僅需要同步,還要保證先後執行順序,就要用兩個訊號量 互斥鎖 來解決 柵欄模型 實現以下框架中的四個子程序 所有程序做完任務後 在一起執行下一次 include include include include include include include include define ...