文档库 最新最全的文档下载
当前位置:文档库 › 敦泰电容屏芯片FT5X06 IIC参考驱动

敦泰电容屏芯片FT5X06 IIC参考驱动

敦泰电容屏芯片FT5X06 IIC参考驱动
敦泰电容屏芯片FT5X06 IIC参考驱动

敦泰电容屏芯片FT5X06 IIC参考驱动(1)发布时间:2012-04-18 10:29:43 [cpp] view plaincopyprint?

static void ft5x0x_ts_release(void)

{

struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);

#ifdef FT5X0X_MULTI_TOUCH

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, 0);

input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, 0);

input_report_key(data->input_dev, BTN_TOUCH, 0);

#else

input_report_abs(data->input_dev, ABS_PRESSURE, 0);

input_report_key(data->input_dev, BTN_TOUCH, 0);

#endif

input_sync(data->input_dev);

}

static int ft5x0x_read_data(void)

{

struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);

struct ts_event *event = &data->event;

u32 buf[32] = {0};

int ret = -1;

#ifdef FT5X0X_MULTI_TOUCH

ret = ft5x0x_i2c_rxdata(buf, 31);

#else

ret = ft5x0x_i2c_rxdata(buf, 7);

#endif

if (ret < 0) {

printk("%s read_data i2c_rxdata failed: %d\n", __func__, ret);

}

memset(event, 0, sizeof(struct ts_event));

event->touch_point = buf[2] & 0x07;

if (event->touch_point == 0) {

ft5x0x_ts_release();

return 1;

}

#ifdef FT5X0X_MULTI_TOUCH

switch (event->touch_point) {

case 5:

event->x5 = (s16)(buf[0x1b] & 0x0F)<<8 | (s16)buf[0x1c];

event->y5 = (s16)(buf[0x1d] & 0x0F)<<8 | (s16)buf[0x1e];

case 4:

event->x4 = (s16)(buf[0x15] & 0x0F)<<8 | (s16)buf[0x16];

event->y4 = (s16)(buf[0x17] & 0x0F)<<8 | (s16)buf[0x18];

case 3:

event->x3 = (s16)(buf[0x0f] & 0x0F)<<8 | (s16)buf[0x10];

event->y3 = (s16)(buf[0x11] & 0x0F)<<8 | (s16)buf[0x12];

case 2:

event->x2 = (s16)(buf[9] & 0x0F)<<8 | (s16)buf[10];

event->y2 = (s16)(buf[11] & 0x0F)<<8 | (s16)buf[12];

case 1:

event->x1 = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4];

event->y1 = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6];

break;

default:

return -1;

}

#else

if (event->touch_point == 1) {

event->x1 = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4];

event->y1 = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6];

}

#endif

event->pressure = 200;

return 0;

}

static void ft5x0x_reprot_value(void)

{

struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client);

struct ts_event *event = &data->event;

#ifdef FT5X0X_MULTI_TOUCH

switch(event->touch_point) {

case 5:

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);

input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->x5);

input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->y5);

input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);

input_mt_sync(data->input_dev);

case 4:

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);

input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->x4);

input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->y4);

input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);

input_mt_sync(data->input_dev);

case 3:

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);

input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->x3);

input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->y3);

input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);

input_mt_sync(data->input_dev);

case 2:

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);

input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->x2);

input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->y2);

input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);

input_mt_sync(data->input_dev);

case 1:

input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->pressure);

input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->x1);

input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->y1);

input_report_abs(data->input_dev, ABS_MT_WIDTH_MAJOR, event->pressure);

input_mt_sync(data->input_dev);

break;

default:

break;

}

#else

if (event->touch_point == 1) {

input_report_abs(data->input_dev, ABS_X, event->x1);

input_report_abs(data->input_dev, ABS_Y, event->y1);

input_report_abs(data->input_dev, ABS_PRESSURE, event->pressure);

}

input_report_key(data->input_dev, BTN_TOUCH, 1);

#endif

input_sync(data->input_dev);

//摘自:https://www.wendangku.net/doc/dc6816696.html,/sunsea1026/article/details/7415803

static void ft5x0x_ts_pen_irq_work(struct work_struct *work)

{

int ret = -1;

ret = ft5x0x_read_data();

if (ret == 0)

ft5x0x_report_value();

}

static interrupt_r ft5x0x_ts_interrupt(int irq, void *dev_id)

{

struct ft5x0x_ts_data *ft5x0x_ts = dev_id;

if (!work_pending(&ft5x0x_ts->pen_irq_work))

queue_work(ft5x0x_ts->ts_workqueue, &ft5x0x_ts->pen_irq_work);

return IRQ_HANDLED;

}

#ifdef CONFIG_HAS_EARLYSUSPEND

static void ft5x0x_ts_suspend(struct early_suspend *handler)

{

struct ft5x0x_ts_data *ft5x0x_ts;

ts = container_of(handler, struct ft5x0x_ts_data, early_suspend);

disable_irq(this_client->irq);

cancel_workqueue(ft5x0x_ts->pen_irq_work);

flush_workqueue(ft5x0x_ts->ts_workqueue);

ft5x0x_write_reg(FT5X0X_REG_PMODE, PMODE_MONITOR);

printk("[FST] %s\n", __func__);

}

static void ft5x0x_ts_resume(struct early_suspend *handler)

{

ventana_touchscreen_reset();

enable_irq(this_client->irq);

ft5x0x_write_reg(FT5X0X_REG_PMODE, PMODE_ACTIVE);

printk("[FST] %s\n", __func__);

}

#endif

static int ft5x0x_ts_probe(struct i2c_client *client, const struct i2c_device_id, *id) {

int err = 0;

struct ft5x0x_ts_data *ft5x0x_ts;

struct input_dev *input_dev;

if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {

err = -ENODEV;

goto exit_i2c_check_functionality;

}

ft5x0x_ts = kzalloc(sizeof(ft5x0x_ts_data), GPL_KERNEL);

if (!ft5x0x_ts) {

err = -ENOMEM;

goto exit_alloc_data;

}

this_client = client;

i2c_set_clientdata(client, ft5x0x_ts);

INIT_WORK(&ft5x0x_ts->pen_event_work, ft5x0x_ts_pen_irq_work);

ft5x0x_ts->ts_workqueue = create_siglethread_workqueue(dev_name(&client->dev));

if (!ft5x0x_ts->ts_workqueue) {

err = -ESRCH;

goto exit_create_siglethread;

}

err = request_irq(client->irq, ft5x0x_ts_interrupt, IRQF_TRIGGER_FALLING, "ft5x0x-irq", ft5x0x_ts);

if (err < 0) {

dev_err(&client->dev, "ft5x0x_ts_probe: request irq failed\n");

goto exit_irq_request;

}

disable_irq(this_client-irq);

input_dev = input_allocate_device();

if (!input_dev) {

err = -ENOMEM;

dev_err(&client-dev, "ft5x0x_ts_probe: failed alloc input device\n");

}

ft5x0x_ts->input_dev = input_dev;

input_dev->name = FT5X0X_NAME;

set_bit(EV_ABS, input_dev->evbit);

set_bit(EV_KEY, input_dev->evbit);

set_bit(BTN_TOUCH, input_dev->keybit);

#ifdef FT5X0X_MULTI_TOUCH

set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit);

set_bit(ABS_MT_POSITION_X, input_dev->absbit);

set_bit(ABS_MT_POSITION_Y, input_dev->absbit);

set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit);

input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, SCREEN_MAX_X, 0, 0);

input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);

input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, PRESS_MAX, 0, 0);

input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0);

#else

set_bit(ABS_X, input_dev->absbit);

set_bit(ABS_Y, input_dev->absbit);

set_bit(ABS_PRESSURE, input_dev->absbit);

set_bit(BTN_TOUCH, input_dev->keybit);

input_set_abs_params(input_dev, ABS_X, 0, SCREEN_MAX_X, 0, 0);

input_set_abs_params(input_dev, ABS_Y, 0, SCREEN_MAX_Y, 0, 0);

input_set_abs_params(input_dev, ABS_PRESSURE, 0, PRESS_MAX, 0 , 0);

err = input_register_device(input_dev);

