Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Отладочные платы » SK-MNUC950
SK-MNUC950 + SK-MI0430FT-Plug
Hermes
Добавлено 29.04.2010 20:15 Сообщение: 31
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
конечно всё опубликую, выложу и распишу... если получиться %)
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 29.04.2010 22:20 Редактировалось 29.04.2010 22:22 Сообщение: 32
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
и вот собрался драйвер с горем пополам... проводки подпаяны...
ядро залито в нанд. включение и с замиранием сердца смотрим в окно терминалки, а она нам выплёвывает:
Код
nand boot ...addr 0xA00000, len 857,819No bad block!!addr 0x8000, len 2,585,840No bad block!!Linux version 2.6.17.14 (root@debian) (gcc version 4.2.1) #165 PREEMPT Mon Feb 15 10:36:37 EST 2010
CPU: ARM926EJ-Sid(wb) [41069265] revision 5 (ARMv5TEJ)
Machine: NUC950
Memory policy: ECC disabled, Data cache writeback
CPU NUC950 (id 0x02900910 system clock:200MHZ)
CPU0: D VIVT write-back cache
CPU0: I cache: 8192 bytes, associativity 4, 32 byte lines, 64 sets
CPU0: D cache: 8192 bytes, associativity 4, 32 byte lines, 64 sets
Built 1 zonelists
Kernel command line: root=/dev/ram0 console=ttyS0,115200n8 initrd=0xa00000,4000000 mem=32M
PID hash table entries: 256 (order: 8, 1024 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 25912KB available (2140K code, 358K data, 96K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 3906K
NET: Registered protocol family 16
********************************************
* You selcet NUC950,Start Init NUC950EVB *
********************************************
SCSI subsystem initialized
usbcore: registered new driver usbfs
usbcore: registered new driver hub
NET: Registered protocol family 2
IP route cache hash table entries: 256 (order: -2, 1024 bytes)
TCP established hash table entries: 1024 (order: 0, 4096 bytes)
TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 1024 bind 512)
TCP reno registered
NetWinder Floating Point Emulator V0.97 (double precision)
NTFS driver 2.1.27 [Flags: R/W].
yaffs Sep 10 2009 04:40:56 Installing.
io scheduler noop registered (default)
Console: switching to colour frame buffer device 60x34
nuc900 LCD driver has been installed successfully
INIT TOUCH SCREEN<6>input: HP Jornada touchscreen as /class/input/input0
NUC900 USB 2.0 Device Driver Initilization Success
NUC900 uart driver has been initialized successfully!
nuc900-uart.0: ttyS0 at MMIO 0xb8000000 (irq = 7) is a NUC900
nuc900-uart.1: ttyS1 at MMIO 0xb8000100 (irq = 8) is a NUC900
nuc900-uart.2: ttyS2 at MMIO 0xb8000200 (irq = 9) is a NUC900
RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize
loop: loaded (max 8 devices)
NUC900 Ethernet(eth0) driver has been initialized successfully!
The ports of EMC are available in that range.
NUC900 SD driver has been initialized successfully!
NFTL driver: nftlcore.c $Revision: 1.98 $, nftlmount.c $Revision: 1.41 $
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Using static partition definition
Creating 1 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00800000-0x10000000 : "W90P950 NAND Flash"
NUC900 USB host driver has been initialized successfully!
nuc900-ehci nuc900-ehci: Nuvoton nuc900 EHCI Host Controller
nuc900-ehci nuc900-ehci: new USB bus registered, assigned bus number 1
nuc900-ehci nuc900-ehci: irq 15, io mem 0xb0005000
nuc900-ehci nuc900-ehci: USB 2.0 started, EHCI 0.95, driver 10 Dec 2004
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
nuc900-ohci nuc900-ohci: Nuvoton nuc900 ohci Host Controller
nuc900-ohci nuc900-ohci: new USB bus registered, assigned bus number 2
nuc900-ohci nuc900-ohci: io mem 0xb0007000
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
usbcore: registered new driver usbkbd
drivers/usb/input/usbkbd.c: :USB HID Boot Protocol keyboard driver
usbcore: registered new driver usbmouse
drivers/usb/input/usbmouse.c: v1.6:USB HID Boot Protocol mouse driver
mice: PS/2 mouse device common for all mice
ts: Compaq touchscreen protocol output
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem) readonly.
Freeing init memory: 96K
yaffs: dev is 32505856 name is "mtdblock0"
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
yaffs: auto selecting yaffs2
block 261 is bad
block 857 is bad
block 1060 is bad
block 1225 is bad
Initializing random number generator... read-only file system detected...done
Starting network...

