Android 基于sx8652的触摸屏驱动(gpio模拟spi)

       由于S5PV210的SPI读数据出现读到的全是0x00,改用gpio模拟spi的方式调试触摸屏驱动,采用sx8652芯片。本驱动调试成功,但尚未考虑休眠唤醒等问题,更新中......

/*
 * SX8652 based touchscreen and sensor driver
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 */

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/fs.h>
#include <linux/poll.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <mach/hardware.h>
#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/gpio.h>	

#define SX8652_TS_PENUP_TIME	 100

/* analog channels */
#define CH_X	0
#define CH_Y	1
#define CH_Z1	2
#define CH_Z2	3
#define CH_AUX	4
#define CH_SEQ	7

/* commands */
#define SX8652_CMD_WRITEREG		0x00
#define SX8652_CMD_READCHAN		0x20
#define SX8652_CMD_READREG		0x40
#define SX8652_CMD_SELECT		0x80
#define SX8652_CMD_CONVERT		0x90
#define SX8652_CMD_MANAUTO		0xb0
#define SX8652_CMD_PENDET		0xc0
#define SX8652_CMD_PENTRG		0xe0

/* register addresses */
#define SX8652_REG_CTRL0	0x00
#define SX8652_REG_CTRL1	0x01
#define SX8652_REG_CTRL2	0x02
#define SX8652_REG_CHANMSK	0x04
#define SX8652_REG_STATUS	0x05
#define SX8652_REG_RESET	0x1f

// 5 wires touch pannel
#define FIVE_WIRE 0x10

/* for POWDLY or SETDLY: */
#define DLY_0_5US	0x00
#define DLY_1_1US	0x01
#define DLY_2_2US	0x02
#define DLY_4_4US	0x03
#define DLY_9US		0x04
#define DLY_18US	0x05
#define DLY_35uS	0x06
#define DLY_71US	0x07
#define DLY_140US	0x08
#define DLY_280US	0x09
#define DLY_570US	0x0a
#define DLY_1_1MS	0x0b
#define DLY_2_3MS	0x0c
#define DLY_4_5MS	0x0d
#define DLY_9MS		0x0e
#define DLY_18MS	0x0f

// RegCtrl1
#define CONDIRQ 	0x20
#define FIVEWIRE	0x10
#define FILT_NONE	0x00
#define FILT_3SA	0x01
#define FILT_5SA	0x02
#define FILT_7SA	0x03

#define CONV_X		0x80
#define CONV_Y		0x40
#define CONV_Z1		0x20
#define CONV_Z2		0x10
#define CONV_AUX	        0x08

#define CHAN_MASK	(CONV_X | CONV_Y )
#define RESET_VALUE	0xde
#define NUM_READ_REGS	2	/* count of words to read */

#define X_MIN    200
#define X_MAX   3850
#define Y_MIN    200
#define Y_MAX   3850
#define PRESSURE_MIN    0
#define PRESSURE_MAX    1

//define gpio
#define SX8652_GPIO_CS        S5PV210_GPB(1)
#define SX8652_GPIO_CLK      S5PV210_GPB(0)
#define SX8652_GPIO_MOSI   S5PV210_GPB(3)
#define SX8652_GPIO_MISO   S5PV210_GPB(2)
#define SX8652_GPIO_IRQ     S5PV210_GPH0(6)
#define SX8652_IRQ                 IRQ_EINT6

struct sx8652 {
	struct input_dev	*input;
	char			phys[32];
	spinlock_t		lock;
	struct mutex	mutex;
	unsigned		disabled:1;
	struct timer_list	penup_timer;
	struct workqueue_struct	*ts_workq;
	struct work_struct	pen_event_work;

	int pre_x_coordinate;
	int pre_y_coordinate;
	u8 pen_down;
	u8 data[(NUM_READ_REGS << 1) + 1];
};