if (err) {

dev_err(&client->dev, "ft5x0x_ts_probe: failed to register input device: %s\n", dev_name(&client->dev));

goto exit_input_register_device;

}

#endif

#ifdef CONFIG_HAS_EARLYSUSPEND

ft5x0x_ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;

ft5x0x_ts->early_suspend.suspend = ft5x0x_ts_suspend;

ft5x0x_ts->early_suspend.resume = ft5x0x_ts_resume;

register_early_suspend(ft5x0x_ts->early_suspend);

#endif

msleep(50);

//Get some register information

uc_reg_value = ft5x0x_read_fw_ver();

printk("[FST] Firmware version = 0x%sx\n", uc_reg_value);

//Auto calibration

err = ft5x0x_write_reg(CALIBRATION_REG, 0x00);

if (err)

printk("[FST] Auto calibration failed.\n");

else

printk("[FST] Auto calibration successfully.\n");

//Config the run mode of TPM, reg - 0xa7 : auto calibration - 0x04 ft5x0x_write_reg(FT5X0X_REG_STATE, 0x00);

printk("[FST] Auto calibration during running.\n");

enable_irq(this_client->irq);

return 0;

exit_input_register_device:

input_free_device(input_dev);

exit_alloc_data:

free_irq(client->irq, ft5x0x_ts);

exit_irq_request:

exit_create_siglethread:

i2c_set_clientdata(client, NULL);

exit_alloc_data:

exit_i2c_check_functionality:

return err;

}

static int __devexit ft5x0x_ts_remove(struct i2c_client *client)

{

struct ft5x0x_ts_data *ft5x0x_ts = i2c_get_clientdata(client);

#ifdef CONFIG_HAS_EARLYSUSPEND

unregister_early_suspend(&ft5x0x_ts->early_suspend);

#endif

free_irq(client->irq, ft5x0x_ts);

input_unregister_device(ft5x0x_ts->input_dev);

kfree(ft5x0x_ts);

cancel_work_sync(&ft5x0x_ts->pen_event_work);

destroy_workqueue(ft5x0x_ts->ts_workqueue);

i2c_set_cleintdata(client, NULL);

return 0;

}

static const struct i2c_device_id ft5x0x_ts_id[] = { {FT5X0X_NAME, 0}

};

MODULE_DEVICE_TABLE(i2c, ft5x0x_id);

static struct i2c_driver ft5x0x_ts_driver = {

.probe = ft5x0x_ts_probe,

.remove = __devexit_p(ft5x0x_ts_remove),

.id_table = ft5x0x_ts_id,

.driver = {

.name = FT5X0X_TS,

.owner = THIS_MODULE,

},

};

static int __init ft5x0x_ts_init(void)

{

int ret;

ret = i2c_add_driver(&ft5x0x_ts_driver);

return ret;

}

static void __exit ft5x0x_ts_exit(void)

{

i2c_delete_driver(&ft5x0x_ts_driver);

}

module_init(ft5x0x_ts_init);

module_exit(ft5x0x_ts_exit);

/* drivers/input/touchscreen/ft5x06_i2c_ts.c

*

* Copyright (C) 2010 Pixcir, Inc.

*

* ft5x06_i2c_ts.c V1.0 support multi touch

* ft5x06_i2c_ts.c V1.5 add Calibration function:

*

* CALIBRATION_FLAG 1

*

* This software is licensed under the terms of the GNU General Public

* License version 2, as published by the Free Software Foundation, and

* may be copied, distributed, and modified under those terms.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public

* License along with this library; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "ft5x06_i2c_ts.h"

#define DRIVER_VERSION "v1.0"

#define DRIVER_AUTHOR "Sunyard"

#define DRIVER_DESC "Ft5x06 I2C Touchscreen Driver with tune fuction"

#define DRIVER_LICENSE "GPL"

struct input_dev *keyboard = NULL; EXPORT_SYMBOL(keyboard);

#define FT5X06_DEBUG 0

#define SLAVE_ADDR 0x38

#ifndef I2C_MAJOR

#define I2C_MAJOR 125

#endif

#define I2C_MINORS 256

#define CALIBRATION_FLAG 1

int tsp_keycodes[4] ={

KEY_F4,

KEY_F5,

KEY_F6,

KEY_F7

};

static unsigned char status_reg = 0;

struct i2c_dev

{

struct list_head list;

struct i2c_adapter *adap;

struct device *dev;

};

static struct i2c_driver ft5x06_i2c_ts_driver; static struct class *i2c_dev_class;

static LIST_HEAD( i2c_dev_list);

static DEFINE_SPINLOCK( i2c_dev_list_lock);

static void return_i2c_dev(struct i2c_dev *i2c_dev)

{

spin_lock(&i2c_dev_list_lock);

list_del(&i2c_dev->list);

spin_unlock(&i2c_dev_list_lock);

kfree(i2c_dev);

}

static struct i2c_dev *i2c_dev_get_by_minor(unsigned index) {

struct i2c_dev *i2c_dev;

i2c_dev = NULL;

spin_lock(&i2c_dev_list_lock);

list_for_each_entry(i2c_dev, &i2c_dev_list, list)

{

if (i2c_dev->adap->nr == index)

goto found;

}

i2c_dev = NULL;

found: spin_unlock(&i2c_dev_list_lock);

return i2c_dev;

}

static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap) {

struct i2c_dev *i2c_dev;

if (adap->nr >= I2C_MINORS)

{

printk(KERN_ERR "i2c-dev: Out of device minors (%d)\n",

adap->nr);

return ERR_PTR(-ENODEV);

}

i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL);

if (!i2c_dev)

return ERR_PTR(-ENOMEM);

i2c_dev->adap = adap;

spin_lock(&i2c_dev_list_lock);

list_add_tail(&i2c_dev->list, &i2c_dev_list);

spin_unlock(&i2c_dev_list_lock);

return i2c_dev;

}

/*********************************V2.0-Bee-0928-BOTTOM************************* ***************/

static struct workqueue_struct *ft5x06_wq;

struct ft5x06_i2c_ts_data

{

struct i2c_client *client;

struct input_dev *input;

struct delayed_work work;

int irq;

};

static void ft5x06_ts_poscheck(struct work_struct *work)

{

struct ft5x06_i2c_ts_data *tsdata = container_of(work,

struct ft5x06_i2c_ts_data,

work.work);

int touch_event;

int posx1, posy1;

unsigned char Rdbuf[7],auotpnum[1],Wrbuf[1];

static int key_id=0x80;

int i,ret;

Wrbuf[0] = 0;

ret = i2c_master_send(tsdata->client, Wrbuf, 1);

#if FT5X06_DEBUG

printk("master send ret:%d\n",ret);

#endif

if (ret != 1)

{

#if FT5X06_DEBUG

dev_err(&tsdata->client->dev, "Unable to write to i2c touchscreen!\n");

#endif

goto out;

}

ret = i2c_master_recv(tsdata->client, Rdbuf, sizeof(Rdbuf));

if (ret != sizeof(Rdbuf))

{

dev_err(&tsdata->client->dev, "Unable to read i2c page!\n");

goto out;

}

posx1 = (( (Rdbuf[3] & 0x0f )<< 8) | Rdbuf[4]);

posy1 = (( (Rdbuf[5] & 0x0f )<< 8) | Rdbuf[6]);

touch_event = Rdbuf[3] & 0xc0;

if (touch_event == 0x80)

{

if (posy1 > 0 && posy1 < 800)

{

input_report_abs(tsdata->input, ABS_X, posx1);

input_report_abs(tsdata->input, ABS_Y, posy1);

input_report_key(tsdata->input, BTN_TOUCH, 1);

input_report_abs(tsdata->input, ABS_PRESSURE, 1);

}

else if(posy1>=840 && posy1<=850 && keyboard)

{

if (posx1 > 45 && posx1 < 51)

{

key_id = 0;

}

else if ( posx1 > 205 && posx1 < 211)

{

key_id = 1;

}

else if (posx1 > 269 && posx1 < 275 )

{

key_id = 2;

}

else if ( posx1 > 397 && posx1 < 403)

{

key_id = 3;

}

input_report_key(keyboard, tsp_keycodes[key_id], 1);

}

}

else if (touch_event == 0x40)

{

if(key_id !=0x80 && keyboard)

{

i=key_id;

for(i=0;i<4;i++);

input_report_key(keyboard, tsp_keycodes[key_id], 0);

key_id=0x80;

}

input_report_key(tsdata->input, BTN_TOUCH, 0);

input_report_abs(tsdata->input, ABS_PRESSURE, 0);

}

input_sync(tsdata->input);

out: enable_irq(tsdata->irq);

}

