娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

linux-2.6.32在mini2440開發(fā)板上移植 添加觸摸屏驅(qū)動(dòng)程序

發(fā)布者:溫暖心情最新更新時(shí)間:2024-06-18 來源: elecfans關(guān)鍵字:linux  mini2440  移植  觸摸屏驅(qū)動(dòng) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

在內(nèi)核中添加觸摸屏驅(qū)動(dòng)程序

編者:linux2.6.32并沒有帶S3C2440觸摸屏驅(qū)動(dòng)程序,需要自己實(shí)現(xiàn)。而在此的觸摸屏驅(qū)動(dòng)程序時(shí)作為一個(gè)輸入設(shè)備來實(shí)現(xiàn)的。在linux中,對(duì)于輸入設(shè)備而言,內(nèi)核專為其設(shè)計(jì)了輸入子系統(tǒng),由核心層處理公共的工作。因?yàn)閷?duì)于輸入設(shè)備而言,只是中斷、讀鍵值/坐標(biāo)值是與設(shè)備相關(guān)的,其余的如輸入事件的緩沖區(qū)的管理以及字符設(shè)備驅(qū)動(dòng)的file_operations接口則是輸入設(shè)備通用的。所以在此是在輸入子系統(tǒng)的框架下進(jìn)行編寫觸摸屏驅(qū)動(dòng)程序。對(duì)于這個(gè)驅(qū)動(dòng)的移植以及講解,參考了網(wǎng)上的一些文章,一部分摒棄了手冊(cè)。

1 在內(nèi)核中添加觸摸屏驅(qū)動(dòng)程序

 Linux-2.6.32.2 內(nèi)核也沒有包含支持S3C2440 的觸摸屏驅(qū)動(dòng),因此我們自行設(shè)計(jì)了一個(gè)s3c2410_ts.c,它位于linux-src/drivers/input/touchscreen 目錄下,你可以自己增加一個(gè)s3c2410_ts.c 文件,并復(fù)制如下內(nèi)容:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* For ts.dev.id.version */