//读8bit
static u8 sx8652_byte_read(void)
{
	u8 i,temp=0x00;
	gpio_set_value(SX8652_GPIO_CLK, 0);
	
	for(i=0;i<8;i++)
	{
		temp <<=1;
		gpio_set_value(SX8652_GPIO_CLK, 1); udelay(10);
		if(gpio_get_value(SX8652_GPIO_MISO) != 0) temp++;
			gpio_set_value(SX8652_GPIO_CLK, 0); udelay(10);
	}
	return (temp);
}

//写8bit
static void sx8652_byte_write(u8 n)
{
	u8 i;
	gpio_set_value(SX8652_GPIO_CLK, 0);
	for(i=0;i<8;i++)
	{
		if((n&0x80)==0x80)
			gpio_set_value(SX8652_GPIO_MOSI, 1);
		else
			gpio_set_value(SX8652_GPIO_MOSI, 0);

		n <<= 1;
		gpio_set_value(SX8652_GPIO_CLK, 1); udelay(10);
		gpio_set_value(SX8652_GPIO_CLK, 0); udelay(10);
	}
}

static void sx8652_write_reg(u8 reg, u8 value)
{
	/* CS# Low */
	gpio_set_value(SX8652_GPIO_CS, 0);
	
	sx8652_byte_write(reg | SX8652_CMD_WRITEREG);
	sx8652_byte_write(value);
	
	/* CS# High */
	gpio_set_value(SX8652_GPIO_CS, 1);
}

static void sx8652_issue_cmd(u8 cmd)
{
	/* CS# Low */
	gpio_set_value(SX8652_GPIO_CS, 0);
	
	sx8652_byte_write(cmd);
	
	/* CS# High */
	gpio_set_value(SX8652_GPIO_CS, 1);
}

static u8 sx8652_read_reg(u8 reg)
{
	u8 ret;
	
	/* CS# Low */
	gpio_set_value(SX8652_GPIO_CS, 0);
	
	sx8652_byte_write(reg | SX8652_CMD_READREG);
	ret = sx8652_byte_read();
	
	/* CS# High */
	gpio_set_value(SX8652_GPIO_CS, 1);
	return ret;
}

static void sx8652_read_chan_data(u8 *buf)
{
	u8 i;
	
	/* CS# Low */
	gpio_set_value(SX8652_GPIO_CS, 0);
	
	sx8652_byte_write(SX8652_CMD_READCHAN);
	
	for(i=0;  i<NUM_READ_REGS * 2; i++)
	{
		buf[i] = sx8652_byte_read();
	}
	
	/* CS# High */
	gpio_set_value(SX8652_GPIO_CS, 1);
}

static int get_pendown_state(void)
{
	return !gpio_get_value(SX8652_GPIO_IRQ);
}

static void sx8652_ts_penup_timer_handler(unsigned long data)
{
	struct sx8652 *ts = (struct sx8652 *)data;

	input_report_abs(ts->input, ABS_PRESSURE, 0);
	input_report_key(ts->input, BTN_TOUCH, 0);
	input_sync(ts->input);

	ts->pen_down = 0;
	ts->pre_x_coordinate = 0;
	ts->pre_y_coordinate = 0;
	printk("%s\n", __func__);
}