static irqreturn_t ft5x06_ts_isr(int irq, void *dev_id)

{

struct ft5x06_i2c_ts_data *tsdata = dev_id;

disable_irq_nosync(irq);

queue_work(ft5x06_wq, &tsdata->work.work);

return IRQ_HANDLED;

}

static int ft5x06_i2c_ts_probe(struct i2c_client *client,

const struct i2c_device_id *id)

{

struct ft5x06_i2c_ts_data *tsdata;

struct input_dev *input;

struct device *dev;

struct i2c_dev *i2c_dev;

int error;

int ret;

s3c_gpio_cfgpin(S3C64XX_GPK(15), S3C_GPIO_SFN(1));

s3c_gpio_setpull(S3C64XX_GPK(15), S3C_GPIO_PULL_UP);

ret = s3c_gpio_setpin(S3C64XX_GPK(15),1);

udelay(1000);

ret = s3c_gpio_setpin(S3C64XX_GPK(15),0);

udelay(1000);

s3c_gpio_setpin(S3C64XX_GPK(15),1);

tsdata = kzalloc(sizeof(*tsdata), GFP_KERNEL);

if (!tsdata)

{

dev_err(&client->dev, "failed to allocate driver data!\n");

error = -ENOMEM;

goto exit_alloc_data_failed;

}

dev_set_drvdata(&client->dev, tsdata);

input = input_allocate_device();

if (!input)

{

dev_err(&client->dev, "failed to allocate input device!\n");

error = -ENOMEM;

goto exit_input_dev_alloc_failed;

}

set_bit(EV_SYN, input->evbit);

set_bit(EV_KEY, input->evbit);

set_bit(EV_ABS, input->evbit);

set_bit(BTN_TOUCH, input->keybit);

input_set_abs_params(input, ABS_X, TOUCHSCREEN_MINX, TOUCHSCREEN_MAXX, 0, 0); input_set_abs_params(input, ABS_Y, TOUCHSCREEN_MINY, TOUCHSCREEN_MAXY, 0, 0);

input_set_abs_params(input,ABS_PRESSURE,0,1,0,0);

input->name = client->name;

input->id.bustype = BUS_I2C;

input->dev.parent = &client->dev;

input_set_drvdata(input, tsdata);

tsdata->client = client;

tsdata->input = input;

INIT_WORK(&tsdata->work.work, ft5x06_ts_poscheck);

tsdata->irq = client->irq;

error = input_register_device(input);

if (error){

dev_err(&client->dev, "failed to register input device!\n");

goto exit_input_register_device_failed;

}

error = request_irq(tsdata->irq, ft5x06_ts_isr, IRQF_TRIGGER_FALLING,client->name, tsdata);

if (error)

{

dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");

goto exit_irq_request_failed;

}

device_init_wakeup(&client->dev, 1);

/*********************************V2.0-Bee-0928-TOP************************* ***************/

i2c_dev = get_free_i2c_dev(client->adapter);

if (IS_ERR(i2c_dev))

{

error = PTR_ERR(i2c_dev);

goto out;

}

/*********************************V2.0-Bee-0928-BOTTOM********************* *******************/

dev_err(&tsdata->client->dev, "insmod successfully!\n");

return 0;

out:

free_irq(tsdata->irq, tsdata);

exit_irq_request_failed:

exit_input_register_device_failed:

input_free_device(input);

exit_input_dev_alloc_failed:

kfree(tsdata);

exit_alloc_data_failed:

return error;

static int ft5x06_i2c_ts_remove(struct i2c_client *client)

{

int error;

struct i2c_dev *i2c_dev;

struct ft5x06_i2c_ts_data *tsdata = dev_get_drvdata(&client->dev);

free_irq(tsdata->irq, tsdata);

/*********************************V2.0-Bee-0928-TOP************************* ***************/

i2c_dev = get_free_i2c_dev(client->adapter);

if (IS_ERR(i2c_dev))

{

error = PTR_ERR(i2c_dev);

return error;

}

return_i2c_dev(i2c_dev);

device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, client->adapter->nr));

/*********************************V2.0-Bee-0928-BOTTOM********************* *******************/

input_unregister_device(tsdata->input);

kfree(tsdata);

dev_set_drvdata(&client->dev, NULL);

return 0;

}

static int ft5x06_i2c_ts_suspend(struct i2c_client *client, pm_message_t mesg)

{

struct ft5x06_i2c_ts_data *tsdata = dev_get_drvdata(&client->dev);

disable_irq(tsdata->irq);

return 0;

}

static int ft5x06_i2c_ts_resume(struct i2c_client *client)

{

struct ft5x06_i2c_ts_data *tsdata = dev_get_drvdata(&client->dev);

enable_irq(tsdata->irq);

return 0;

}

static const struct i2c_device_id ft5x06_i2c_ts_id[] =

{

{ "ft5x06", 0 },

{ }

};

MODULE_DEVICE_TABLE( i2c, ft5x06_i2c_ts_id);

static struct i2c_driver ft5x06_i2c_ts_driver =

{ .driver =

{

.owner = THIS_MODULE,

.name = "ft5x06_i2c_ts_driver",

},

.probe = ft5x06_i2c_ts_probe,

.remove = ft5x06_i2c_ts_remove,

.suspend = ft5x06_i2c_ts_suspend,

.resume = ft5x06_i2c_ts_resume,

.id_table = ft5x06_i2c_ts_id,

};

static int __init ft5x06_i2c_ts_init(void)

{

int ret;

ft5x06_wq = create_singlethread_workqueue("ft5x06_wq");

if(!ft5x06_wq)

return -ENOMEM;

i2c_dev_class = class_create(THIS_MODULE, "ft5x06_i2c_dev");

if (IS_ERR(i2c_dev_class))

{

ret = PTR_ERR(i2c_dev_class);

class_destroy(i2c_dev_class);

}

/********************************V2.0-Bee-0928-BOTTOM********************** ********************/

return i2c_add_driver(&ft5x06_i2c_ts_driver);

}

static void __exit ft5x06_i2c_ts_exit(void)

{

i2c_del_driver(&ft5x06_i2c_ts_driver);

/********************************V2.0-Bee-0928-TOP************************** ****************/

class_destroy(i2c_dev_class);

unregister_chrdev(I2C_MAJOR,"ft5x06_i2c_ts");

/********************************V2.0-Bee-0928-BOTTOM********************** ********************/

if(ft5x06_wq)

destroy_workqueue(ft5x06_wq);

}

MODULE_AUTHOR(DRIVER_AUTHOR);

MODULE_DESCRIPTION(DRIVER_DESC);

MODULE_LICENSE(DRIVER_LICENSE);

module_init( ft5x06_i2c_ts_init);

module_exit( ft5x06_i2c_ts_exit);

/*****************touchscreen resolution setting*************/

#define R8C_3GA_2TG

//#define R8C_AUO_I2C

#ifdef R8C_AUO_I2C

#ifndef R8C_3GA_2TG

#define R8C_3GA_2TG

#endif

#endif

#define TOUCHSCREEN_MINX 0

#define TOUCHSCREEN_MAXX 800

#define TOUCHSCREEN_MINY 0

#define TOUCHSCREEN_MAXY 480

常见液晶驱动芯片详解

