Tiny6410 buttons c 按鍵驅動程式

2021-06-17 23:24:52 字數 3684 閱讀 8557

最近一直在找帶中斷的led驅動程式先貼出來方便自己複習。

/*tiny6410_buttons_xyl.c*/

/*引用的標頭檔案*/

#include

/*模組有關的*/

#include /*

核心有關的*/

#include

/*檔案系統有關的*/

#include

#include

#include

#include

#include

/*中斷*/

#include

#include

/*linux中斷*/

#include

#include

#include for

m_device.h>

#include

#include

#include

#include

#include

/*暫存器設定*/

#include

#include

#include

#define device_name "buttons"

/*裝置名*/

/*定義按鈕中斷的描述結構體*/

struct button_irq_desc ;

/*指定8個按鍵的資訊*/

static struct button_irq_desc button_irqs = , ,

, ,, ,

, ,};

static volatile char key_values = ;

/*key_values陣列,這個陣列是存放按鍵操作結果的

0表示無資料可讀,1表示有資料可讀*/

static declare_wait_queue_head(button_waitq);

/*button_waitq是按鍵等待佇列的名稱*/

/*巨集declare_wait_queue_head( )*/

/*該巨集是建立了乙個等待佇列*/

/*等待佇列,是程序排程的一種重要方法*/

/*按鍵一按下,就會啟用其等待佇列裡的程序,來做相應的處理*/

/*按鍵的等待佇列,或者說中斷所設定的等待佇列,*/

/*是中斷處理中非常重要的資源,它大大擴充套件了中斷處理的能力*/

static volatile int ev_press = 0;

/*初始為0*/

static irqreturn_t buttons_interrupt(int irq, void *dev_id)

/*引數dev_id ---具體是哪乙個按鈕*/

if (down != (key_values[number] & 1))

return irq_retval(irq_handled); }

static int s3c64xx_buttons_open(struct inode *inode, struct file *file)

/*s3c64xx_buttons_open()函式申明*/

/*驅動函式open呼叫的具體函式*/

/*由open函式具體實現硬體的初始化工作*/

/*以及軟體的初始化工作*/

/*為我們的鍵盤裝置的執行創造好環境*/

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)

disable_irq(button_irqs[i].irq);

free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); }

return -ebusy; }

ev_press = 1;

return 0; }

/*mini2440_buttons_close()函式的申明*/

/*release呼叫的具體函式*/

/*裝置軟體環境的拆卸*/

/*具體就是中斷的釋放工作*/

/*因為中斷資源,也是系統寶貴的資源,所以不用的時候,要釋放*/

static int s3c64xx_buttons_close(struct inode *inode, struct file *file)

free_irq(button_irqs[i].irq, (void *)&button_irqs[i]); }

return 0; }

/*mini2440_buttons_read()函式的申明*/

/*read呼叫的具體函式*/

/*由它讀取鍵盤輸入的結果*/

/*實質上就是讀取key_values陣列的值*/

/*它完成了鍵盤作為輸入裝置的核心功能*/

/*陣列是否可讀,要根據標誌位ev_press來判斷*/

/*如果陣列可讀,則讀取資料到使用者buffer中*/

/*如果陣列不可讀,則程序進入等待佇列,等待到陣列可讀為止*/

/*等待佇列機制,是中斷管理中常用到的機制*/

/*因為有些程序經常需要等待某一事件的發生*/

static int s3c64xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

/*注意__user,指的是使用者空間*/

/*即要把鍵盤的輸入結果讀取到使用者空間去*/

ev_press = 0;

err = copy_to_user((void *)buff, (const void *)(&key_values), min(sizeof(key_values), count));

return err ? -efault : min(sizeof(key_values), count); }

/*mini2440_buttons_poll()函式的申明*/

/*poll呼叫的具體函式*/

/*poll實質上是select的呼叫函式*/

/*如果有按鍵資料,則select會立刻返回*/

/*如果沒有按鍵資料,則等待*/

/*實質上這是鍵盤等待輸入的機制*/

static unsigned int s3c64xx_buttons_poll( struct file *file, struct poll_table_struct *wait)

/*file_operations結構體*/

/*驅動函式的設定*/

/*分別將前面的驅動函式設定進來*/

static struct file_operations dev_fops = ;

static struct miscdevice misc = ;

static int __init dev_init(void)

static void __exit dev_exit(void)

module_init(dev_init);

module_exit(dev_exit);

module_license("gpl");

module_author("friendlyarm inc.");

Tiny6410核心移植

一 開發環境 宿主機 fedora9.0 或 ubuntu10.04 開發板 tiny6410 編譯器 4.3.2 二 核心移植 linux 2.6.38 2.解壓 進入根目錄下的 home poplar expr4 kernel目錄,解壓原始碼 tar xvfj home poplar expr4...

Tiny6410學習 Linux命令

今天再來記錄一下一些非常常用的linux基礎命令知識,以備後期來查。1.新增使用者 useradd smb 新增名字為smb的使用者 2.修改密碼 passwd smb 修改smb使用者的密碼 3.切換使用者 su root 切換到root使用者,並將root環境變數同時帶入 就是管理員賬號了,也就...

Tiny6410 交叉編譯helloworld程式

在工作目錄下建立helloworld.c檔案 cpp view plain copy print include main 儲存關閉後。編譯helloworld檔案 csharp view plain copy print root snail home workdir qt project hel...