S3C2440 輸入子系統學習筆記 第一節

2022-08-21 07:54:15 字數 3191 閱讀 9552

好了廢話不多說,進入正題。

首先回顧一下以前,按照韋老大的方式寫乙個驅動框架:

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是函式呼叫介面。

static

int __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提供了哪些呼叫介面呢?

static

const

struct file_operations input_fops =;

再看看input_open_file函式。

static

int 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 定義來的陣列.

static

struct 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為例)

static

struct 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...