因此各位朋友在选择LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制IC的型号来判别,当然你还需要看你选择的LCD模块引脚定义是固定支持并行,还是可选择并行或串行的方式。 一、字符型LCD驱动控制IC 市场上通用的8×1、8×2、16×1、16×2、16×4、20×2、20×4、40×4等字符型LCD,基本上都采用的KS0066作为LCD的驱动控制器 二、图形点阵型LCD驱动控制IC 1、点阵数122×32--SED1520 2、点阵数128×64 (1)ST7920/ST7921,支持串行或并行数据操作方式,内置中文汉字库 (2)KS0108,只支持并行数据操作方式,这个也是最通用的12864点阵液晶的驱动控制IC (3)ST7565P,支持串行或并行数据操作方式 (4)S6B0724,支持串行或并行数据操作方式 (5)T6963C,只支持并行数据操作方式 3、其他点阵数如192×6 4、240×64、320×64、240×128的一般都是采用T6963c驱动控制芯片 4、点阵数320×240,通用的采用RA8835驱动控制IC 这里列举的只是一些常用的,当然还有其他LCD驱动控制IC,在写LCD驱动时要清楚是哪个型号的IC,再到网上去寻找对应的IC数据手册吧。后面我将慢慢补上其它一些常见的. 三 12864液晶的奥秘 CD1601/1602和LCD12864都是通常使用的液晶,有人以为12864是一个统一的编号,主要是12864的液晶驱动都是一样的,其实12864只是表示液晶的点阵是128*64点阵,而实际的12864有带字库的,也有不带字库的;有5V电压的,也有~5V(内置升压电路);归根到底的区别在于驱动控制芯片,常用的控制芯片有ST7920、KS0108、T6963C等等。 下面介绍比较常用的四种 (1)ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。该类液晶支持68时序8位和4位并口以及串口。 (2)KS0108类这种控制器指令简单,不带字库。支持68时序8位并口。 (3)T6963C类这种控制器功能强大,带西文字库。有文本和图形两种显示方式。有文本和图形两个图层,并且支持两个图层的叠加显示。支持80时序8位并口。 (4)COG类常见的控制器有S6B0724和ST7565,这两个控制器指令兼容。支持68时序8位并口,80时序8位并口和串口。COG类液晶的特点是结构轻便,成本低。 各种控制器的接口定义: 引脚定义

固态电容全面分析

四:固态电容全面分析 第一点,固态电容为高频电解电容,受此范围限制,高频电容普遍容量做的都不高,固态电容在耐压超过16V后容量显著减小,到20V 为330UF,25V,35V均为220UF。50V56UF,63V39UF。高频电容还有一点就是在低频情况下,性能不太好,阻抗很大,工作频率在100KHz 到300KHz效果最理想。第二点,固态电容受体积限制,不同于铝电解,体积可以理论上无限大,而且由于技术材料不同,最高电压仅63V。最低电压2.5V。所以限制了很多的用途,比如电源的输入端无法选用。第三点,固态电容成本高,是铝电解电容的数倍。材料工艺各不相同,而且没有全球化大规模的生产,目前全球生产厂家大约在10-15家。量没走的上去,成本高是在所难免的。第四点,关于固态电容的选型。滤高频的情况下,固态电容的容量可以选择液态铝电解容量的1/4到1/5。电压无须抛高。例如工作电压2.4V纹波电压不超过2.8V就可以选用2.5V的固态电容,如果纹波电压超过2.8V就要选用4V的了。不过选型毫无疑问也是受到实际线路板的设计限制,具体情况具体分析。第五点,固态电容的寿命问题。固态电容的标准寿命为105度2000H,95度6600小时,85度20000H,75度66000H,65度200000H。20万小时超过20年。第六点,固态电容的温度特性。固态电容耐温性能非常良好,由于内部电解质为固体,没有电解液的沸点,冰点等诸多问题,永不爆浆。而且更加耐高低温,在温度105度工作环境下,依然运行良好,-55度时依然能够工作,容量损失不大。 固态电容的PEDT专利到期,固态电容可望取代传统电容 综合媒体报道,台湾铝质电解电容器厂商近几年来都积极投入固态电容研发制造行列,不过由于桌面计算机需求减缓、日系厂商产能大增之下,固态电容器价格竞争转趋激烈,台系厂商虽仍具备价格优势,但是还是不如国内固态电容生产厂家,而各家厂家都在上游介电材料PEDT专利到期后(上游关键原料PEDT专利原掌握在德国H.C.Strack公司 ,过去为拜耳子公司,2007年售予凯雷集团),固态电容价格也更加平民化,进而取代传统铝质电容市场,台系厂商和中国大陆厂商或能抢得一席之地,占领一部分日系固态电容厂家的市场份额。固态电容主要是为解决传统铝电解电容器遇高热出现爆浆的问题,在下游应用端如高阶主板、高阶STB、通讯基地台、高阶电源供应器、LCD TV、服务器、VGA卡、游戏机等,在效能及质量提升的趋势下,固态电容有机会逐步取代传统式的液态铝质电解电容器。由于VISTA 及SANTA相继上市后,对于软、硬体的要求大幅提升,软硬件平台必须进行整合以发挥最大效能,因此对于上游被动组件质量的稳定性、耐用度、耐热度要求也相对提升,固态电容因而需求大增。目前使用台系固态电容和大陆国内固态电容厂家的产品,主要为台系2线MB 厂及大陆当地MB大厂,台湾1线MB大厂目前对台系或大陆国内厂家的固态电容产品还处于认证阶段,或者小量使用,属于试用性质。虽台系固态电容价格较日系同规格产品平均低20%,在成本考虑下,台系厂商极力争取1线大厂采用台系固态电容,取代日系固态电容。而台系固态电容厂家又面临国内生产厂家的在市场上紧跟压力,国内固态电容厂家的价格更有优势,交货期好,服务业好,不少日系固态电容使用厂家也有将部分竞争压力大得产品换成了大陆国内厂家的固态电容,也再试用阶段。H.C.Strack公司上游介电材料PEDT全球专利到期后,固态成本和售价下滑,市场普及,并有全面取代铝质电容的机会。

数字芯片的驱动能力详解

数字芯片的驱动能力详解 1.芯片驱动能力基本概念 芯片驱动能力,是指在额定电平下的最大输出电流;或者是在额定输出电流下的最大输出电压。具体解释如下。 当逻辑门输出端是低电平时,灌入逻辑门的电流称为灌电流,灌电流越大,输出端的低电平就越高。由三极管输出特性曲线也可以看出,灌电流越大,饱和压降越大,低电平越大。然而,逻辑门的低电平是有一定限制的,它有一个最大值UOLMAX。在逻辑门工作时,不允许超过这个数值,TTL逻辑门的规范规定UOLMAX ≤0.4。所以,灌电流有一个上限。 当逻辑门输出端是高电平时,逻辑门输出端的电流是从逻辑门中流出,这个电流称为拉电流。拉电流越大,输出端的高电平就越低。这是因为输出级三极管是有内阻的,内阻上的电压降会使输出电压下降。拉电流越大,输出端的高电平越低。然而,逻辑门的高电平是有一定限制的,它有一个最小值UOHMIN。在逻辑门工作时,不允许超过这个数值,TTL逻辑门的规范规定UOHMIN ≥2.4V。所以,拉电流也有一个上限。 可见,输出端的拉电流和灌电流都有一个上限,否则高电平输出时,拉电流会使输出电平低于UOHMIN;低电平输出时,灌电流会使输出电平高于UOLMAX。所以,拉电流与灌电流反映了输出驱动能力。(芯片的拉、灌电流参数值越大,意味着该芯片可以接更多的负载,因为,例如灌电流是负载给的,负载越多,被灌入的电流越大)。 2.怎么通过数字芯片的datasheet看其驱动能力 以时钟buffer FCT3807例,下图是从Pericom的FCT3807的datasheet截取的。 当其输出为高电平2.4V时,其输出电流为8mA,也就是拉电流为8mA。如果输出电流大于8mA,那么其输出电平就低于2.4V了,就不能称其输出高电平,所以可以说FCT3807输出高电平的驱动能力为8mA。 同样道理,FCT3807输出低电平的驱动能力为24mA。 3.怎么通过数字芯片的驱动能力来估算输出信号的过冲等指标 仍然以Pericom的FCT3807为例,其输出为高电平时的输出阻抗为: RH= (3.3V – 3V )/ 8mA = 37.5欧姆。 其输出为低电平时的输出阻抗为: RL= 0.3V / 24mA = 12.5欧姆。 从上面的计算可以看出,3807输出为高电平和输出为低电平时的驱动能力不一样,也就是输出阻抗不一样,所以用串联匹配的方法很难做到完全匹配,常常表现为overshoot-大

TFTLCD显示基本知识详解