static void sx8652_async_rx(struct sx8652 *ts)
{
	u16 *data_ptr;
	u8 invalid = 0, i, bad_point = 0;
	int x = 0, y = 0;

	sx8652_read_chan_data(ts->data);
	data_ptr = (u16 *)&ts->data[0];

	for (i = 0; i < NUM_READ_REGS; i++) {
		u16 data = swab16(data_ptr[i]);
		u8 ch = data >> 12;
		switch (ch) {
			case CH_X:
				x = data & 0xfff;
				break;
			case CH_Y:
				y = data & 0xfff;
				break;
			default:
				printk(KERN_ERR "? %d: %x\n", i, data);
				invalid = 1;
				break;
		}
	}

	if (!invalid) {
		// record the first point
		if (!ts->pen_down) {
			ts->pre_x_coordinate = x;
			ts->pre_y_coordinate = y;
		}
		// 在触摸没有抬起的情况下,新读到的数据与上一次的数据做比较,大于或者小于一定范围的值认为是有效值,否则不上报
		if((ts->pre_x_coordinate > 0) && (ts->pre_y_coordinate > 0) && (abs(ts->pre_x_coordinate - x) < 160) && (abs(ts->pre_y_coordinate - y) < 160)) {
			if (!ts->pen_down) {
				//printk(KERN_ERR "pendown\n");
				input_report_key(ts->input, BTN_TOUCH, 1);
				ts->pen_down = 1;
			}

			input_report_abs(ts->input, ABS_X, x);
			input_report_abs(ts->input, ABS_Y, y);
			input_report_abs(ts->input, ABS_PRESSURE, 1);
			input_sync(ts->input);

			ts->pre_x_coordinate = x;
			ts->pre_y_coordinate = y;			
		}
		else
			bad_point = 1;

		printk("point(%4d,%4d), bad_point=%d\n", x, y, bad_point);
	}
}

static irqreturn_t sx8652_irq(int irq, void *handle)
{
	struct sx8652 *ts = handle;
	unsigned long flags;

	//printk("%s\n", __func__);
	
	/* If insufficient pullup resistor on nIRQ line:
	 * may need to make sure that pen is really down here, due to spurious interrupts  */
	if (likely(get_pendown_state())) {
		spin_lock_irqsave(&ts->lock, flags);
		queue_work(ts->ts_workq, &ts->pen_event_work);
		spin_unlock_irqrestore(&ts->lock, flags);

	} else
		printk(KERN_ERR "irq: pen up\n");
		
	return IRQ_HANDLED;
}

static void sx8652_pen_irq_worker(struct work_struct *work)
{
	struct sx8652 *ts = container_of(work, struct sx8652, pen_event_work);

	//printk("%s\n", __func__);
	/* the pen is down */
	if (likely(get_pendown_state())) {
		/* valid data was read in */
		sx8652_async_rx(ts);
	} else
		printk(KERN_ERR "fail\n");

	/* kick pen up timer - to make sure it expires again(!) */
	mod_timer(&ts->penup_timer, jiffies + msecs_to_jiffies(SX8652_TS_PENUP_TIME));
}