Set MaC Address 0:31:242:0:0:0
eth0 is OPENED
route: SIOCADDRT: File exists
MAC Line-off...



Welcome to SK-MNUC950 development board.
www.starterkit.ru


и даже есть заветная строчка
пробую cat /dev/ts0 жамкаю по экрану и ноль эмоций... :-( в чём дело пока не понятно. Ошибка похоже в процедуре таймера который читает координаты
пробовал printk в процедуре таймера, выплёвывает их очень часто :-)
скорей всего ошибки в преобразовании координат в удобоваримый текст...
буду думать
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 29.04.2010 22:27 Редактировалось 29.04.2010 22:27 Сообщение: 33
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
вот собственно код самого драйвера (не причёсан до конца) многие оригинальные строки сохранены что бы было понятно куда что пишется
Код
#include <linux/input.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <asm/io.h>
#include <asm/delay.h>
//#include <asm/adc.h>
//#include <asm/hp6xx.h>
#include <asm/hp6xx/hp6xx.h>
#include <linux/timer.h>;
#include <linux/jiffies.h>;

/*#include <asm/arch/at91_pio.h>
#include <asm/arch/gpio.h>*/
#include <asm/arch/nuc900_gpio.h>
//#include <mach/gpio.h>

#ifdef __KERNEL__
#define BIT(nr) (1UL << (nr))
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
#define BITS_PER_BYTE 8
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
#endif


#define TS_DOUT AT91_PIN_PA22
#define TS_DIN AT91_PIN_PA28
#define TS_BUSY AT91_PIN_PA26
#define TS_CS AT91_PIN_PA23
#define TS_CLK AT91_PIN_PA25
#define TS_PENIRQ AT91_PIN_PA29

#define READ_X ((5 << 4) | 1<<3 | 0)
#define READ_Y ((1 << 4) | 1<<3 | 0)
#define READ_Z ((3 << 4) | 1<<3 | 0)


#define MODNAME "hp680_ts_input"

#define HP680_TS_ABS_X_MIN 10
#define HP680_TS_ABS_X_MAX 910
#define HP680_TS_ABS_Y_MIN 15
#define HP680_TS_ABS_Y_MAX 950
#define PRESSURE_MIN 0
#define PRESSURE_MAX 50

#define PHDR 0xa400012e
#define SCPDR 0xa4000136

//#define HP680_TS_IRQ 35
//#define HP680_TS_IRQ 36

#define REFR_TIME (HZ / 15)
struct timer_list timer;
//struct my_param *par = (struct my_param *)param;

//static void do_softint(struct work_struct *work);

static struct input_dev *hp680_ts_dev;

unsigned short ADS7843_read(unsigned char mode);