TFT LCD显示原理详解 <什么是液晶> 我们一般认为物体有三态:固态、液态、气态,其实这只是针对水而言,有一些有机化和物还有介于固态和液态中间的状态就是液晶态,如下图(一): 图(一) a:背景 两块偏光的栅栏角度相互垂直时光线就完全无法通过,图(六)是用偏光太阳镜做的测试。 图(六) b:TFT LCD显示原理 液晶显示器就是利用偏光板这个特性来完成的,利用上下两片栅栏之间互垂直的偏光板之间充满了液晶,在利用电场控制液晶分支的旋转,来改变光的行进方向,如此一来,不同的电场大小,就会形成不同颜色度了,如图(七)。

图(七) b-1:当在不加上电极的时候,当入射的光线经过下面的偏光板(起偏器)时, 会剩下单方向的光波,通过液晶分子时, 由于液晶分子总共旋转了90度, 所以当光波到达上层偏光板时, 光波的极化方向恰好转了90度。下层的偏光板与上层偏光板, 角度也是恰好差异90度。所以光线便可以顺利的通过,如果光打在红色的滤光片上就显示为红色。效果如图(七)中前两个图所示。 b-2:当在加上电极后(最大电极),液晶分子在受到电场的影响下,都站立着,光路没有改变,光就无法通过上偏光板,也就无法显示,如图(七)蓝色滤光片下面的液晶。 c:TFT-LCD驱动电路。 为了显示任意图形,TFT-LCD用m×n点排列的逐行扫描矩阵显示。在设计驱动电路时,首先要考虑液晶电解会使液晶材料变质,为确保寿命一般都采用交流驱动方式。已经形成的驱动方式有:电压选择方式、斜坡方式、DAC方式和模拟方式等。由于TFT-LCD主要用于笔记本计算机,所以驱动电路大致分成:信号控制电路、电源电路、灰度电压电路、公用电极驱动电路、数据线驱动电路和寻址线驱动电路(栅极驱动IC)。上述驱动电路的主要功能是:信号控制电路将数字信号、控制信号以及时钟信号供给数字IC,并把控制信号和时钟信号供给栅极驱动IC;电源电路将需要的电源电压供给数字IC和栅极驱动IC;灰度电压电路将数字驱动电路产生的10个灰度电压各自供给数据驱动;公用电极驱动电路将公用电压供给相对于象素电极的共享电极;数据线驱动电路将信号控制电路送来的RGB信号的各6个比特显示数据以及时钟信号,定时顺序锁存并续进内部,然后此显示数据以6比特DA变换器转换成模拟信号,再由输出电路变换成阻抗,供给液晶屏的资料线;栅极驱动电路将信号控制电路送来的时钟信号,通过移位寄存器转换动作,将输出电路切换成ON/OFF电压,并顺次加到液晶屏上。最后,将驱动电路装配在TAB(自动焊接柔性线路板)上,用ACF(各向异性导电胶膜)、TCP(驱动电路柔性引带)与液晶显示屏相连接。 d:TFT-LCD工作原理 首先介绍显示原理。液晶显示的原理基于液晶的透光率随其所施电压大小而变化的特性。当光通过上偏振片后,变成线性偏振光,偏振方向与偏振片振动方向一致,与上下玻璃基板上面液晶分子排列顺序一致。当光通过液晶层时,由于受液晶折射,线性偏振光被分解为两束光。又由于这两束光传播速度不同(相位相同),因而当两束光合成后,必然使振光的振动方向发生变化。通过液晶层的光,则被逐渐扭曲。当光达到下偏振片时,其光轴振动方向被扭曲了90度,且与下偏振片的振动方向保持一致。这样,光线通过下偏振片形成亮场。加上电压以后,液晶在电场作用下取向,扭曲消失。这时,通过上偏振片的线性偏振光,在液晶层不再旋转,无法通过下偏振片而形成暗场。可见液晶本身不发光,在外光源的调制下,才能显示,在整个显示过程中,液晶起到一个电压控制的光阀作用。TFT-LCD的工作原理则可简述为:当栅极正向电压大于施加电压时,漏源电极导通,当栅极正向电压等于0或负电压时,漏源电极断开。漏电极与ITO象素电极连结,源电极与源线(列电极)连结,栅极与栅线(行电极)连结。这就是TFT-LCD的简单工作原理

段码LCD液晶屏驱动方法

TFT液晶屏:https://www.wendangku.net/doc/dc6816696.html, 段码LCD液晶屏驱动方法 段码LCD液晶屏驱动方法 首先,不要以为用单片机来驱动就以为段码屏是直流驱动的,其实,段码屏是交流驱动,什么是交流?矩形波,正弦波等。大家可能会经常用驱动芯片来玩,例如HT1621等,但是有些段式屏IO口比较少,或者说IO口充足的情况下,也可以省去写控制器的驱动了。与单片机接口方便,而后者驱动电流小,功耗低、寿命长、字形美观、显示清晰、视角大、驱动方式灵活、应用广泛。但在控制上LCD较复杂,因为LCD 电极之间的相对电压直流平均值必须为0,否则易引起LCD氧化,因此LCD不能简单地用电平信号控制,而要用一定波形的方波序列来控制。 LCD显示有静态和时分割两种方式,前者简单,但是需要较多的口线;后者复杂,但所需口线较少,这两种方式由电极引线的选择方式确定。下面以电子表的液晶显示为例,小时的高位同时灭或亮,分钟的高位在显示数码1~5时,其顶部和底部也是同时灭或亮,两个dot点也是同时亮或灭,其驱动方式是偏置比为1/2的时分割驱动,共有11个段电极和两个公共电极。但是,IO模拟驱动段式液晶有一个前提条件,就是IO必须是三态,为什么? 下面我们一起细细道来: 第一步,段码式液晶屏的重要参数:工作电压,占空比,偏压比。这三个参数非常重要,必须都要满足。 第二步,驱动方式:根据LCD的驱动原理可知,LCD像素点上只能加上AC电压,LCD显示器的对比度由COM脚上的电压值减去SEG脚上的电压值决定,当这个电压差大于LCD的饱和电压就能打开像素点,小于LCD阈值电压就能关闭像素点,LCD型MCU已经由内建的LCD驱动电路自动产生LCD驱动信号,因此只要I/O口能仿真输出该驱动信号,就能完成LCD的驱动。 段码式液晶屏幕主要有两种引脚,COM,SEG,跟数码管很像,但是,压差必须是交替变化,例如第一时刻是正向的3V,那么第二时刻必须是反向的3V,注意一点,如果给段码式液晶屏通直流电,不用多久屏幕就会废了,所以千万注意。下面我们来考虑如何模拟COM口的波形,以1/4D,1/2B为例子:

电容式触摸屏设计规范精典

电容式触摸屏设计规范【导读】:本文简单介绍了电容屏方面的相关知识,正文主要分为电子设 计和结构设计两个部分。电子设计部分包含了原理介绍、电路设计等方面,结构设计部分包好了外形结构设计、原料用材、供应商工艺等方面 【名词解释】 1. V.A区:装机后可看到的区域,不能出现不透明的线路及色差明显的区域等。 2. A.A区:可操作的区域,保证机械性能和电器性能的区域。 3. ITO:Indium Tin Oxide氧化铟锡。涂镀在Film或Glass上的导电材料。 4. ITO FILM:有导电功能的透明PET胶片。 5. ITO GALSS:导电玻璃。 6. OCA:Optically Clear Adhesive光学透明胶。 7. FPC:可挠性印刷电路板。 8. Cover Glass(lens):表面装饰用的盖板玻璃。 9. Sensor:装饰玻璃下面有触摸功能的部件。(Flim Sensor OR Glass Sensor) 【电子设计】 一、电容式触摸屏简介 电容式触摸屏即Capacitive Touch Panel(Capacitive Touch Screen),,根据应CTP和互电容式CTP。根据其驱动原理不同可分为自电容式CTP简称. 用领域不同可分为单点触摸CTP和多点触摸CTP。 1、实现原理 电容式触摸屏的采用多层ITO膜,形成矩阵式分布,以X、Y交叉分布作为电容矩阵,当手指触碰屏幕时,通过对X、Y轴的扫描,检测到触碰位置的电容变化,进而计算出手指触碰点位置。电容矩阵如下图1所示。 1 电容分布矩阵图 电容变化检测原理示意简介如下所示:名词解释::真空介电常数。ε0 ε2:不同介质相对真空状态下的介电常数。ε1 、d2S2d1S1、、、分别为形成电容的面积及间距。

