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

linux-2.6.32在mini2440開發板上移植 添加觸摸屏驅動程序

發布者:溫暖心情最新更新時間:2024-06-18 來源: elecfans關鍵字:linux  mini2440  移植  觸摸屏驅動 手機看文章 掃描二維碼
隨時隨地手機看文章

在內核中添加觸摸屏驅動程序

編者:linux2.6.32并沒有帶S3C2440觸摸屏驅動程序,需要自己實現。而在此的觸摸屏驅動程序時作為一個輸入設備來實現的。在linux中,對于輸入設備而言,內核專為其設計了輸入子系統,由核心層處理公共的工作。因為對于輸入設備而言,只是中斷、讀鍵值/坐標值是與設備相關的,其余的如輸入事件的緩沖區的管理以及字符設備驅動的file_operations接口則是輸入設備通用的。所以在此是在輸入子系統的框架下進行編寫觸摸屏驅動程序。對于這個驅動的移植以及講解,參考了網上的一些文章,一部分摒棄了手冊。

1 在內核中添加觸摸屏驅動程序

 Linux-2.6.32.2 內核也沒有包含支持S3C2440 的觸摸屏驅動,因此我們自行設計了一個s3c2410_ts.c,它位于linux-src/drivers/input/touchscreen 目錄下,你可以自己增加一個s3c2410_ts.c 文件,并復制如下內容:

#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 文件中添加該源代碼的目標模塊,如圖紅色部分:
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 文件,加入如下紅色部分,這樣就在內核配置中添加了mini2440 的觸摸屏驅動選項:

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

至此,我們就已經在內核中添加完了觸摸屏驅動。

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

3、觸摸屏驅動程序的詳細分析。

這個內容由于較多,放在下一個文章里,見下鏈接。

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


關鍵字:linux  mini2440  移植  觸摸屏驅動 引用地址:linux-2.6.32在mini2440開發板上移植 添加觸摸屏驅動程序

上一篇:linux-2.6.32在mini2440開發板上移植 添加ADC驅動程序
下一篇:linux-2.6.32在mini2440開發板上移植-觸摸屏工作原理以及驅動程序詳細分析

推薦閱讀最新更新時間:2025-05-15 21:41