unsigned short ADS7843_read(unsigned char mode)
{
char i;
unsigned short data;
/* nuc900_gpio_set_input(GPIO_GROUP_D, 8); //DOUT
nuc900_gpio_set_input(GPIO_GROUP_E, 13); //CLK
nuc900_gpio_set_input(GPIO_GROUP_H, 0); //DIN
nuc900_gpio_set_input(GPIO_GROUP_H, 1); //CS
nuc900_gpio_set(int group, int num, int state) */
nuc900_gpio_set(GPIO_GROUP_E, 13, 0);
// gpio_set_value(TS_CLK,0);
nuc900_gpio_set(GPIO_GROUP_H, 0, 0);
// gpio_set_value(TS_DIN,0);
nuc900_gpio_set(GPIO_GROUP_E, 13, 0);
// gpio_set_value(TS_CS,0);

mode|=0x80;//set start bit
for(i=0;i<8;i++)
{
if((mode&0x80)!=0)
nuc900_gpio_set(GPIO_GROUP_H, 0, 1);
// gpio_set_value(TS_DIN,1);
else
nuc900_gpio_set(GPIO_GROUP_H, 0, 0);
// gpio_set_value(TS_DIN,0);
nuc900_gpio_set(GPIO_GROUP_H, 0, 0);

nuc900_gpio_set(GPIO_GROUP_E, 13, 1);
nuc900_gpio_set(GPIO_GROUP_E, 13, 0);
// gpio_set_value(TS_CLK,1);
// gpio_set_value(TS_CLK,0);
mode=mode<<1;
}
udelay(10);
nuc900_gpio_set(GPIO_GROUP_E, 13, 1);
nuc900_gpio_set(GPIO_GROUP_E, 13, 0);
// gpio_set_value(TS_CLK,1);
// gpio_set_value(TS_CLK,0);
for(i=0;i<7;i++)
{
data|=nuc900_gpio_get(GPIO_GROUP_D, 8); //gpio_get_value(TS_DOUT);
nuc900_gpio_set(GPIO_GROUP_E, 13, 1);
nuc900_gpio_set(GPIO_GROUP_E, 13, 0);
// gpio_set_value(TS_CLK,1);
// gpio_set_value(TS_CLK,0);
data=data<<1;
}
data|=nuc900_gpio_get(GPIO_GROUP_D, 8); //gpio_get_value(TS_DOUT);

nuc900_gpio_set(GPIO_GROUP_H, 1, 1);
// gpio_set_value(TS_CS,1);
return data;
}

/*static DECLARE_DELAYED_WORK(work, do_softint);


static void do_softint(struct work_struct *work)
{
int absx = 0, absy = 0;
u8 scpdr;
int touched = 0;

if (ctrl_inb(PHDR) & PHDR_TS_PEN_DOWN) {
scpdr = ctrl_inb(SCPDR);
scpdr |= SCPDR_TS_SCAN_ENABLE;
scpdr &= ~SCPDR_TS_SCAN_Y;
ctrl_outb(scpdr, SCPDR);
udelay(30);

absy = adc_single(ADC_CHANNEL_TS_Y);

scpdr = ctrl_inb(SCPDR);
scpdr |= SCPDR_TS_SCAN_Y;
scpdr &= ~SCPDR_TS_SCAN_X;
ctrl_outb(scpdr, SCPDR);
udelay(30);

absx = adc_single(ADC_CHANNEL_TS_X);

scpdr = ctrl_inb(SCPDR);
scpdr |= SCPDR_TS_SCAN_X;
scpdr &= ~SCPDR_TS_SCAN_ENABLE;
ctrl_outb(scpdr, SCPDR);
udelay(100);
touched = ctrl_inb(PHDR) & PHDR_TS_PEN_DOWN;
}

if (touched) {
input_report_key(hp680_ts_dev, BTN_TOUCH, 1);
input_report_abs(hp680_ts_dev, ABS_X, absx);
input_report_abs(hp680_ts_dev, ABS_Y, absy);
} else {
input_report_key(hp680_ts_dev, BTN_TOUCH, 0);
}

absx=100;
absy=100;
input_report_key(hp680_ts_dev, BTN_TOUCH, 1);
input_report_abs(hp680_ts_dev, ABS_X, absx);
input_report_abs(hp680_ts_dev, ABS_Y, absy);

input_sync(hp680_ts_dev);
enable_irq(HP680_TS_IRQ);
}

static irqreturn_t hp680_ts_interrupt(int irq, void *dev)
{
disable_irq_nosync(irq);
schedule_delayed_work(&work, HZ / 20);

return IRQ_HANDLED;
}
*/
static void my_timer(unsigned long param)
{
struct my_param *par = (struct my_param *)param;
int absx = 0, absy = 0, pressure=0;
int x1,x2,y1,y2;
x1=ADS7843_read(READ_X);
y1=ADS7843_read(READ_Y);
x2=ADS7843_read(READ_X);
y2=ADS7843_read(READ_Y);
if((abs(x1-x2)<2 && abs(y1-y2)<2) && (y2<240) && (y2>15) && (x2>8) && (x2<245))
{
absx=x2;
absy=y2;
input_report_key(hp680_ts_dev, BTN_TOUCH,1);
input_report_abs(hp680_ts_dev, ABS_X, absx);
input_report_abs(hp680_ts_dev, ABS_Y, absy);
printk("BTN_TOUCH = %d\r\nABS_X = %d\r\nABS_Y = %d", BTN_TOUCH, absx, absy);
}


mod_timer(&timer, jiffies + REFR_TIME);
}

