女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > 單片機 > 單片機
[導讀]驅動程序tang2440_buttons.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME "

驅動程序tang2440_buttons.c

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define DEVICE_NAME "buttons"

/*定義中斷所用的結構體*/
struct button_irq_desc {
int irq; //按鍵對應的中斷號
int pin; //按鍵所對應的 GPIO 端口
int pin_setting; //按鍵對應的引腳描述,實際并未用到,保留
int number; //定義鍵值,以傳遞給應用層/用戶態(tài)
char *name; //每個按鍵的名稱
};

/*結構體實體定義*/
static struct button_irq_desc button_irqs [] = {
{IRQ_EINT8 , S3C2410_GPG(0) , S3C2410_GPG0_EINT8 , 0, "KEY0"},
{IRQ_EINT11, S3C2410_GPG(3) , S3C2410_GPG3_EINT11 , 1, "KEY1"},
{IRQ_EINT13, S3C2410_GPG(5) , S3C2410_GPG5_EINT13 , 2, "KEY2"},
{IRQ_EINT14, S3C2410_GPG(6) , S3C2410_GPG6_EINT14 , 3, "KEY3"},
{IRQ_EINT15, S3C2410_GPG(7) , S3C2410_GPG7_EINT15 , 4, "KEY4"},
{IRQ_EINT19, S3C2410_GPG(11), S3C2410_GPG11_EINT19, 5, "KEY5"},
};

/*開發(fā)板上按鍵的狀態(tài)變量,注意這里是’0’,對應的 ASCII 碼為 30*/
static volatile char key_values [] = {'0', '0', '0', '0', '0', '0'};

/*因為本驅動是基于中斷方式的,在此創(chuàng)建一個等待隊列,以配合中斷函數(shù)使用;當有按鍵按下并讀取到鍵
值時,將會喚醒此隊列,并設置中斷標志,以便能通過 read 函數(shù)判斷和讀取鍵值傳遞到用戶態(tài);當沒有按
鍵按下時,系統(tǒng)并不會輪詢按鍵狀態(tài),以節(jié)省時鐘資源*/
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

/*中斷標識變量,配合上面的隊列使用,中斷服務程序會把它設置為 1,read 函數(shù)會把它清零*/
static volatile int ev_press = 0;

/*本按鍵驅動的中斷服務程序*/
static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{
struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;
int down;
/*獲取被按下的按鍵狀態(tài)*/
down = !s3c2410_gpio_getpin(button_irqs->pin);
/*狀態(tài)改變,按鍵被按下,從這句可以看出,當按鍵沒有被按下的時候,寄存器的值為 1(上拉),但按
鍵被按下的時候,寄存器對應的值為 0*/
if (down != (key_values[button_irqs->number] & 1)) { // Changed
/*如果 key1 被按下,則 key_value[0]就變?yōu)椤?’,對應的 ASCII 碼為 31*/
key_values[button_irqs->number] = '0' + down;
ev_press = 1; /*設置中斷標志為 1*/
wake_up_interruptible(&button_waitq); /*喚醒等待隊列*/
}
return IRQ_RETVAL(IRQ_HANDLED);
}

/*
*在應用程序執(zhí)行 open(“/dev/buttons”,...)時會調(diào)用到此函數(shù),在這里,它的作用主要是注冊 6 個按鍵的中斷。
*所用的中斷類型是 IRQ_TYPE_EDGE_BOTH,也就是雙沿觸發(fā),在上升沿和下降沿均會產(chǎn)生中斷,這樣做是為了更加有
*效地判斷按鍵狀態(tài)
*/
static int s3c24xx_buttons_open(struct inode *inode, struct file *file)
{
int i;
int err = 0;
for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {
if (button_irqs[i].irq < 0) {
continue;
}
/*注冊中斷函數(shù)*/
err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,
button_irqs[i].name, (void *)&button_irqs[i]);
if (err)
break;
}
if (err) {
/*如果出錯,釋放已經(jīng)注冊的中斷,并返回*/
i--;
for (; i >= 0; i--) {
if (button_irqs[i].irq < 0) {
continue;
}
disable_irq(button_irqs[i].irq);
free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
}
return -EBUSY;
}
/*注冊成功,則中斷隊列標記為 1,表示可以通過 read 讀取*/
ev_press = 1;
/*正常返回*/
return 0;
}

/*
*此函數(shù)對應應用程序的系統(tǒng)調(diào)用 close(fd)函數(shù),在此,它的主要作用是當關閉設備時釋放 6 個按鍵的中斷處理函數(shù)
*/
static int s3c24xx_buttons_close(struct inode *inode, struct file *file)
{
int i;
for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {
if (button_irqs[i].irq < 0) {
continue;
}
/*釋放中斷號,并注銷中斷處理函數(shù)*/
free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
}
return 0;
}

/*
*對應應用程序的 read(fd,...)函數(shù),主要用來向用戶空間傳遞鍵值
*/
static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
{
unsigned long err;
if (!ev_press) {
if (filp->f_flags & O_NONBLOCK)
/*當中斷標識為 0 時,并且該設備是以非阻塞方式打開時,返回*/
return -EAGAIN;
else
/*當中斷標識為 0 時,并且該設備是以阻塞方式打開時,進入休眠狀態(tài),等待被喚醒*/
wait_event_interruptible(button_waitq, ev_press);
}
/*把中斷標識清零*/
ev_press = 0;
/*一組鍵值被傳遞到用戶空間*/
err = copy_to_user(buff, (const void *)key_values, min(sizeof(key_values), count));
return err ? -EFAULT : min(sizeof(key_values), count);
}

static unsigned int s3c24xx_buttons_poll( struct file *file, struct poll_table_struct *wait)
{
unsigned int mask = 0;
/*把調(diào)用 poll 或者 select 的進程掛入隊列,以便被驅動程序喚醒*/
poll_wait(file, &button_waitq, wait);
if (ev_press)
mask |= POLLIN | POLLRDNORM;
return mask;
}

/*設備操作集*/
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.open = s3c24xx_buttons_open,
.release = s3c24xx_buttons_close,
.read = s3c24xx_buttons_read,
.poll = s3c24xx_buttons_poll,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
/*設備初始化,主要是注冊設備*/
static int __init dev_init(void)
{
int ret;
/*把按鍵設備注冊為 misc 設備,其設備號是自動分配的*/
ret = misc_register(&misc);
printk (DEVICE_NAME"tinitializedn");
return ret;
}
/*注銷設備*/
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