static int __devinit sx8652_probe(struct platform_device *pdev)
{
	struct sx8652 *ts;
	struct input_dev *input_dev;
	int err = -1;
	
	ts = kzalloc(sizeof(struct sx8652), GFP_KERNEL);
	input_dev = input_allocate_device();
	if (!ts || !input_dev) {
		err = -ENOMEM;
		goto err_free_mem;
	}

	err = gpio_request(SX8652_GPIO_IRQ, "sx8652 pendown");
	if (err) {
		dev_err(&pdev->dev, "failed to request pendown gpio\n");
		goto err_free_mem;
	}

	err = gpio_request(SX8652_GPIO_CS, "sx8652 cs");
	if (err) {
		dev_err(&pdev->dev, "failed to request sx8652 cs\n");
		goto err_free_mem;
	}

	err = gpio_request(SX8652_GPIO_CLK, "sx8652 clk");
	if (err) {
		dev_err(&pdev->dev, "failed to request sx8652 clk\n");
		goto err_free_mem;
	}

	err = gpio_request(SX8652_GPIO_MOSI, "sx8652 mosi");
	if (err) {
		dev_err(&pdev->dev, "failed to request sx8652 mosi\n");
		goto err_free_mem;
	}

	err = gpio_request(SX8652_GPIO_MISO, "sx8652 miso");
	if (err) {
		dev_err(&pdev->dev, "failed to request sx8652 miso\n");
		goto err_free_mem;
	}

	s3c_gpio_setpull(SX8652_GPIO_IRQ, S3C_GPIO_PULL_UP);
	gpio_direction_input(SX8652_GPIO_IRQ);
	s3c_gpio_cfgpin(SX8652_GPIO_IRQ, S3C_GPIO_SFN(0xf0000000));	//设置为外部中断 eint0 ,参考GP0CON【】
		
	s3c_gpio_setpull(SX8652_GPIO_MISO, S3C_GPIO_PULL_UP);
	gpio_direction_input(SX8652_GPIO_MISO);
	s3c_gpio_setpull(SX8652_GPIO_CS, S3C_GPIO_PULL_UP);
	s3c_gpio_setpull(SX8652_GPIO_MOSI, S3C_GPIO_PULL_UP);
	s3c_gpio_setpull(SX8652_GPIO_CLK, S3C_GPIO_PULL_UP);
	gpio_direction_output(SX8652_GPIO_MOSI,1);	//MOSI
	gpio_direction_output(SX8652_GPIO_CLK,1);	//clk
	gpio_direction_output(SX8652_GPIO_CS,1);	        //cs
	gpio_set_value(SX8652_GPIO_MOSI ,1);	
	gpio_set_value(SX8652_GPIO_CLK ,1);
	gpio_set_value(SX8652_GPIO_CS ,1);
		
	ts->input = input_dev;	
	platform_set_drvdata(pdev, ts);

	/* Send a software reset command */
	sx8652_write_reg(SX8652_REG_RESET, RESET_VALUE);
	/* sx8652 nirq is momentarily asserted after software reset */
	udelay(250);

	init_timer(&ts->penup_timer);
	setup_timer(&ts->penup_timer, sx8652_ts_penup_timer_handler, (unsigned long)ts);

	spin_lock_init(&ts->lock);
	mutex_init(&ts->mutex);
	
	ts->ts_workq = create_singlethread_workqueue("sx8652");
	if (ts->ts_workq == NULL) {
		printk("failed to create workqueue\n");
		goto err_free_mem;
	}

	INIT_WORK(&ts->pen_event_work, sx8652_pen_irq_worker);

	//for older kernel: snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id);
	//for 2.6.32:
	snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&pdev->dev));

	input_dev->name = "SX8652 Touchscreen";
	input_dev->phys = ts->phys;
	input_dev->dev.parent = &pdev->dev;

	input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
	input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
	input_set_abs_params(input_dev, ABS_X, X_MIN, X_MAX, 0, 0);
	input_set_abs_params(input_dev, ABS_Y, Y_MIN, Y_MAX, 0, 0);
	input_set_abs_params(input_dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);
	err = input_register_device(input_dev);
	if (err)
		goto err_free_mem;

	sx8652_write_reg(SX8652_REG_CTRL0, DLY_1_1MS);
	sx8652_write_reg(SX8652_REG_CTRL1, CONDIRQ | FILT_3SA | FIVE_WIRE);
	sx8652_write_reg(SX8652_REG_CHANMSK, CHAN_MASK);
	sx8652_issue_cmd(SX8652_CMD_PENTRG);

	printk("%02x,%02x,%02x\n", sx8652_read_reg(SX8652_REG_CTRL0), sx8652_read_reg(SX8652_REG_CTRL1), sx8652_read_reg(SX8652_REG_CHANMSK));

	if (request_irq(SX8652_IRQ, sx8652_irq, IRQF_TRIGGER_FALLING, "sx8652", ts)) {
		printk("IRQ_EINT6 busy\n");
		err = -EBUSY;
		goto err_free_mem;
	}
	
	printk("%s end\n", __func__);
	
	return 0;

 err_free_mem:
	input_free_device(input_dev);
	kfree(ts);
	return err;
}


/* Must be called with ts->lock held */
static void sx8652_disable(struct sx8652 *ts)
{
}

static int sx8652_suspend(struct platform_device *pdev, pm_message_t message)
{
	struct sx8652 *ts = dev_get_drvdata(&pdev->dev);

	mutex_lock(&ts->mutex);
	sx8652_disable(ts);
	mutex_unlock(&ts->mutex);
	printk("%s\n", __func__);
	return 0;
}

