當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]觸摸屏驅(qū)動在/kernel/drivers/char/s3c2410-ts.c 文件中。該驅(qū)動總要有以下重要數(shù)據(jù)結(jié)構(gòu):1.觸摸屏的file_operationsstatic struct file_operations s3c2410_fops={owner: THIS_MODULE,open: s3c2410_ts_open,read:

觸摸屏驅(qū)動在/kernel/drivers/char/s3c2410-ts.c 文件中。
該驅(qū)動總要有以下重要數(shù)據(jù)結(jié)構(gòu):
1.觸摸屏的file_operations
static struct file_operations s3c2410_fops={
owner: THIS_MODULE,
open: s3c2410_ts_open,
read: s3c2410_ts_read,
release: s3c2410_ts_release,
#ifdef USE_ASYNC
fasync: s3c2410_ts_fasync,
#endif
poll: s3c2410_ts_poll,
};
2.全局變量TS_DEV結(jié)構(gòu)體,用來保存觸摸屏的相關(guān)參數(shù)、等待處理的消息隊(duì)列、當(dāng)前采樣數(shù)據(jù)、上一次采樣數(shù)據(jù)等信息
typedef struct {
unsigned int penStatus; /* PEN_UP, PEN_DOWN, PEN_SAMPLE */
TS_RET buf[MAX_TS_BUF]; /* protect against overrun(環(huán)形緩沖區(qū)) */
unsigned int head, tail;/* head and tail for queued events (環(huán)形緩沖區(qū)的頭尾)*/
wait_queue_head_t wq; //* 等待隊(duì)列數(shù)據(jù)結(jié)構(gòu)
spinlock_t lock; //* 自旋鎖
#ifdef USE_ASYNC
struct fasync_struct *aq;
#endif
#ifdef CONFIG_PM
struct pm_dev *pm_dev;
#endif
} TS_DEV;
其中TS_RET在/kernel/include/asm-arm/linuette_ioctl.h 文件中:
typedef struct {
unsigned short pressure; //* 壓力,這里可定義為筆按下,筆抬起,筆拖曳
unsigned short x; //* 橫坐標(biāo)的采樣值
unsigned short y; //* 縱坐標(biāo)的采樣值
unsigned short pad; //* 填充位
} TS_RET;
結(jié)構(gòu)體wait_queue_head_t在/kernel/include/linux/wait.h 文件中:
struct __wait_queue_head {
wq_lock_t lock;
struct list_head task_list;
#if WAITQUEUE_DEBUG
long __magic;
long __creator;
#endif
};
typedef struct __wait_queue_head wait_queue_head_t;

TS_RET結(jié)構(gòu)體中的信息就是驅(qū)動程序提供給上層應(yīng)用程序使用的信息,用來存儲觸摸屏的返回值。上層應(yīng)用程序通過讀接口,從底層驅(qū)動中讀取信息,并根據(jù)得到的值進(jìn)行其他方面的操作。
TS_DEV結(jié)構(gòu)用于記錄觸摸屏運(yùn)行的各種狀態(tài),PenStatus包括PEN_UP、PEN_DOWN和PEN_FLEETING。buf[MAX_TS_BUF]是用來存放數(shù)據(jù)信息的事件隊(duì)列,head、tail分別指向事件隊(duì)列的頭和尾。程序中的筆事件隊(duì)列是一個環(huán)形結(jié)構(gòu),當(dāng)有事件加入時(shí),隊(duì)列頭加一,當(dāng)有事件被取走時(shí),隊(duì)列尾加一,當(dāng)頭尾位置指針一致時(shí)讀取筆事件的信息,進(jìn)程會被安排進(jìn)入睡眠。wq等待隊(duì)列,包含一個鎖變量和一個正在睡眠進(jìn)程鏈表。當(dāng)有好幾個進(jìn)程都在等待某件事時(shí),Linux會把這些進(jìn)程記錄到這個等待隊(duì)列。它的作用是當(dāng)沒有筆觸事件發(fā)生時(shí),阻塞上層的讀操作,直到有筆觸事件發(fā)生。lock使用自旋鎖,自旋鎖是基于共享變量來工作的,函數(shù)可以通過給某個變量設(shè)置一個特殊值來獲得鎖。而其他需要鎖的函數(shù)則會循環(huán)查詢鎖是否可用。MAX_TS_BUF的值為16,即在沒有被讀取之前,系統(tǒng)緩沖區(qū)中最多可以存放16個筆觸數(shù)據(jù)信息。

模塊初始化函數(shù)是調(diào)用s3c2410_ts_init 函數(shù)來實(shí)現(xiàn)的,主要完成觸摸屏設(shè)備的內(nèi)核模塊加載、初始化系統(tǒng)I/O、中斷注冊、設(shè)備注冊,為設(shè)備文件系統(tǒng)創(chuàng)建入口等標(biāo)準(zhǔn)的字符設(shè)備初始化工作。
static int __init s3c2410_ts_init(void)
ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);
tsMajor = ret;
這里首先對字符設(shè)備進(jìn)行注冊,將觸摸屏的file_operations 結(jié)構(gòu)中的函數(shù)接口傳入內(nèi)核,注冊成功后獲得系統(tǒng)自動分配的主設(shè)備號。
set_gpio_ctrl(GPIO_YPON);
set_gpio_ctrl(GPIO_YMON);
set_gpio_ctrl(GPIO_XPON);
set_gpio_ctrl(GPIO_XMON);
在/kernel/include/asm-arm/arch-s3c2410/smdk.h 文件中:
#define GPIO_YPON (GPIO_MODE_nYPON | GPIO_PULLUP_DIS | GPIO_G15)
#define GPIO_YMON (GPIO_MODE_YMON | GPIO_PULLUP_EN | GPIO_G14)
#define GPIO_XPON (GPIO_MODE_nXPON | GPIO_PULLUP_DIS | GPIO_G13)
#define GPIO_XMON (GPIO_MODE_XMON | GPIO_PULLUP_EN | GPIO_G12)
GPIO 口的Port G 端口有4個管腳對應(yīng)觸摸屏的控制接口,分別是:
GPG15 --- nYPON Y+ 控制信號
GPG14 --- YMON Y- 控制信號
GPG13 --- nXPON X+ 控制信號
GPG12 --- XMON X- 控制信號
需要通過配置GPGCON 寄存器來設(shè)定該端口管腳的輸出模式,對應(yīng)位如下:
[31:30] [29:28] [27:26] [25:24]
GPG15 GPG14 GPG13 GPG12 ...
參考S3C2410 芯片datasheet 的I/O口章節(jié),都要設(shè)為11(二進(jìn)制)。
ADCDLY = 30000;
配置ADCDLY 寄存器,對自動轉(zhuǎn)換模式來說是設(shè)定ADC 開始轉(zhuǎn)換時(shí)的延時(shí)時(shí)間,以及對X軸和Y軸轉(zhuǎn)換的時(shí)間間隔,對正常模式來說僅設(shè)定對X軸和Y軸轉(zhuǎn)換的時(shí)間間隔。注意該值不能為0。
ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,
DEVICE_NAME, s3c2410_isr_adc);
if (ret) goto adc_failed;
ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,
DEVICE_NAME, s3c2410_isr_tc);
if (ret) goto tc_failed;
/* Wait for touch screen interrupts */
wait_down_int();