#define S3C2410TSVERSION 0x0101
#define WAIT4INT(x) (((x)<<8) |
S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN |
S3C2410_ADCTSC_XY_PST(3))
#define AUTOPST (S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN |
S3C2410_ADCTSC_XP_SEN |
S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0))
static char *s3c2410ts_name = 's3c2410 TouchScreen';
static struct input_dev *dev;
static long xp;
static long yp;
static int count;
extern struct semaphore ADC_LOCK;
static int OwnADC = 0;
static void __iomem *base_addr;
static inline void s3c2410_ts_connect(void)
{
s3c2410_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON);
s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON);
s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON);
s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON);
}
static void touch_timer_fire(unsigned long data)
{
unsigned long data0;
unsigned long data1;
int updown;
data0 = ioread32(base_addr+S3C2410_ADCDAT0);
data1 = ioread32(base_addr+S3C2410_ADCDAT1);
updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
if (updown) {
if (count != 0) {
long tmp;
tmp = xp;
xp = yp;
yp = tmp;
xp >>= 2;
yp >>= 2;
input_report_abs(dev, ABS_X, xp);
input_report_abs(dev, ABS_Y, yp);
input_report_key(dev, BTN_TOUCH, 1);
input_report_abs(dev, ABS_PRESSURE, 1);
input_sync(dev);
}
xp = 0;
yp = 0;
count = 0;
iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START,
base_addr+S3C2410_ADCCON);
} else {
count = 0;
input_report_key(dev, BTN_TOUCH, 0);
input_report_abs(dev, ABS_PRESSURE, 0);
input_sync(dev);
iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
if (OwnADC) {
OwnADC = 0;
up(&ADC_LOCK);
}
}
}
static struct timer_list touch_timer =
TIMER_INITIALIZER(touch_timer_fire, 0, 0);
static irqreturn_t stylus_updown(int irq, void *dev_id)
{
unsigned long data0;
unsigned long data1;
int updown;
if (down_trylock(&ADC_LOCK) == 0) {
OwnADC = 1;
data0 = ioread32(base_addr+S3C2410_ADCDAT0);
data1 = ioread32(base_addr+S3C2410_ADCDAT1);
updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 &
S3C2410_ADCDAT0_UPDOWN));
if (updown) {
touch_timer_fire(0);
} else {
OwnADC = 0;
up(&ADC_LOCK);
}
}
return IRQ_HANDLED;
}
static irqreturn_t stylus_action(int irq, void *dev_id)
{
unsigned long data0;
unsigned long data1;
if (OwnADC) {
data0 = ioread32(base_addr+S3C2410_ADCDAT0);
data1 = ioread32(base_addr+S3C2410_ADCDAT1);
xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;
yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;
count++;
if (count < (1<<2)) {
iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST,
base_addr+S3C2410_ADCTSC);
iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START,
base_addr+S3C2410_ADCCON);
} else {
mod_timer(&touch_timer, jiffies+1);
iowrite32(WAIT4INT(1), base_addr+S3C2410_ADCTSC);
}
}
return IRQ_HANDLED;
}
static struct clk *adc_clock;
static int __init s3c2410ts_init(void)
{
struct input_dev *input_dev;
adc_clock = clk_get(NULL, 'adc');
if (!adc_clock) {
printk(KERN_ERR 'failed to get adc clock sourcen');
return -ENOENT;
}
clk_enable(adc_clock);
base_addr=ioremap(S3C2410_PA_ADC,0x20);
if (base_addr == NULL) {
printk(KERN_ERR 'Failed to remap register blockn');
return -ENOMEM;
}
/* Configure GPIOs */
s3c2410_ts_connect();
iowrite32(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF),
base_addr+S3C2410_ADCCON);
iowrite32(0xffff, base_addr+S3C2410_ADCDLY);
iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
/* Initialise input stuff */
input_dev = input_allocate_device();
if (!input_dev) {
printk(KERN_ERR 'Unable to allocate the input device !!n');
return -ENOMEM;
}
dev = input_dev;
dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);
dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);
input_set_abs_params(dev, ABS_X, 0, 0x3FF, 0, 0);
input_set_abs_params(dev, ABS_Y, 0, 0x3FF, 0, 0);
input_set_abs_params(dev, ABS_PRESSURE, 0, 1, 0, 0);
dev->name = s3c2410ts_name;
dev->id.bustype = BUS_RS232;
dev->id.vendor = 0xDEAD;
dev->id.product = 0xBEEF;
dev->id.version = S3C2410TSVERSION;
/* Get irqs */
if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED|IRQF_SAMPLE_RANDOM,
's3c2410_action', dev)) {
printk(KERN_ERR 's3c2410_ts.c: Could not allocate ts IRQ_ADC !n');
iounmap(base_addr);
return -EIO;
}
if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
's3c2410_action', dev)) {
printk(KERN_ERR 's3c2410_ts.c: Could not allocate ts IRQ_TC !n');
iounmap(base_addr);
return -EIO;
}
printk(KERN_INFO '%s successfully loadedn', s3c2410ts_name);
/* All went ok, so register to the input system */
input_register_device(dev);
return 0;
}
static void __exit s3c2410ts_exit(void)
{
disable_irq(IRQ_ADC);
disable_irq(IRQ_TC);
free_irq(IRQ_TC,dev);
free_irq(IRQ_ADC,dev);
if (adc_clock) {
clk_disable(adc_clock);
clk_put(adc_clock);
adc_clock = NULL;
}
input_unregister_device(dev);
iounmap(base_addr);
}
module_init(s3c2410ts_init);
module_exit(s3c2410ts_exit);

然后在linux-2.6.32.2/drivers/input/touchscreen/Makefile 文件中添加該源代碼的目標(biāo)模塊,如圖紅色部分:
obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE) += zylonite-wm97xx.o
obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o
obj-$(CONFIG_TOUCHSCREEN_PCAP) += pcap_ts.o
obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o