常用LCD驱动IC集锦

本文主要是介绍一些常用的LCD驱动控制IC的型号,同时附上datasheet,方便学习或正在使用的LCD的朋友能够更好地编写LCD的驱动程序。 因此各位朋友在选择LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制IC的型号来判别,当然你还需要看你选择的LCD模块引脚定义是固定支持并行,还是可选择并行或串行的方式。 一、字符型LCD驱动控制IC 市场上通用的8×1、8×2、16×1、16×2、16×4、20×2、20×4、40×4等字符型LCD,基本上都采用的KS0066作为LCD的驱动控制器 下载:《KS0066 数据手册》(英文) 二、图形点阵型LCD驱动控制IC 1、点阵数122×32--《SED1520 数据手册》(英文) 2、点阵数128×64 (1)ST7920/ST7921,支持串行或并行数据操作方式,内置中文汉字库 下载:《ST7920 数据手册》(英文) (2)KS0108,只支持并行数据操作方式,这个也是最通用的12864点阵液晶的驱动控制IC 下载:《KS0108 数据手册》(英文) (3)ST7565P,支持串行或并行数据操作方式 下载:《ST7565P 数据手册》(英文) (4)S6B0724,支持串行或并行数据操作方式 下载:《S6B0724 数据手册》(英文) (5)T6963C,只支持并行数据操作方式 下载:《T6963C 数据手册》(英文) 3、其他点阵数如192×6 4、240×64、320×64、240×128的一般都是采用T6963c 驱动控制芯片 4、点阵数320×240,通用的采用RA8835驱动控制IC 下载:《RA8835 数据手册》(英文) 这里列举的只是一些常用的,当然还有其他LCD驱动控制IC,在写LCD驱动时要清楚是哪个型号的IC,再到网上去寻找对应的IC数据手册吧。

电容式触摸屏控制器介绍

电容式触摸屏控制器介绍 引言 电阻式触摸屏有过其鼎盛时期,但不可否认它们已日薄西山。很明显,它更加适合于低成本的设计。使用这些设计的用户必须戴手套,例如:在医疗、工业和军事环境下。然而,电容式触摸屏却获得了普遍的使用,今天市场上销售的主流智能手机和平板电脑都使用了电容式触摸屏。 电阻式与电容式触摸屏比较 电阻式和电容式触摸屏都使用氧化铟锡(ITO)传感器,但使用方式却截然不同。电阻式触摸屏利用人体触摸的机械作用力来连接ITO的两个柔性层(图1a),而电容式触摸屏控制利用的是:基本上而言,人本身就是移动的电容器。触摸ITO时,会改变系统可感知的电容水平(图1b)。 图1 触摸屏设计比较 电容式触摸屏受到消费者的青睐,主要有两个原因: 1、电容式触摸屏使用两层TIO,有时使用一层。它利用一个与棋盘格类似的有纹理传感器(图2),因此它可以使用一 个整片覆盖在LCD上,从而带来更加清楚透亮的屏幕。

2、由于电容式触摸屏控制使用电解电容方法实现检测,安全玻璃层可放置于顶层来实现密封,这与电阻屏的聚氨酯柔性层不同。它还给用户带来一种更加耐用的设计。 图2 TIO行与列重叠形成一个完整的传感器片 电容式触摸屏设计考虑 电容式触摸屏的设计人员面对三大主要问题:功耗、噪声控制与手势识别。本文后面部分将为你逐一讲解。 功耗 今天的电池供电型设备如此之多,功耗是我们需要考虑的关键系统问题之一。诸如TI 的TSC3060等器件,便是按照低功耗要求设计的。在标准工作条件下,它的功耗小于60mA。在对触摸行为进行检测时,它的功耗更可低至11 μA。在相同工作状态下,它比其竞争者至少低了一个数量级。 市场上的许多解决方案一开始都是设计为微控制器,然后再逐渐发展为电容式触摸屏控制器。一开始就设计为电容式触摸屏控制器的器件,没有会消耗额外电流和时钟周期的多余硬件。大多数系统都已有一个主中央处理器,其可以是数字信号处理器、微处理器或者微控制器单元(MCU)。因此,为什么要给一个已经经过精密调整的系统再增加一个引擎

液晶屏驱动1622芯片资料

文件型号YM1622 文件类型服务文件 版本02.3 段式液晶显示模块使用手册 YM1622 深圳市耀宇科技有限公司地址:深圳市南山区西丽北路八十号南粮综合楼三楼 邮编:518055电话:(0755)26700011 26622385 26701033 26622308传真:(0755)26701033 https://www.wendangku.net/doc/dc6816696.html, E-mail:yaoyulcm@https://www.wendangku.net/doc/dc6816696.html, szyaoyu@https://www.wendangku.net/doc/dc6816696.html,

一.概述 YM1622是一种段式的液晶显示器。它主要采用动态驱动原理由行驱动—控制器和列驱动器两部分组成了。此显示器可采用了COB的软封装方式,通过导电橡胶和压框连接LCD或金属管脚连接LCD,使其寿命长,连接可靠,抗震;或者热压胶纸连接。 二.特性 1.操作电压 2.4V-5.2V 2.内置32KHz RC 振荡器 3.掉电Power down 4.内置32×8 位显示RAM;最大可显示256段,且可多级联用。 5.3线串行接口 6.一个8 阶时基和看门狗定时器WDT 7.读/写地址自动增加 三.硬件说明 1.引脚特性 引脚号引脚名称级别引脚功能描述 1 /CS H/L片选信号,低电平有效 读信号,数据在/RD的上升沿被读入MCU 2 RD* H/L 写信号,数据在/WR的上升沿被写入LCM 3 WR H/L 4 DATA H/L 串行输入/输出信号 电源(负) 5 VSS 0V 7 VLCD* LCD驱动正电压.LCD驱动电压=VLCD-VSS 电源(正) 8 VDD +5V 9 /IRQ*H/L 时基和看门狗定时器WDT溢出标志 10 BZ,/BZ* H/L 2KHz or 4KHz音频输出 注: 1)*的引脚可以不使用,以具体的接口图为准. 2)引脚顺序以具体的接口图为准.

TI官方文档:电容式触摸屏使用说明(风火轮)

Application Report SLAA491B–April2011–Revised July2011 Getting Started With Capacitive Touch Software Library MSP430 ABSTRACT The objective of this document is to explain the process of getting started with the Capacitive Touch Software Library.There are multiple ways to perform capacitive touch sensing with the MSP430?.This document gives an overview of the methods available,the applicable target platforms and example projects to start development.Example projects accompanied with a step-by-step walkthrough of library configuration with the Capacitive Touch BoosterPack based on the LaunchPad?Value Line Development Kit(MSP-EXP430G2)using the MSP430G2452are also presented. Software collateral and Example Project Files for Code Composer Studio?4.2.1and IAR Embedded Workbench?5.20can be downloaded from the MSP430Capacitive Touch Sensing Landing Page. Contents 1Overview of Capacitive Touch Sensing Methods (2) 2Example Projects (3) 3References (16) Appendix A Current Measurements (17) List of Figures 1Library Architecture (2) 2Capacitive Touch BoosterPack:Element Port/Pin Assignment (4) 3File and Directory Structure (9) 4Code Composer Studio New Project Wizard–Target MCU Device Selection Step (10) 5Code Composer Studio Project Properties Window–Predefined/Preprocessor Symbols (11) 6Code Composer Studio Project Properties Window–Enable GCC Extensions Option (12) 7Code Composer Studio Project Explorer View(C/C++Tab) (12) 8Code Composer Studio Project Properties Window–Include Options (13) 9IAR Project Options–Target Device (14) 10IAR Project Options–Preprocessor Options (14) 11IAR Project Options–FET Debugger (15) 12IAR Project Explorer View (15) List of Tables 1Overview of Capacitive Touch Measurement Methods(Supported by the Library) (3) 2Description of the Example Projects (10) 3Current Measurements for Example Projects (17) MSP430,LaunchPad,Code Composer Studio are trademarks of Texas Instruments. IAR Embedded Workbench is a trademark of IAR Systems AB. All other trademarks are the property of their respective owners. 1 SLAA491B–April2011–Revised July2011Getting Started With Capacitive Touch Software Library Submit Documentation Feedback Copyright?2011,Texas Instruments Incorporated