函數(shù)request_irq 是Linux 系統(tǒng)中驅(qū)動程序注冊中斷的方法。irq 為所要申請的硬件中斷號,handler 為系統(tǒng)所注冊的中斷處理子程序,irq_flags 為申請時(shí)的選項(xiàng),devname 為指向設(shè)備名稱的字符指針,dev_id 為申請時(shí)告訴系統(tǒng)的設(shè)備標(biāo)識。若中斷申請成功則返回0,失敗則返回負(fù)值。
ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,
DEVICE_NAME, s3c2410_isr_adc);
調(diào)用該函數(shù)來進(jìn)行A/D轉(zhuǎn)換的中斷注冊,所要申請的硬件中斷號為IRQ_ADC_DONE(62),在arch/irq s.h中定義;系統(tǒng)所注冊的中斷處理子程序?yàn)閟3c2410_isr_adc 函數(shù);申請中斷選項(xiàng)為SA_INTERRUPT,表示中斷處理程序是快速處理程序,即快速處理程序運(yùn)行時(shí),所有中斷都被屏蔽;設(shè)備名稱定義為DEVICE_NAME,即"s3c2410-ts";而設(shè)備標(biāo)識仍然用中斷處理子程序代替。

ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,
DEVICE_NAME, s3c2410_isr_tc);
接著繼續(xù)調(diào)用該函數(shù)來進(jìn)行觸摸屏觸摸的中斷注冊,所要申請的硬件中斷號為IRQ_TC(61);系統(tǒng)所注冊的中斷處理子程序?yàn)閟3c2410_isr_tc 函數(shù);申請中斷選項(xiàng)為SA_INTERRUPT,表示中斷處理程序是快速處理程序,即快速處理程序運(yùn)行時(shí),所有中斷都被屏蔽;設(shè)備名稱定義為DEVICE_NAME,即"s3c2410-ts";而設(shè)備標(biāo)識仍然用中斷處理子程序代替。
wait_down_int();
調(diào)用該宏函數(shù)來設(shè)置觸摸屏為等待中斷模式【筆按下產(chǎn)生中斷】,具體定義如下:
#define wait_down_int() { ADCTSC = DOWN_INT | XP_PULL_UP_EN | /
XP_AIN | XM_HIZ | YP_AIN | YM_GND | /
XP_PST(WAIT_INT_MODE); }
用該宏函數(shù)來設(shè)置ADC 觸摸屏控制寄存器,參考S3C2410 芯片datasheet 中關(guān)于觸摸屏的章節(jié),具體設(shè)置參數(shù)如下:
DOWN_INT = 1<<8 * 0 該位保留且應(yīng)該設(shè)為0 【筆按下或筆抬起中斷信號控制位,設(shè)為0 表示筆按下產(chǎn)生中斷信號】
XP_PULL_UP_EN = 1<<3 * 0 上拉開關(guān)使能,設(shè)為0 表示XP 引腳上拉使能
XP_AIN = 1<<4 * 1 選擇nXPON 引腳輸出值,設(shè)為1 表示nXPON 引腳輸出1,則XP 引腳連接AIN[7] 引腳
XM_HIZ = 1<<5 * 0 選擇XMON 引腳輸出值,設(shè)為0 表示XMON 引腳輸出0,則XM 引腳為高阻態(tài)
YP_AIN = 1<<6 * 1 選擇nYPON 引腳輸出值,設(shè)為1 表示nYPON 引腳輸出1,則YP 引腳連接AIN[5] 引腳
YM_GND = 1<<7 * 1 選擇YMON 引腳輸出值,設(shè)為1 表示YMON 引腳輸出1,則YM 引腳為接地
XP_PST(WAIT_INT_MODE); = 3 X坐標(biāo)Y坐標(biāo)手動測量設(shè)置,設(shè)為3 表示等待中斷模式