再打開linux-2.6.32.2/drivers/input/touchscreen/Kconfig 文件,加入如下紅色部分,這樣就在內(nèi)核配置中添加了mini2440 的觸摸屏驅(qū)動(dòng)選項(xiàng):

menuconfig INPUT_TOUCHSCREEN
bool 'Touchscreens'
help
Say Y here, and a list of supported touchscreens will be displayed.
This option doesn't affect the kernel.
If unsure, say Y.
if INPUT_TOUCHSCREEN
config TOUCHSCREEN_S3C2410
tristate 'Samsung S3C2410 touchscreen input driver'
depends on MACH_MINI2440 && INPUT && INPUT_TOUCHSCREEN && MINI2440_ADC
help
Say Y here if you have the s3c2410 touchscreen.
If unsure, say N.
To compile this driver as a module, choose M here: the
module will be called s3c2410_ts.
config TOUCHSCREEN_ADS7846
tristate 'ADS7846/TSC2046 and ADS7843 based touchscreens'
depends on SPI_MASTER
depends on HWMON = n || HWMON
help

至此,我們就已經(jīng)在內(nèi)核中添加完了觸摸屏驅(qū)動(dòng)。

2 配置編譯內(nèi)核并測(cè)試觸摸屏驅(qū)動(dòng)
在命令行執(zhí)行:make menuconfig,然后依次選擇如下子菜單,找到剛剛添加的觸摸屏驅(qū)動(dòng)選項(xiàng):
Device Drivers --->
Input device support --->
[*] Touchscreens --->
按空格鍵選中觸摸屏驅(qū)動(dòng)配置選項(xiàng):退出并保存以上內(nèi)核配置,在命令行輸入:make zImage,將生成arch/arm/boot/zImage文件,使用supervivi 的“k”命令把它燒寫到開發(fā)板。在此我們還是使用缺省的文件系統(tǒng)root_qtopia,可以看到屏幕上出現(xiàn)校正界面:依照屏幕提示,使用觸摸筆逐步點(diǎn)擊“十”型交叉點(diǎn),即可進(jìn)入qtopia 系統(tǒng)。

3、觸摸屏驅(qū)動(dòng)程序的詳細(xì)分析。

這個(gè)內(nèi)容由于較多,放在下一個(gè)文章里,見下鏈接。

linux-2.6.32在mini2440開發(fā)板上移植(10)之觸摸屏工作原理以及驅(qū)動(dòng)程序詳細(xì)分析。 http://www.linuxidc.com/Linux/2013-04/82383p10.htm


關(guān)鍵字:linux  mini2440  移植  觸摸屏驅(qū)動(dòng) 引用地址:linux-2.6.32在mini2440開發(fā)板上移植 添加觸摸屏驅(qū)動(dòng)程序

上一篇:linux-2.6.32在mini2440開發(fā)板上移植 添加ADC驅(qū)動(dòng)程序
下一篇:linux-2.6.32在mini2440開發(fā)板上移植-觸摸屏工作原理以及驅(qū)動(dòng)程序詳細(xì)分析

推薦閱讀最新更新時(shí)間:2025-04-24 12:22