static int __devexit sx8652_remove(struct platform_device *pdev)
{
	struct sx8652		*ts = dev_get_drvdata(&pdev->dev);

	input_unregister_device(ts->input);
	sx8652_suspend(pdev, PMSG_SUSPEND);
	cancel_work_sync(&ts->pen_event_work);
	destroy_workqueue(ts->ts_workq);
	free_irq(SX8652_IRQ, ts);
	kfree(ts);

	dev_dbg(&pdev->dev, "unregistered touchscreen\n");
	return 0;
}

/* Must be called with ts->lock held */
static void sx8652_enable(struct sx8652 *ts)
{
}

static int sx8652_resume(struct platform_device *pdev)
{
	struct sx8652 *ts = dev_get_drvdata(&pdev->dev);

	mutex_lock(&ts->mutex);
	sx8652_enable(ts);
	mutex_unlock(&ts->mutex);
	printk("%s\n", __func__);

	return 0;
}

static struct platform_driver sx8652_driver = {
	.driver = {
		.name	= "sx8652",
		.owner	= THIS_MODULE,
	},
	.probe		= sx8652_probe,
	.remove		= __devexit_p(sx8652_remove),
	.suspend	= sx8652_suspend,
	.resume		= sx8652_resume,
};

static int __init sx8652_init(void)
{
	return platform_driver_register(&sx8652_driver);
}
module_init(sx8652_init);

static void __exit sx8652_exit(void)
{
	platform_driver_unregister(&sx8652_driver);
}
module_exit(sx8652_exit);