static int __init hp680_ts_init(void)
{
int err;
printk("INIT TOUCH SCREEN");
init_timer(&timer);
timer.function= my_timer;
timer.expires = jiffies + REFR_TIME;
add_timer(&timer);

hp680_ts_dev = input_allocate_device();
if (!hp680_ts_dev)
return -ENOMEM;


hp680_ts_dev->name = "HP Jornada touchscreen";
hp680_ts_dev->phys = "ts0";

hp680_ts_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY);
hp680_ts_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);

input_set_abs_params(hp680_ts_dev, ABS_X,
HP680_TS_ABS_X_MIN, HP680_TS_ABS_X_MAX, 0, 0);
input_set_abs_params(hp680_ts_dev, ABS_Y,
HP680_TS_ABS_Y_MIN, HP680_TS_ABS_Y_MAX, 0, 0);
// input_set_abs_params(hp680_ts_dev, ABS_PRESSURE,
// PRESSURE_MIN, PRESSURE_MAX, 0, 0);

// hp680_ts_dev->phys = "input0";

/* if (request_irq(HP680_TS_IRQ, hp680_ts_interrupt,
IRQF_DISABLED, MODNAME, 0) < 0) {
printk(KERN_ERR "hp680_touchscreen.c: Can't allocate irq %d\n",
HP680_TS_IRQ);
err = -EBUSY;
goto fail1;
}*/

err = input_register_device(hp680_ts_dev);
if (err)
goto fail2;
nuc900_gpio_set_input(GPIO_GROUP_D, 8); //DOUT
nuc900_gpio_set_input(GPIO_GROUP_E, 13); //CLK
nuc900_gpio_set_input(GPIO_GROUP_H, 0); //DIN
nuc900_gpio_set_input(GPIO_GROUP_H, 1); //CS
/* at91_set_GPIO_periph(TS_PENIRQ,1);
gpio_direction_input(TS_PENIRQ);
at91_set_GPIO_periph(TS_DOUT,1);
gpio_direction_input(TS_DOUT);
at91_set_GPIO_periph(TS_BUSY,1);
gpio_direction_input(TS_BUSY);
at91_set_GPIO_periph(TS_CS,1);
gpio_direction_output(TS_CS,1);
at91_set_GPIO_periph(TS_DIN,1);
gpio_direction_output(TS_DIN,1);
at91_set_GPIO_periph(TS_CLK,1);
gpio_direction_output(TS_CLK,1);*/

// udelay(1000);

return 0;

fail2: //free_irq(HP680_TS_IRQ, NULL);
// cancel_delayed_work(&work);
// flush_scheduled_work();
// fail1:
input_free_device(hp680_ts_dev);
return err;
}

static void __exit hp680_ts_exit(void)
{
// free_irq(HP680_TS_IRQ, NULL);
// cancel_delayed_work(&work);
// flush_scheduled_work();
input_unregister_device(hp680_ts_dev);
}

module_init(hp680_ts_init);
module_exit(hp680_ts_exit);