Linux下的觸摸屏驅動
一.觸摸屏理論概述 對于觸摸屏驅動,我們主要需要掌握觸摸屏驅動代碼和應用層測試代碼。下面講的是基于Mini2440的觸摸屏驅動,現在的驅動我們都將設備和驅動分離,掛在平臺設備總線上,讓設備和驅動去匹配。而我們在linu2.6.32.2內核版本中的觸摸屏驅動仍然沒有將設備和驅動分離,這樣就不存在匹配問題,這種現象其實我們并不陌生,在我們學習驅動的前期,都會研究簡單字符驅動代表LED驅動,那個驅動就是把設備和驅動寫在了一起。總結下,驅動和設備可以分離也可以不分離,建議分離,而本觸摸屏驅動沒有分離設備和驅動,有興趣可以將設備和驅動進行分離。 先說明下觸摸屏的工作原理,當有人在觸摸屏上按下觸筆時,觸摸屏的四個引腳會產生不同的電壓值,這
[單片機]
u-boot-2011.03在mini2440/micro2440上的移植 支持Nand Flash
5.1 添加s3c2440_nand.c $ touch drivers/mtd/nand/s3c2440_nand.c $ cat drivers/mtd/nand/s3c2440_nand.c #include common.h #if 0 #define DEBUGN printf #else #define DEBUGN(x, args ...) {} #endif #include nand.h #include asm/arch/s3c24x0_cpu.h #include asm/io.h #define __REGb(x) (*(volatile unsigned char *)(x)) #define
[單片機]
u-boot-2011.03在<font color='red'>mini2440</font>/micro2440上的<font color='red'>移植</font> 支持Nand Flash
Sqlite移植mini2440
一、開發環境: Mini2440, Linux_2.6.32.2內核, Fedora 9 arm-linux-gcc-4.3.3 二、移植步驟 下載源碼 http://www.sqlite.org/sqlite-autoconf-3070701.tar.gz 為3.7.7.1版 1.解壓數據庫源文件并進入解壓后的目錄,如下: tar -zxvf sqlite-autoconf-3070701.tar.gz cd sqlite-autoconf-3070701 2.創建一個目錄build并進入該目錄,用于在這個目錄中進行交叉編譯,如下: mkdir build cd build 3.在build目錄中運行sqlite-au
[單片機]
mini2440)建立交叉編譯環境+配置linux內核
系統ubuntu12.04(非虛擬機下) mini2440 CPU型號:S3C2440AL-40 Nandflash型號:K9F1G08 Norflash型號:SST39VF1601 LCD:統寶 240 x 320 $:普通賬戶 #:root賬戶 *當shell下輸入路徑時可使用tab鍵自動補全 (一)建立交叉編譯環境 1.將mini2440光盤中的linux文件夾拷貝到 /home/lianghuiyong 并改名為Linux_share (其中兩個文檔為我后面添加進去的) 2.Ctrl+Alt+T打開shell 3.$ su - root (切換root權限) 4.# cd /home/lianghuiyong/
[單片機]
(<font color='red'>mini2440</font>)建立交叉編譯環境+配置<font color='red'>linux</font>內核
[Linux 底層]bootstrap移植裁剪及編譯
bootstrap文件夾內容如下圖: 在board/sama5d3_xplained目錄下,有官方的默認配置文件 sama5d3_xplainednf_linux_uimage_dt_defconfig 從nandflash啟動直接跳轉到uimage類型內核階段 sama5d3_xplainednf_linux_zimage_dt_defconfig 從nandflash啟動直接跳轉到zimage類型內核階段 sama5d3_xplainednf_uboot_defconfig 從nandflash啟動直接跳轉到uboot階段 sama5d3_xplainedsd_linux_uimage_dt_defconfig 從SD
[單片機]
[<font color='red'>Linux</font> 底層]bootstrap<font color='red'>移植</font>裁剪及編譯
05-S3C2440學習之內核(移植linux3.4.2移植(1) 簡單移植+修改MTD分區+制作jffs2文件系統
一、框架介紹及簡單修改 1.1 Bootloader如何引導內核 Bootloader的工作: (1)講內核讀入內存中 (2)存一些內核啟動參數到指定位置,內核啟動時去解析 (3)啟動內核,傳入機器ID 1.2、內核的啟動流程: 首先 內核的最終目的是掛接根文件系統,并啟動應用程序。 想啟動應用程序—需要掛接根文件系統—裝載驅動程序(flash、網卡)--要解析參數(文件系統在哪)--根據R1判斷內核是否支持該ID—支持調用初始化相關函數 每個開發板都有不同的硬件參數 內核移植過程中要決定我這個內核支持哪些硬件開發板 我在內核里針對這個開發板給他一個ID。Uboot啟動的時候傳入和內核中設置好的匹配
[單片機]
05-S3C2440學習之內核(<font color='red'>移植</font>)<font color='red'>linux</font>3.4.2<font color='red'>移植</font>(1) 簡單<font color='red'>移植</font>+修改MTD分區+制作jffs2文件系統
Linux2.6內核驅動移植參考
Linux2.6內核驅動移植參考 作者:晏渭川 隨著Linux2.6的發布,由于2.6內核做了教的改動,各個設備的驅動程序在不同程度上要 進行改寫。為了方便各位Linux愛好者我把自己整理的這分文檔share出來。該文當列舉 了2.6內核同以前版本的絕大多數變化,可惜的是由于時間和精力有限沒有詳細列出各個 函數的用法。 特別聲明:該文檔中的內容來自http:/lwn.net,該網也上也有各個函數的較為詳細的 說明可供各位參考。如果需要該文檔的word版的朋友, 請mail到weiriver@sohu.com索 取。 1、 使用新的入口 必須包含 linux/init.h module_init(your_init_
[嵌入式]
mini2440上Apache php的socket通信
server.php ?php //確保在連接客戶端時不會超時 set_time_limit(0); //設置IP和端口號 $address='127.0.0.1'; $port=2009; //調試的時候,可以多換端口來測試程序! //創建一個SOCKET if(($sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) 0) { echo socket_create() 失敗的原因是: .socket_strerror($sock). br ; } //綁定到socket端口 if
[單片機]
<font color='red'>mini2440</font>上Apache php的socket通信
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 黄骅市| 乃东县| 石楼县| 临泽县| 江油市| 利川市| 黑水县| 太谷县| 峨眉山市| 宁明县| 抚松县| 江阴市| 温宿县| 青河县| 乌兰浩特市| 朝阳县| 苍梧县| 清原| 灵武市| 四平市| 郁南县| 尼玛县| 岳阳市| 象州县| 凌源市| 鄄城县| 长海县| 浠水县| 耿马| 甘泉县| 巴南区| 揭阳市| 岐山县| 鸡西市| 南乐县| 临沧市| 广昌县| 应用必备| 巴林左旗| 肃北| 永城市|