MODULE_AUTHOR("ldh <lindonghai@malata.com>");
MODULE_DESCRIPTION("SX8652 TouchScreen Driver");
MODULE_LICENSE("GPL");


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发板使用:CB-A(需要外接+5V) 1、在lichee中初始化RGB屏幕:KD027QVTPD022 W:\liuxing_csdn_tinav2.1\lichee\linux-3.4\drivers\video\sunxi\lcd\panels\default_panel.c static void LCD_panel_init(u32 sel) { u32 i; //printk("raoyiming +++ LCD_panel_init\n"); /**/ panel_rst(1); sunxi_lcd_delay_ms(1); panel_rst(0); sunxi_lcd_delay_ms(10); panel_rst(1); sunxi_lcd_delay_ms(120); return; } W:\liuxing_csdn_tinav2.1\lichee\linux-3.4\drivers\video\sunxi\lcd\panels\default_panel.h #define panel_rst(v) (sunxi_lcd_gpio_set_value(0, 0, v)) 第二个0是sys_config.fex中lcd_gpio_0 lcd_gpio_0 = port:PH07<1><0><default><0> 2、 W:\liuxing_csdn_tinav2.1\target\allwinner\astar-parrot\configs\sys_config.fex 生成的SPI的设备名: ;---------------------------------------------------------------------------------- ;[spi_board0] spi device configuration ;modalias = spi device name ;sflash_size = spi flash size, optional, if spi_board0 is nor flash , carefully ;max_speed_hz = max transfer speed ;bus_num = bus ID ;chip_select = chip select, 0,1 ;mode = SPI transfer mode ;---------------------------------------------------------------------------------- [spi_board0] ;modalias = "at25df641" modalias = "spidev" sflash_size = 32 max_speed_hz = 50000000 bus_num = 0 chip_select = 0 mode = 0 加入RGB的屏幕参数(如果希望调优请找模组厂协助): ;---------------------------------------------------------------------------------- ;lcd0 configuration ;lcd_if: 0:hv(sync+de); 1:8080; 2:ttl; 3:lvds; 4:dsi; 5:edp; 6:extend dsi ;lcd_x: lcd horizontal resolution ;lcd_y: lcd vertical resolution ;lcd_width: width of lcd in mm ;lcd_height: height of lcd in mm ;lcd_dclk_freq: in MHZ unit ;lcd_pwm_freq: in HZ unit ;lcd_pwm_pol: lcd backlight PWM polarity ;lcd_pwm_max_limit lcd backlight PWM max limit(<=255) ;lcd_hbp: hsync back porch ;lcd_ht: hsync total cycle ;lcd_vbp: vsync back porch ;lcd_vt: vysnc total cycle ;lcd_hspw: hsync plus width ;lcd_vspw: vysnc plus width ;lcd_lvds_if: 0:single link; 1:dual link ;lcd_lvds_colordepth: 0:8bit; 1:6bit ;lcd_lvds_mode: 0:NS mode; 1:JEIDA mode ;lcd_frm: 0:disable; 1:enable rgb666 dither; 2:enable rgb656 dither ;lcd_io_phase: 0:noraml; 1:intert phase(0~3bit: vsync phase; 4~7bit:hsync phase; ; 8~11bit:dclk phase; 12~15bit:de phase) ;lcd_gamma_en lcd gamma correction enable ;lcd_bright_curve_en lcd bright curve correction enable ;lcd_cmap_en lcd color map function enable ;deu_mode 0:smoll lcd screen; 1:large lcd screen(larger than 10inch) ;lcdgamma4iep: Smart Backlight parameter, lcd gamma vale * 10; ; decrease it while lcd is not bright enough; increase while lcd is too bright ;smart_color 90:normal lcd screen 65:retina lcd screen(9.7inch) ;---------------------------------------------------------------------------------- [lcd0_para] lcd_used = 1 lcd_driver_name = "default_lcd" lcd_if = 0 lcd_x = 320 lcd_y = 240 lcd_width = 0 lcd_height = 0 lcd_dclk_freq = 5 lcd_pwm_used = 1 lcd_pwm_ch = 0 lcd_pwm_freq = 50000 lcd_pwm_pol = 1 lcd_hbp = 60 lcd_ht = 390 lcd_hspw = 6 lcd_vbp = 6 lcd_vt = 250 lcd_vspw = 2 lcd_lvds_if = 0 lcd_lvds_colordepth = 0 lcd_lvds_mode = 0 lcd_frm = 1 lcd_gamma_en = 0 lcd_bright_curve_en = 0 lcd_cmap_en = 0 deu_mode = 0 lcdgamma4iep = 22 smart_color = 90 lcd_bl_en = port:PD13<1><0><default><1> lcd_power = "axp22_dc1sw" lcd_gpio_0 = port:PH07<1><0><default><0> lcd_gpio_1 = port:PL04<1><0><default><0> lcd_gpio_2 = port:PL11<1><0><default><1> ;lcdd0 = port:PD00<2><0><2><default> ;lcdd1 = port:PD01<2><0><2><default> lcdd2 = port:PD02<2><0><2><default> lcdd3 = port:PD03<2><0><2><default> lcdd4 = port:PD04<2><0><2><default> lcdd5 = port:PD05<2><0><2><default> lcdd6 = port:PD06<2><0><2><default> lcdd7 = port:PD07<2><0><2><default> ;lcdd8 = port:PD08<2><0><2><default> ;lcdd9 = port:PD09<2><0><2><default> lcdd10 = port:PD10<2><0><2><default> lcdd11 = port:PD11<2><0><2><default> lcdd12 = port:PD12<2><0><2><default> lcdd13 = port:PD13<2><0><2><default> lcdd14 = port:PD14<2><0><2><default> lcdd15 = port:PD15<2><0><2><default> ;lcdd16 = port:PD16<2><0><2><default> ;lcdd17 = port:PD17<2><0><2><default> lcdd18 = port:PD18<2><0><2><default> lcdd19 = port:PD19<2><0><2><default> lcdd20 = port:PD20<2><0><2><default> lcdd21 = port:PD21<2><0><2><default> lcdd22 = port:PD22<2><0><2><default> lcdd23 = port:PD23<2><0><2><default> lcdclk = port:PD24<2><0><3><default> lcdde = port:PD25<2><0><2><default> lcdhsync = port:PD26<2><0><2><default> lcdvsync = port:PD27<2><0><2><default> 3、原理:生成设备节点:/dev/spidev0.0。然后通用C格式的应用程序访问这个设备节点来初始化LCD。 编译刷机之后: 开机之后背光是亮的(背光被强制拉高了) root@TinaLinux:/# root@TinaLinux:/# find . -name spi* ./bin/spidev_test0 ./dev/spidev0.0 ./proc/irq/97/spi0 ./rom/bin/spidev_test0 ./rom/usr/lib/opkg/info/spidev_test0.control ./rom/usr/lib/opkg/info/spidev_test0.list ./sys/bus/spi ./sys/bus/spi/devices/spi0.0 ./sys/bus/spi/drivers/spidev ./sys/bus/spi/drivers/spidev/spi0.0 ./sys/bus/platform/devices/spi.0 ./sys/bus/platform/drivers/spi ./sys/bus/platform/drivers/spi/spi.0 ./sys/devices/platform/spi.0 ./sys/devices/platform/spi.0/spi_master ./sys/devices/platform/spi.0/spi_master/spi0 ./sys/devices/platform/spi.0/spi_master/spi0/spi0.0 ./sys/devices/platform/spi.0/spi_master/spi0/spi0.0/spidev ./sys/devices/platform/spi.0/spi_master/spi0/spi0.0/spidev/spidev0.0 ./sys/class/spi_master ./sys/class/spi_master/spi0 ./sys/class/spidev ./sys/class/spidev/spidev0.0 ./sys/kernel/debug/clk/hosc/pll_periph/pll_periphahb1/ahb1/spinlock ./sys/kernel/debug/clk/hosc/pll_periph/spi0 ./sys/kernel/debug/clk/hosc/spi1 ./sys/module/spidev ./usr/lib/opkg/info/spidev_test0.control ./usr/lib/opkg/info/spidev_test0.list root@TinaLinux:/# root@TinaLinux:/# (初始化屏幕之后是全绿:) root@TinaLinux:/# spidev_test0 spi mode: 0 bits per word: 8 max speed: 500000 Hz (500 KHz) send spi message success! root@TinaLinux:/# root@TinaLinux:/# (红绿蓝单色和一张静态图片的切换) root@TinaLinux:/# root@TinaLinux:/# root@TinaLinux:/# cb_test [ 203.906264] request_suspend_state: wakeup (0->0) at 203906241807 (1970-01-01 08:41:09.853073511 UTC) fb0 begining readCnt = 1 ****wyb 2017/7/3 9:36 x = 320 y = 240 bytes_per_pixel = 4 screensize = 307200 ----- RED 0 ----- GREEN ----- BLUE ----- RED 1 ----- GREEN ----- BLUE ^C root@TinaLinux:/# (绿红黑等单色循环测试) root@TinaLinux:/# root@TinaLinux:/# root@TinaLinux:/# fbtest **** wyb fbtest.c-391-main argc=1 **** wyb fbtest.c-453-main argc2=1 **** wyb fbtest.c-462-main opening framebuffer device success! **** wyb fbtest.c-471-main getting fix screeninfo success! **** wyb fbtest.c-480-main getting var screeninfo success! **** wyb fbtest.c-489-main setting mode success! **** wyb fbtest.c-498-main mmap'ing framebuffer device success! testing: ARGB for sizes: 320x240 ^C root@TinaLinux:/# root@TinaLinux:/# 4、改进方向: W:\liuxing_csdn_tinav2.1\lichee\linux-3.4\drivers\video\sunxi\lcd\panels\default_panel.c 在驱动中增加SPI初始化部分,然后还可以让开机自动进入红绿蓝的测试程序!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值