MODULE_AUTHOR("Andriy Skulysh, [mail=askulysh@image.kiev.ua]askulysh@image.kiev.ua[/mail]");
MODULE_DESCRIPTION("HP Jornada 680 touchscreen driver");
MODULE_LICENSE("GPL");
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 29.04.2010 23:00 Сообщение: 34
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
вполне гуд - ядро не в кору не выпадает, драйвер грузится. что не работает - так это нормально, все по Мэрфи :)
теперь пройтись по всей цепочке и выловить ошибку
я бы начал с проверки электрической части - убедился, что соответствующие контакты чипа TS попадают на нужные пины АРМа
потом проверка правильности конфигурации этих пинов - те ли и нет ли конфликтов с другими драйверами
потом логику общения с чипом TS
потом что с него вообще читается
потом видимо таймер и прерывание (я пока не понял как тут реализовано - похоже программно)

собственно, завтра, если не будет форсмажоров припаяю проводки и тоже попробую покрутить драйвер, авось что-нить путное получится :)

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 29.04.2010 23:21 Сообщение: 35
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
меня сперва осенило где я накосячил, а потом прочитал ваше сообшение про электрическую часть... там правда косяк! пины с точностью да наобарот припаяны :-) завтра перепишу драйвер и проверю еще разочек! думаю все будет нормуль!
реализовано тупо в лоб - с переодичностью срабатывает таймер и если нажатие произошло пишется в файл-устройства... у меня их почемуто сразу два в /dev : ts0, ts1
спасибо за подсказки
завтра еще выложу какие пины к каким я подключал...оставайтесь на линии :-)
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 30.04.2010 07:37 Сообщение: 36
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
Еще замечена ошибка в драйвере, не правильно настроены три пина (CS и DIN и CLK). Они настроены на ввод, а должны быть на вывод... поправить не сложно
PS: предвкушаю вазяканье пальцем по экрану :-)
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 30.04.2010 10:36 Сообщение: 37
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
пробросил 4 проводка, собрал драйвер, подгружаю, пока тишина
исправил замеченную ошибку настройки пинов CS, CLK, DOUT
еще надо тщательно исправить в п/п ADS7843_read
шевеление пинами
общая логика работы с SPI устройством обычно следующая, например для записи:
выставляется в 0 сигнал CS, выставляется уровень пина DOUT в сторону слейва, потом делается перепад пина CLK и так необходимое число раз, в конце сеанса CS->1

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 30.04.2010 10:53 Сообщение: 38
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
вроде бы этот алгоритм который в опубликованном драйвере работает на Atmel 9200...
сегодня вечером отпишусь о своих результатах... если получиться добраться до платки
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 30.04.2010 11:40 Сообщение: 39
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
согласен, что закомментаренные строчки должны работать на 9260, но, например вот такая конструкция не будет работать:

Код
if((mode&0x80)!=0)
nuc900_gpio_set(GPIO_GROUP_H, 0, 1);
// gpio_set_value(TS_DIN,1);
else
nuc900_gpio_set(GPIO_GROUP_H, 0, 0);
// gpio_set_value(TS_DIN,0);
nuc900_gpio_set(GPIO_GROUP_H, 0, 0);


пин data_out всегда будет в нуле..

короче, пока копаюсь с настройкой пинов и функцией чтения

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 30.04.2010 15:56 Сообщение: 40
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
есть некий положительный результат:

Код
ABS_Y = 80BTN_TOUCH = 330
ABS_X = 55
ABS_Y = 110BTN_TOUCH = 330
ABS_X = 84
ABS_Y = 154BTN_TOUCH = 330
ABS_X = 123
ABS_Y = 176BTN_TOUCH = 330
ABS_X = 144
ABS_Y = 144
armets:~#

из печального, по необъяснимой (пока) причине в момент загрузки драйвера TS отсыхает консоль при попытке
nuc900_gpio_configure(GPIO_GROUP_E, 13);
разглядывание даташита вывело на то, что этот пин связан с группой пинов УАРТов.
тем не менее, лог останавливается, но загрузка проходит до консоли экрана и можно работать с клавиатурой
пробую поднять поддержку TS в иксах, пока безуспешно.. исследования в инете показали море проблемм у юзеров на больших братьях - ничего нового :)

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Отладочные платы » SK-MNUC950