Linux高級(jí)驅(qū)動(dòng)觸摸屏驅(qū)動(dòng)移植
觸摸屏驅(qū)動(dòng)的移植 流程 注意:看框架圖 1.添加input.c組件 Device Drivers --- Input device support --- Generic input layer (needed for keyboard, mouse, ...) 2.添加evdev.c組件 Device Drivers --- Input device support --- * Event interface 3.添加s3c2410_ts.c觸摸屏驅(qū)動(dòng) 修改driver/input/touchscreen/Kconfig config TOUCHSCREEN_S3C2410 tristate Samsun
[單片機(jī)]
linux-2.6.32在mini2440開發(fā)板上移植 移植看門狗驅(qū)動(dòng)
1 在內(nèi)核中配置看門狗驅(qū)動(dòng) Linux-2.6.32.2 內(nèi)核具有完善的S3C2440 的看夢(mèng)狗驅(qū)動(dòng),我們只需配置一下就可以使用 了。在內(nèi)核源代碼目錄執(zhí)行:make menuconfig,進(jìn)入內(nèi)核配置主菜單,依次選擇進(jìn)入如 下子菜單: Device Drivers --- Watchdog Timer Support --- 打開看門狗配置菜單,在這里可以選擇對(duì)S2C2410/2440 中看門狗的配置選項(xiàng)。 以上配置所對(duì)應(yīng)的驅(qū)動(dòng)源代碼為:linux-2.6.32.2/drivers/watchdog/s3c2410_wdt.c 2 測(cè)試看門狗 雖然友善之臂提供了一個(gè)漂亮的圖形界面的看門狗測(cè)
[單片機(jī)]
Mini2440 Linux 內(nèi)存布局
在學(xué)習(xí)linux內(nèi)存尋址的過程中,注意到在x86架構(gòu)上,分段與分頁機(jī)制共存。而在RSIC體系結(jié)構(gòu)下一般只支持分頁。《深入理解linux內(nèi)核》是在x86架構(gòu)上介紹的linux物理內(nèi)存布局。在x86架構(gòu)上,linux被安裝在ram從物理地址的0x00100000也就是第二個(gè)1M的地方。內(nèi)核態(tài)的線性地址:0xc0000000~0xffffffff,在內(nèi)核態(tài)可以尋址0x00000000~0xbfffffff的地址,用戶態(tài)的線性地址范圍為:0x00000000~0xbfffffff,用戶態(tài)的程序不能訪問內(nèi)核態(tài)的線性地址。這幾個(gè)是線性地址只是CPU尋址的時(shí)候用,最終都是要映射到實(shí)際的物理地址。在內(nèi)核鏡像包括代碼段,數(shù)據(jù)段。在數(shù)據(jù)段的后面保存了
[單片機(jī)]
S3C2440 觸摸屏驅(qū)動(dòng)(針對(duì)Android版)
和原來的觸摸屏驅(qū)動(dòng)區(qū)別不是很大,增加了report函數(shù)來將事件發(fā)送到應(yīng)用層。 驅(qū)動(dòng)結(jié)構(gòu): 很簡單的字符設(shè)備+平臺(tái)設(shè)備驅(qū)動(dòng),總的結(jié)構(gòu)來說,主要四個(gè)部分構(gòu)成: probe remove resume suspend 工作機(jī)制則是注冊(cè)設(shè)備,然后發(fā)生ts按下事件后產(chǎn)生ts中斷以及adc中斷,獲得按下坐標(biāo)。 沒有讀寫函數(shù),重點(diǎn)就是在兩個(gè)中斷處理函數(shù)上。 1,平臺(tái)設(shè)備架構(gòu)部分分析: probe函數(shù): 流程:ts基址的重映射- 獲得并啟動(dòng)時(shí)鐘- ADCCON、ADCDLY、ADCTSC的初始化- 初始化input設(shè)備完善ts結(jié)構(gòu)體- 建立ts_filter_chain- 申請(qǐng)中斷- 注冊(cè)input設(shè)備(2.6.27后為event0不再是ts0)
[單片機(jī)]
成功移植SQLite3到ARM Linux開發(fā)板
SQLite,是一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語言相結(jié)合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。 在開始之前,我們需要確認(rèn)有 SQLite3源碼包; 有交叉編譯環(huán)境; 有一塊開發(fā)板; 1、下載 SQLite3源碼 地址: http://www.sqlite.or
[單片機(jī)]
成功<font color='red'>移植</font>SQLite3到ARM <font color='red'>Linux</font>開發(fā)板
linux 調(diào)試之lrz的移植與一些說明
開發(fā)板:RT5350 編譯器:mipsel-linux-gcc ( 如果是arm平臺(tái)和arm_linux的話,請(qǐng)參照修改即可) 1.獲取源碼:lrzsz-0.12.20.tar.gz 2. 解壓: tar–xvf lrzsz-0.12.20.tar.gz 3.添加配置參數(shù): vi mipsel-linux.cache (默認(rèn)下沒有這個(gè)文件,因?yàn)樾陆ㄟ@個(gè)文件并打開,添加以下內(nèi)容) 添加內(nèi)容: ac_cv_prog_CC=${ac_cv_prog_CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc'} 備注一下: /opt/buildroot-gcc342/bin是mipse-l
[單片機(jī)]
<font color='red'>linux</font> 調(diào)試之lrz的<font color='red'>移植</font>與一些說明
嵌入式linux移植的理論問題
 ? 移植的基本概念:   移植是指將軟件從一個(gè)平臺(tái)遷移到另一個(gè)平臺(tái)   * 從一個(gè)硬件平臺(tái)移植到另一個(gè)硬件平臺(tái)   * 從一個(gè)操作系統(tǒng)移植到另一個(gè)操作系統(tǒng)   * 從一種軟件庫環(huán)境移植到另一個(gè)軟件庫環(huán)境   軟件進(jìn)行移植的容易程度即可移植性    Linux硬件平臺(tái):   在Linux內(nèi)核里,每一個(gè)處理器指令集對(duì)應(yīng)一個(gè)獨(dú)立的體系結(jié)構(gòu)architecture,比如alpha, arm,i386, mips, ppc   每個(gè)體系結(jié)構(gòu)可以有若干變種variant,或不同配置的硬件machine   統(tǒng)稱sub-architecture。以arm體系結(jié)構(gòu)舉例   * variants 包括arm7
[嵌入式]
基于PXA255的觸摸屏控制器ADS7843驅(qū)動(dòng)程序設(shè)計(jì)
在便攜式的電子類產(chǎn)品中,觸摸屏由于其便、靈活、占用空間少等優(yōu)點(diǎn),已經(jīng)逐漸取代鍵盤成為嵌入式計(jì)算機(jī)系統(tǒng)常選用的人機(jī)交互輸入設(shè)備。觸摸屏輸入系統(tǒng)由觸摸屏、觸摸屏控制器、微控制器及其相應(yīng)的驅(qū)動(dòng)程序構(gòu)成。本文從觸摸屏控制器的驅(qū)動(dòng)程序設(shè)計(jì)著手,介紹觸摸屏控制器ADS7843的內(nèi)部結(jié)構(gòu)及工作原理和在嵌入式Linux操作系統(tǒng)中基于PXA255微處理器的ADS7843驅(qū)動(dòng)程序設(shè)計(jì)。 1、觸摸屏控制器ADS7843的介紹 1.1 ADS7843的內(nèi)部結(jié)構(gòu) ADS7843 內(nèi)駐一個(gè)多路低導(dǎo)通電阻模擬開關(guān)組成的供電-測(cè)量電路網(wǎng)絡(luò)、12bit逐次逼近A/D轉(zhuǎn)換器和異步串行數(shù)據(jù)輸入輸出,ADS7843根據(jù)微控制器發(fā)來的不同測(cè)量命令導(dǎo)通相應(yīng)的模擬開關(guān),以便
[單片機(jī)]
基于PXA255的<font color='red'>觸摸屏</font>控制器ADS7843<font color='red'>驅(qū)動(dòng)</font>程序設(shè)計(jì)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 陇川县| 岐山县| 梁山县| 海林市| 尚义县| 汕尾市| 沙河市| 普宁市| 黔东| 察雅县| 白沙| 玉环县| 惠水县| 安新县| 延津县| 镇巴县| 彭阳县| 泰来县| 鹤壁市| 上思县| 陇南市| 东丽区| 延寿县| 兴国县| 天门市| 文山县| 合水县| 德令哈市| 榆社县| 乌拉特前旗| 霍城县| 南开区| 南郑县| 张家界市| 双柏县| 永吉县| 阿鲁科尔沁旗| 奈曼旗| 斗六市| 永仁县| 抚州市|