几相才够 分析H61H67主板的供电需求

目前CPU已经逐渐从双核心向多核心过渡,当然其功耗和也有了稳步的提升,CPU性能的提升让主板对其供电及电压调节器更加精确和复杂。主板的供电历程也从原来的单相供电逐渐过渡到多相供电。而由于目前Intel对CPU超频的限制,H67和H61在规格上已经确定为不能对CPU超频的产品,但这类主板做成超多相供电是否有用处呢? 超多相供电主板 要了解H67/H61做成超多相供电是否合理,我们要先了解一下CPU供电的原理。CPU 的供电从以前的液态电容,线圈电感发展到今天的全固态电容,低阻抗的电感,甚至是数字供电。当然可以提供的功率支持也越来越大,兼顾稳定和超频。 很多玩家以供电的相数多少来衡量一块主板的好于坏,而所谓的相数是指什么呢?相数实际是指主板上提供CPU的供电通道数量,每一相通常由电容,电感,电源控制芯片,MOS 管组成。

低功耗平台两相供电能完全满足要求 理论上,平均每相供电可以提供25W-40W不等的功率,因此,对于APU和ATOM等低功耗的平台来说,三相甚至单相也能完全满足其供电需求。相对于普通主流平台,三相或者三相以上供电时必须的。因为三相供电能提供75W-120W的功耗。 高质量的电容电感 为使CPU工作在较高的频率,要求其电源电压具有极高精度。并且必须在静态和动态负载下都能保持高精度指标。通过采用精密的片上基准,以及最大程度地降低失调电压和偏置电流,可获得良好的静态精度。而动态电压精度则与电压调节器的控制环路带宽以及调节器输出端的大容量电容有关。由于调节器不能立刻响应CPU的电流突变,因此设计电路需要大容量的电容。 单相供电使用到的元器件有输入部分的一个电感线圈、一个电容,控制部分的一个PWM 控制芯片、两个场效应管,还有输出部分的一个线圈、一个电容。相比起多相供电来说是简

常见液晶驱动芯片详解

本文主要是介绍一些常用的LCD驱动控制IC的型号,方便学习或正在使用的LCD的朋友能够更好地编写LCD的驱动程序。 因此各位朋友在选择LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制IC的型号来判别,当然你还需要看你选择的LCD 模块引脚定义是固定支持并行,还是可选择并行或串行的方式。 一、字符型LCD驱动控制IC 市场上通用的8×1、8×2、16×1、16×2、16×4、20×2、20×4、40×4等字符型LCD,基本上都采用的KS0066作为LCD的驱动控制器 二、图形点阵型LCD驱动控制IC 1、点阵数122×32--SED1520 2、点阵数128×64 (1)ST7920/ST7921,支持串行或并行数据操作方式,内置中文汉字库(2)KS0108,只支持并行数据操作方式,这个也是最通用的12864点阵液晶的驱动控制IC (3)ST7565P,支持串行或并行数据操作方式 (4)S6B0724,支持串行或并行数据操作方式 (5)T6963C,只支持并行数据操作方式 3、其他点阵数如192×6 4、240×64、320×64、240×128的一般都是采用T6963c驱动控制芯片

4、点阵数320×240,通用的采用RA8835驱动控制IC 这里列举的只是一些常用的,当然还有其他LCD驱动控制IC,在写LCD驱动时要清楚是哪个型号的IC,再到网上去寻找对应的IC数据手册吧。后面我将慢慢补上其它一些常见的. 三 12864液晶的奥秘 CD1601/1602和LCD12864都是通常使用的液晶,有人以为12864是一个统一的编号,主要是12864的液晶驱动都是一样的,其实12864只是表示液晶的点阵是128*64点阵,而实际的12864有带字库的,也有不带字库的;有5V电压的,也有~5V(内置升压电路);归根到底的区别在于驱动控制芯片,常用的控制芯片有ST7920、KS0108、T6963C等等。 下面介绍比较常用的四种 (1)ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。该类液晶支持68时序8位和4位并口以及串口。 (2)KS0108类这种控制器指令简单,不带字库。支持68时序8位并口。 (3)T6963C类这种控制器功能强大,带西文字库。有文本和图形两种显示方式。有文本和图形两个图层,并且支持两个图层的叠加显示。支持80时序8位并口。

常见液晶屏主芯片资料

产品名称产品说明技术资料典型应用 LXD01812 三星液晶屏专用 SN0209033PZP-1 LG.Philips液晶屏专用 LM170E01 LXD91810 三星液晶屏专用 LXD91812 三星液晶屏专用 TFP7433ZP-6 HT现代液晶屏专用 AU30803 AU友达液晶屏专用 AU0071 AU友达液晶屏专用 CM1012A-ET AU友达液晶屏专用 FPD87326 LG液晶屏专用 LM150X06(20P) FPD87342 LG液晶屏专用 LM150X08(20P) LXD91811 三星液晶屏专用 LTM150XH-L01、 LXD91814 三星液晶屏专用 AD30601 ACER AD3032 AD LPD91821 三星液晶屏专用 AD8567 AU友达液晶屏专用 NT7168F-00010 AU30707 AU0071TAIWAN 台湾友达AU屏专用 5420CR 三星液晶屏专用 F29C51001T 七喜液晶驱动板专用 AT49LV001NT Philips液晶驱动板专用

24C16 各种LCD驱动板、A/D板专用 M6759 液晶驱动板A/D板专用MCU SM89516 液晶驱动板A/D板专用MCU ADP3421 笔记本主板供电专用IC GMZAN3L 液晶驱动板芯片 GM2121 液晶驱动板芯片 GM2116 液晶驱动板芯片 GM2110 液晶驱动板芯片 RTD2023 液晶驱动板芯片 RTD2013 液晶驱动板芯片 RTD2013B 液晶驱动板芯片 RTD2013B 液晶驱动板芯片 RTD2011 液晶驱动板芯片 RTD2022 液晶驱动板芯片 GM2121 液晶驱动板芯片 GM2221 液晶驱动板芯片 S9050-100 液晶驱动板芯片sage GMZAN1-A 液晶驱动板芯片 GMZAN2 液晶驱动板芯片 GMZAN3SL 液晶驱动板芯片 GMZAN3XL 液晶驱动板芯片

ITO触摸屏原理及基础知识

ITO触摸屏原理及基础知识 2008-08-01 22:41 目前主要有几种类型的触摸屏,它们分别是:电阻式(双层),表面电容式和感应电容式,表面声波式,红外式,以及弯曲波式、有源数字转换器式和光学成像式。它们又可以分为两类,一类需要ITO,比如前三种触摸屏,另一类的结构中不需要ITO, 比如后几种屏。 触摸屏在我们身边已经随处可见了,在PDA等个人便携式设备领域中,触摸屏节省了空间便于携带,还有更好的人机交互性。 目前主要有几种类型的触摸屏,它们分别是:电阻式(双层),表面电容式和感应电容式,表面声波式,红外式,以及弯曲波式、有源数字转换器式和光学成像式。它们又可以分为两类,一类需要ITO,比如前三种触摸屏,另一类的结构中不需要ITO, 比如后几种屏。目前市场上,使用ITO材料的电阻式触摸屏和电容式触摸屏应用最为广泛。 电阻式触摸屏 ITO 是铟锡氧化物的英文缩写,它是一种透明的导电体。通过调整铟和锡的比例,沉积方法,氧化程度以及晶粒的大小可以调整这种物质的性能。薄的ITO材料透明性好,但是阻抗高;厚的ITO材料阻抗低,但是透明性会变差。在PET聚脂薄膜上沉积时,反应温度要下降到150度以下,这会导致ITO氧化不完全,之后的应用中ITO会暴露在空气或空气隔层里,它单位面积阻抗因为自氧化而随时间变化。这使得电阻式触摸屏需要经常校正。 图一是电阻触摸屏的一个侧面剖视图。手指触摸的表面是一个硬涂层,用以保护下面的PET层。PET层是很薄的有弹性的PET薄膜,当表面被触摸时它会向下弯曲,并使得下面的两层ITO涂层能够相互接触并在该点连通电路。两个ITO层之间是约千分之一英寸厚的一些隔离支点使两层分开。最下面是一个透明的硬底层用来支撑上面的结构,通常是玻璃或者塑料。

