好了廢話不多說,進入正題。
首先回顧一下以前,按照韋老大的方式寫乙個驅動框架:
1、確定主裝置好
2、構造乙個file_operations結構體 結構體中包含有常用的介面, 如open、 write、 read 等等
3、接下來時註冊乙個字元裝置驅動程式(register_chrdev)
4、入口函式、 出口函式、 加修飾。
在輸入子系統中大體也是這個框架,區別在於在輸入子系統中這些框架是核心驅動開發這寫好的。我們要做的就是把我們的**融合到裡邊去。
輸入子系統的核心時input.c(目錄: /linux/driver/input/input.c) 現在我們開始分析系統框架:
暫時沒有框架圖哈。
輸入子系統的核心是input.c 我們從入口函式著手 **如下,我們看到入口函式中的 err = register_chrdev(input_major, "input", &input_fops); 這是註冊乙個名為input的裝置,裝置號為input_major, input_fops是函式呼叫介面。
staticint __init input_init(void
) err =input_proc_init();
if(err)
goto
fail1;
err
= register_chrdev(input_major, "
input
", &input_fops);
if(err)
return0;
fail2: input_proc_exit();
fail1: class_unregister(&input_class);
return
err;
}
接下來我們來看input_fops提供了哪些呼叫介面呢?
staticconst
struct file_operations input_fops =;
再看看input_open_file函式。
staticint input_open_file(struct inode *inode, struct file *file)
old_fops = file->f_op;
file
->f_op =
new_fops;//將新檔案的f_ops 賦給 檔案的f_op ????? 沒理解。。。
err = new_fops->open(inode, file); //最後呼叫檔案的open 函式; 最終應用程式read 函式呼叫的是 file->f_op->read函式.
if(err)
fops_put(old_fops);
return
err;
}
input_table是由input_handler 定義來的陣列.
staticstruct input_handler *input_table[8]
註冊input_handler 做的事情
int input_register_handler(struct input_handler *handler)
list_add_tail(&handler->node, &input_handler_list); // 放入鍊錶中
list_for_each_entry(dev, &input_dev_list, node) //對於沒個device_input 放入連表中
input_attach_handler(dev, handler);
input_wakeup_procfs_readers();
return 0;
接下來看看註冊input_register_devide做的事情
int input_register_device(struct input_dev *dev);static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
const struct input_device_id *id)
小結: 1、分配乙個inout_hanfle結構體
2、 input_handle.dev = input_dev; //指向右邊的input_dev
input_handle.handler = input_handler; //指向右邊的input_handler
3、註冊
input_handler->h_list = &input_handle;
input_dev->h_list = &input)handle;
資料的讀取:
應用程式讀取程式通過read函式讀取資料的時候,會呼叫到evdev_handler(僅僅時以evdev為例)
staticstruct input_handler evdev_handler =;
static const struct file_operations evdev_fops =
那麼evdev_event 被誰呼叫呢? 猜測時硬體相關的**,input_dev呼叫的, 在裝置的中斷服務程式中,確定是什麼事件,然後再呼叫相應的input_handler 的event處理函式
以 gpio_key_isr為例
static irqreturn_t gpio_keys_isr(int irq, void *dev_id)}void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{struct input_handle *handle;
if (type > ev_max || !test_bit(type, dev->evbit))
......
......
list_for_each_entry(handle, &dev->h_list, d_node)
if (handle->open)
handle->handler->event(handle, type, code, value); //event函式被呼叫。
s3c2440系統時鐘
1 flck hclk和pclk的關係 一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll 鎖相環 進行倍頻處理。在s3c2440中,...
求教 s3c2440問題
趙老師您好,我把您的程式新增到我的程式中去了,下面是主要 1 main函式 int main void a a b rgpbdat liushui delay 20 liushui liushui 0xffe 2 pwm初始化 void pwm init void 3 定時器中斷 static vo...
s3c2440儲存控制
nandflash和norflash都是flash的一種,都是散存,都是磁碟儲存介子,但是nandflash一般比較大,而norflash都比較小,並且norflash比較貴,並且norflash寫的速度比較慢,但讀的速度比較快 而nandflash讀的速度比較慢,寫的速度比較快。nor flash...