#ifdef CONFIG_DEVFS_FS
devfs_ts_dir = devfs_mk_dir(NULL, "touchscreen", NULL);
devfs_tsraw = devfs_register(devfs_ts_dir, "0raw", DEVFS_FL_DEFAULT,
tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,
&s3c2410_fops, NULL);
#endif
這里調(diào)用了devfs_mk_dir 函數(shù),在設(shè)備文件系統(tǒng)中創(chuàng)建了一個名為touchscreen 的目錄,并返回一個帶有目錄結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)變量devfs_ts_dir。將該變量作為下一步devfs_register 函數(shù)的參數(shù),該參數(shù)在調(diào)用設(shè)備文件系統(tǒng)注冊清除函數(shù)devfs_unregister 時(shí)也要作為參數(shù)傳入。
調(diào)用devfs_register 函數(shù)后,會在剛才創(chuàng)建的touchscreen 目錄下再創(chuàng)建一個名為0raw 的設(shè)備文件節(jié)點(diǎn)。該函數(shù)的參數(shù)中,DEVFS_FL_DEFAULT 為該函數(shù)的標(biāo)志選項(xiàng),tsMajor 為注冊字符設(shè)備時(shí)系統(tǒng)自動分配的主設(shè)備號,TSRAW_MINOR(1)為次設(shè)備號,S_IFCHR | S_IRUSR | S_IWUSR 為默認(rèn)的文件模式,&s3c2410_fops 為傳入內(nèi)核的觸摸屏file_operations 結(jié)構(gòu)中的函數(shù)接口,私有數(shù)據(jù)指針為空。返回一個devfs_handle_t 數(shù)據(jù)結(jié)構(gòu)的變量devfs_tsraw,這會在調(diào)用設(shè)備文件系統(tǒng)注冊清除函數(shù)devfs_unregister 時(shí)作為參數(shù)傳入。

模塊的退出函數(shù)為s3c2410_ts_exit,該函數(shù)的工作就是清除已注冊的字符設(shè)備,中斷以及設(shè)備文件系統(tǒng)。
static void __exit s3c2410_ts_exit(void)
{
#ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_tsraw);
devfs_unregister(devfs_ts_dir);
#endif
unregister_chrdev(tsMajor, DEVICE_NAME);
#ifdef CONFIG_PM
pm_unregister(tsdev.pm_dev);
#endif
free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);
free_irq(IRQ_TC, s3c2410_isr_tc);
#ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_tsraw);
devfs_unregister(devfs_ts_dir);
#endif
這里首先清除原先后一步創(chuàng)建設(shè)備文件節(jié)點(diǎn)0raw 的結(jié)構(gòu)變量devfs_tsraw,然后再清除創(chuàng)建touchscreen 目錄的結(jié)構(gòu)變量devfs_ts_dir。
unregister_chrdev(tsMajor, DEVICE_NAME);
接下來刪除字符設(shè)備的注冊信息。
void free_irq(unsigned int irq, void *dev_id)
函數(shù)free_irq 與函數(shù)request_irq 相對應(yīng),通常在模塊被卸載時(shí)調(diào)用,負(fù)責(zé)注銷一個已經(jīng)申請的中斷。

free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);
free_irq(IRQ_TC, s3c2410_isr_tc);
最后依次注銷A/D轉(zhuǎn)換和定時(shí)器這兩個已經(jīng)申請的中斷。

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