装机指南

又到51 又到装机高峰期大街上电脑城又人声鼎沸了起来。各种商家的活动也在卖场里此起彼伏。对于DIY装机用户其实在装机的时候有些许误区也有些许注意事项。知道这些便能顺利的装出自己的爱机器。 =================================装机准备篇================================ 一、首先明白自己的用途是什么,而不是预算多少。 不要犯装个高端独显去偷菜炒股,用低端集显跑极品飞车等配置错误。明白自己的需求是游戏还是上网还是编程还是工控科研。根据用途定配置。 例: 游戏娱乐机器: 当然首当其冲考虑电脑性能。好CPU跟好显卡的组合玩起游戏来当然不卡当然,一套合适的外设也是必不可少。 上网偷菜: 可以集显AMD低端平台也可以赶时髦上i3+H55 二者都是既省电又合适。 编程绘图: 要考虑CPU运算能力问题各种VT技术以及内存大小可以考虑支持VT的E84 Q93等IU配P43 4G以上内存另外有工作站倾向的电脑一块专业制图卡也是需要考虑的。 工控科研:最重要的不是速度是机器稳定性。宁愿速度慢也不能死机关机。故目前一般要根据被研华等工控主板生产商提供的主板型号对应上CPU 如CD347, E1200等 二、根据自己的用途准备预算。写配置 其实俗话说的攒机就是这样,攒钱买电脑啊。 当然不是漫无目的的攒钱。DIY这行业,如果想烧全面一台机器=一辆车还是很容易办到

的。要根据自己用途决定攒多少。 游戏娱乐机器: 一般玩玩游戏双核2G 9600 级别显卡19寸带个音箱也就3000出头,弄个罗技套件也就再加150 。这样的配置足够装机的童鞋玩一个暑假寒假了。 上网偷菜: 一般双核2G G41 或者785G级别显卡带音箱也就2500多点。后者还能在低特效下玩玩硬件杀手游戏。这配置给父母女盆友上网看电影就是又便宜又省电了。另外说一句,给长辈女朋友攒机不推荐用开核的配置。 编程绘图: 一句话。省钱买好U好内存。多开虚拟机 工控: 单位出多少钱。买多少钱。 配置方面当然是要详细研究的。 选I?选A? 这里不好简单说清楚。各有各的好处。其实大多数人都有自己的看法,比如AU玩低端IU玩高端 选N? 选A? 这里也不引发A,N口水了。各有各的好处A卡N卡区别早已不明显基本上同价位都有好的选择。 选ST? 还是WD? 这就看个人喜好了。一个一年保一个三年保。一个速度快一个稳定点·(大多数情况) 三、根据自己的基本配置定出选择的详细型号 决定选I选A之后当然就是要选择选什么型号的处理器咯开核的开核超频的超频,常年默认的看看稳定性。这些详细选择我就不赘述了 其实旋风最想说的是选择的时候不要被厂商的各种宣传所迷惑。很多客户都容易进厂商的套子。

TFT_LCD液晶显示器的驱动原理详解

TFT LCD液晶显示器的驱动原理 TFT LCD液晶显示器的驱动原理(一) 我们针对TFT LCD的整体系统面来做介绍, 也就是对其驱动原理来做介绍, 而其驱动原理仍然因为一些架构上差异的关系, 而有所不同. 首先我们来介绍由于Cs(storage capacitor)储存电容架构不同, 所形成不同驱动系统架构的原理. Cs(storage capacitor)储存电容的架构 一般最常见的储存电容架构有两种, 分别是Cs on gate与Cs on common这两种. 这两种顾名思义就可以知道, 它的主要差别就在于储存电容是利用gate走线或是common走线来完成的. 在上一篇文章中, 我曾提到, 储存电容主要是为了让充好电的电压,能保持到下一次更新画面的时候之用. 所以我们就必须像在CMOS的制程之中, 利用不同层的走线, 来形成平行板电容. 而在TFT LCD的制程之中, 则是利用显示电极与gate走线或是common走线,所形成的平行板电容,来制作出储存电容Cs.

图1就是这两种储存电容架构, 从图中我们可以很明显的知道, Cs on gate由于不必像Cs on common一样, 需要增加一条额外的common走线, 所以它的开口率(Aperture ratio)会比较大. 而开口率的大小, 是影响面板的亮度与设计的重要因素. 所以现今面板的设计大多使用Cs on gate的方式. 但是由于Cs on gate的方式, 它的储存电容是由下一条的gate走线与显示电极之间形成的.(请见图2的Cs on gate与Cs on common的等效电路) 而gate走线, 顾名思义就是接到每一个TFT的gate端的走线, 主要就是作为gate driver送出信号, 来打开TFT, 好让TFT对显示电极作充放电的动作. 所以当下一条gate走线, 送出电压要打开下一个TFT时 ,便会影响到储存电容上储存电压的大小. 不过由于下一条gate走线打开到关闭的时间很短,(以1024*768分辨率, 60Hz更新频率的面板来说. 一条gate走线打开的时间约为20us, 而显示画面更新的时间约为16ms, 所以相对而言, 影响有限.) 所以当下一条gate走线关闭, 回复到原先的电压, 则Cs储存电容的电压, 也会随之恢复到正常. 这也是为什么, 大多数的储存电容设计都是采用Cs on gate 的方式的原因. 至于common走线, 我们在这边也需要顺便介绍一下. 从图2中我们可以发现, 不管您采用怎样的储存电容架构, Clc的两端都是分别接到显示电极与common. 既然液晶是充满在上下两片玻璃之间, 而显示电极与TFT都是位在同一片玻璃上, 则common电极很明显

液晶显示器中常用芯片类型

液晶显示器中常用芯片类型 1.液晶显示器中常用MCU 液晶显示器的发展经历了从多芯片到单芯片的发展过程,无论采用哪种方案,都必须有MCU来完成机器控制和图像显示。下面介绍一下液晶显示器常用的MCU. 液晶显示器和电视机所用的MCU是集成了运算器、控制器、存储器(也可外置)、输人输出功能的单片机,常用的有4位(如键盘控制器、遥控器)、8位、l6位和32位(如掌上电脑等嵌入式设备),仍有DIP和PLCC两种封装形式,最小的单片机是MICROCHIP公司生产的8位PIC10F(6引脚、SOT-23封装)。 正常情况下,MCU的vcc供电、OSC振荡源、RESET复位、接地端都固定,而IO 端口的功能设置随程序而定。所以,我们在液晶维修中,常遇到即使是方案和芯片一样的驱动板,使用的程序不同,也会出现图像显示正常而开/关机无效,或者能够开/关机但没有图像显示的现象。 (1)NT68F63LG 该MCU是三星液晶的510、540、710、711、712、740、911、913等型号中使用的,芯片实物如图1所示。但由于该MCU存在缺陷,所以凡是采用该型号MCU的液晶显示器,使用时间达到5000小时左右,就会出现故障。具体表现为:接信号黑屏(指示灯亮,开/关机正常,无图像)或者黑屏上面显示“非最佳模式”。其原因,不是MCU中的程序数据出现错误,而是MCU的HV信号检测电路损坏所致。此时,故障MCU中的数据是完好的,将其读出来,复制到新的MCU中即可使用。

注意:用来复制数据的MCU必须是全新的,如果采用翻新MCU可能你焊好后仍会出现以上故障。即使所有的是全新MCU,如果焊接了多次,也会损坏,所以焊接技术不是很好的朋友,可以使用PLCC44的IC插座。 (2)MTV312MV64 该MCU为MYSON公司生产,具各加密功能。使用该芯片的HP、金长城液晶,程序一般都进行了加密处理,编程器读出来的全部是D4,无法进行MCU程序备份,芯片实物如图2所示。使用该型号MCU的明基液晶比较多,在Q7T4系列中常见。在实际维修中,该MCU的故障率非常低。

相关文档