Перейти к содержанию
    

UniSoft

Свой
  • Постов

    209
  • Зарегистрирован

  • Посещение

  • Победитель дней

    4

Сообщения, опубликованные UniSoft


  1. А вторая запись разве их не перезаписывает?

    Нет конечно... все как выше написали... только из 1 в 0

    а у вас там итак будут нули, после первой записи 32-битного значения...

     

    просто, поменяйте просто местами Size и FIRMWARE_CRC16,

    ну или так, если требуется именно такая последовательность:

    page_address=FLASH_BASE+126*2048; 
    FLASH_Unlock();
    flash_status=FLASH_ErasePage(page_address);
    flash_status=FLASH_ProgramWord(page_address, (Size << 16) | FIRMWARE_CRC16);
    flash_status=FLASH_ProgramWord(page_address+4,Size >> 16);
    FLASH_Lock();

  2. То есть подписанный cat вам вообще не нужен?

    не нужен... на win8 и выше драйвер вообще будет не нужен... (он уже есть в системе начиная с win8)

    воткнули устройство драйвер автоматом установился...

    Более старые системы (win7 и ниже), после подключения устройства, попытаются подгрузить драйвер с microsoft update,

    если этого еще не было сделано ранее, при отсутствии же коннекта тогда понадобится драйвер (для оффлайн установки)

    (он уже ставится даже без подписанного cat, конечно будет предупреждение о не подписанном драйвере)

    Минус только один, при автоматической установке драйвера, устройство будет отображаться как WinUSB Device в диспетчере устройств.

     

    более подробно про WCID, можно почитать тут:

    https://github.com/pbatard/libwdi/wiki/WCID-Devices

     

    По поводу всего остального — да не важно это всё, важно найти ответ главную проблему, описанную в первом посте.

    По поводу вашей проблемы, сложно что-либо сказать... все зависит от реализации...

    У себя с устройством на HS проблем не замечал...

    У меня так, отдельный тред постоянно слушает устройство и пишет данные в буфер... софтина уже оттуда все забирает...

  3. Но именно это нормальный человек и подразумевает под одновременным подключением.

    Я не могу даже представить тип устройства, где нужен именно одновременный доступ с разных приложений...

    Но если где это и нужно, то можно легко это обойти, при желании...

    Ну что-нибудь типа приложения сервера/службы, все равно же в таких устройствах нужен будет какой-то тип синхронизации,

    между приложениями, которые общаются с устройством.

     

    Ну и не верно. Нужно подписывать.

    Если только вы не взяли уже подписанный cat от другого устройства и заюзали его с его же видом-пидом и всем остальным.

    Но у меня же работает (со своими VID-PID!), причем коммерческий проект... все дело в WCID

     

    Да? Можете предъявить пример такого прожекта, который компилится без сдк и без выдранного из него мусора, если даже в доке на винусб об этом сказано? Мне не удалось.

    Откройте исходник libusb, в чем проблема?

    libusb-1.0.21.zip\libusb-1.0.21\libusb\os\windows_winusb.c; windows_winusb.h

    пожалуйста, динамическая линковка winusb, так что даже родной winusb.lib не нужен...

    а в windows_winusb.h определение функций и структур, так что даже родной winusb.h не нужен...

     

     

  4. К тому же, нельзя подключить одновременно более одного устройства.

    Ну это не так! Подключать можно много устройств и со всеми можно работать...

    Ограничение лишь в монопольном доступе, т.е. только одно приложение сможет открыть устройство и работать с ним, в момент времени.

    А если устройство еще и WCID, то и дровишки будут автоматически устанавливаться.

    В win7 драйвер поставится c сервера обновлений (при наличии сети), а в win10 он уже встроен,

    и даже подписывать драйвер не требуется.

     

    для WinUSB же нужно или SDK ставить, или массу всякого SDKшного мусора к себе в прожект перетаскивать.

    Ну это тоже не так, вся работа заключена в одной winusb.dll

    Если линковать статически, то да, нужен будет *.lib файл из SDK (хотя его можно и сгенерить самому).

    Никакого мусора в проект там не перетаскивается, чистые winAPI функции.

     

    Ну и немного добавлю про libusb

    Она добавляет куда больше мусора в проект ибо является надстройкой над WinUsb

  5. А можно поподробнее?) Как и что он оптимизирует?

    за подробностями вам лучше к стандартам си обратиться.

    что оптимизирует? у вас массив из 11 элементов - локальная переменная,

    которая инициализируется неким значением,

    итого на заполнение этого массива поэлементно потребовалось бы как минимум 22 инструкции,

    а так всего 4 простым копированием.

    А вот как оптимизирует, все зависит от компилятора.

     

  6. Помогите ответить на вопрос:

     

    0x08000530 F000F878 BL.W __aeabi_memcpy4 (0x08000624)

     

    А как вы думаете, зачем компилятор вставил вызов этой функции, хотя в вашем коде на С вызова нет?

    так это оптимизация,

    а как он еще такое должен был реализовать?

    int32_t mass1 [11] = {55,36,3,67,84,123,53,7,47,65,217};

  7. странно, я BSOD'ов не помню у USBTrace

    под x32 тоже не видел, а в x64 постоянно... причем не сразу, а может и на второй день рухнуть (если не перезагружались)...

    По этой же причине я и отказался от него...

     

    Я авторам отписывал о проблеме, скидывал дамп...

    Thanks for sending us the dump file. This is a know issue of the product on certain 64 bit systems. We hope to find a solution for this in the upcoming update of the software.

     

    Thanks again for your feedback.

     

    Best Regards,

    Vyas

    USBTrace Support Engineer

    [email protected]

    Но с выходом новой версии, проблема осталась... :(

     

    а вот USBlyzer не нашел с пилюлькой :(

    а старая пилюлька от EDGE подходит...

    _http://rghost.ru/40780035

  8. Для подобных целей как-то использовал WinHex/X-Ways Forensics. Умеет читать файлы разных форматов, что-то изменить при необходимости, и генерить С/Pascal строки.

    Есть еще хороший HEX редактор 010 Editor, также умеет экспортировать как С, и многие другие форматы,

    интегрируется в контекстное меню проводника,

    а для спец нужд можно свой скрипт написать на си-подобном языке,

    взять можно тут: _хттп://cracklab.ru/download.php?action=get&n=ODQ1

     

  9. ...стал определяться по Windows как ULINK-ME, и напрочь отказывается видеть JTAG цепи АРМ. Важно, что под Keil'ом он по-прежнему виден как ULINK2 с версией софта 1.40.

    думаю проблема в драйвере, просто возможно поставился драйвер от ulink-me,

    у них скорее всего одинаковый vid & pid (так как, в keil я не вижу отдельного драйвера для ulink-me),

    а точнее, там используется стандартный HID драйвер, просто разница в названии устройства в inf файле.

    так что, с этим не должно быть проблемы.

     

    А вот с тем, что не видит ARM, нужно глубже разбираться.

    но, для начала, все-же попробуйте сначала удалить устройство, и заново поставить.

  10. Заменил на 0х00, получил 0хF5.

    Подсчитайте, пожалуйста по точно рабочему алгоритму. Может не правильно считано

    Считано правильно,

    А процедура подсчета у меня так реализована... (хотя фактически это тоже самое, только сдвиг в другую сторону, и соответственно полином перевернут)

    unsigned char Crc8(unsigned char *pcBlock, unsigned char len) {
        unsigned char crc=0;
        unsigned char i;
    
        while (len--) {
            crc^=*pcBlock++;
            for(i=0;i<8;i++)
                crc=crc&1?(crc>>1)^0x8C:crc>>1;
        }
        return crc;
    }

     

    и еще, может вызов неверный,

    CRC8=Crc8(mas[0],7);

    разве не так нужно?

    CRC8=Crc8(&mas[0],7); или так: CRC8=Crc8(mas,7);

     

    вкладываю мою программку калькулятор, сам писал для PC, правда на ассемблере...

    если конечно кому-то нужно

    crc8sn.rar

  11. задача: считывать отпределенную последовательность битов сигнальной информации тфоп с помощью усб порта. протоколировать все проишествия

    Вы что-то явно путаете, таких "происшествий" на USB нету...

    если интересно понять, как работает USB, вот тут описано, и довольно кратко, правда на английском.

    http://www.usbmadesimple.co.uk/index.html

  12. Спасибо! Да, поддерживает, да есть USB. Но твм другая беда: trial version with nag screen. Как я понимаю на долгую и плодотворную работу расчитывать не приходится?

    есть, такое...

    но можно на-гуглить вот такие ссылки...

    http://www.dumpz.ru/showpost.php?p=533673&postcount=390

    http://rapidshare.com/files/294620815/nrCo..._7-2010_-_FS.7z

    http://www.onlinedisk.ru/file/244810/

     

    Хотелось бы прояснить вопросы программирования при использовании FTDI микросхем. Там драйвер не есть проблема и серийные номера там я думаю тоже все разные. А как писать ПО со стороны ПК? Как произвести обмен пакетами? FTDI это CDC как я понимаю?

    Нет, FTDI это не CDC класс...

    А работать с FTDI вообще просто, одно удовольствие...

    они могут работать в двух режимах, либо как виртуальный ком порт, либо как D2XX устройство.

    Конфигурация (VID, PID, и режимы) программируются в eeprom, обычно весит снаружи,

    но есть и с внутренней eeprom'кой (обозначены как R, например FT232R, и в них, кстати, есть уникальный серийный номер, можно использовать для защиты от копирования)...

     

    В режиме ком порта, работать можно как с обычным ком портом...

    А в режиме D2XX, ftdichip предоставляют свой набор api функций в DLL, работа через которые намного упрощается...

    У них на сайте http://www.ftdichip.com есть и вся необходимая документация, а также множество примеров, под разные компиляторы.

  13. Тут выяснился вопрос. Если устройство выключить/включить, то работает и ваш вариант, и мой.

    Но только на один раз.

    Например, нужно послать команды (и получить ответ после каждой)

    00 FF FF 01 F0 A6 10 47

    00 FF FF 01 03 00 04 06

    00 FF FF 01 F0 F0 0A 0B

     

    На первую команду устройство отвечает, а на остальные - тишина.

    Устройство больше не реагирует на команды от нашей проги. Нужно его выключить/включить - и оно опять работает на одну команду.

     

     

    Самое интересное, что фирменная прога отлично пашет даже когда железка якобы зависла (не отвечала на самописную программку).

     

    Т.е. как по мне, дело не в железке...

    Ну тут уже нужно более детально анализировать протокол обмена...

    А там точно не используются дополнительные сигналы порта, как DTR и/или RTS???

    либо программный контроль через BREAK??? не зря они там есть...

    А не отвечает, значит чего-то ждет, может нужно дрыгнуть какой ногой порта, либо может то самое дрыгание BREAK'ом...

     

    Самое интересное, что фирменная прога отлично пашет даже когда железка якобы зависла

    Это еще раз подтверждает, что устройство как-то перезапускается... и скорее всего это один из сигналов...

     

    00 FF FF 01 F0 A6 10 47

    а последний байт в командах это CRC (XOR всех байт) ;)

     

    Для более подробной информации нужно глубже копать само устройство

  14.     if (!WriteFile (hCom, &command_mem_request, 8, &dwBytes, &o))
        {
            printf ("WriteFile failed with error %d.\n", GetLastError());
            return;    
        }

     

    WriteFile failed with error 997.

     

    Сейчас попробую сам поразбираться...

    упс, конечно-же, я не туда прописал константу

     

        hCom = CreateFile( pcCommPort,
            GENERIC_READ | GENERIC_WRITE,
            NULL, // must be opened with exclusive-access
            NULL, // no security attributes
            OPEN_EXISTING, // must use OPEN_EXISTING
            0, // not overlapped I/O
            FILE_FLAG_OVERLAPPED //  [color="#FF0000"][b]<<<< Вот тут ошибся[/b][/color]
            );

     

    надо так

     

        hCom = CreateFile( pcCommPort,
            GENERIC_READ | GENERIC_WRITE,
            NULL, // must be opened with exclusive-access
            NULL, // no security attributes
            OPEN_EXISTING, // must use OPEN_EXISTING
            FILE_FLAG_OVERLAPPED , // not overlapped I/O
            NULL //  
            );

  15. вот так должно работать

     

    #include <windows.h>
    #include <stdio.h>
    
    HANDLE hCom;
    
    
    char *pcCommPort = "\\\\.\\COM1";
    
    int comport_read(HANDLE hPort,char *buffer,int cnt,int timeout)
    {
    DWORD dwErr;
    OVERLAPPED o;
    COMSTAT cstat;
    int BytesReaded = 0;
    int tmo = GetTickCount();
    
    while ( (GetTickCount() - tmo) < timeout )
    {
    	ClearCommError(hPort, &dwErr, &cstat);
    	if (cstat.cbInQue >= cnt) break;
    	Sleep(1);   // это нужно чтобы дать поработать другим процессам системы,
    			// а не занимать весь временной слот ожидая данные и тем самым не грузить систему
    }
    
    BytesReaded = cstat.cbInQue;
    if (BytesReaded > 0)
    {
    	if (BytesReaded > cnt) 
    		BytesReaded = cnt;
    
    	o.Internal		= 0;
    	o.InternalHigh	= 0;
    	o.loffset		= 0;
    	o.OffsetHigh	= 0;
    	o.hEvent		= 0;
    
    	// можно и так
    	// memclr(&o,0,sizeof(OVERLAPPED));
    
    	if (!ReadFile(hPort,buffer,BytesReaded,&BytesReaded,&o))
    	{
    		BytesReaded = 0;
    	}
    }
    return (BytesReaded);
    }
    
    
    void mem_read (char *buffer, WORD addr, unsigned char count)
    {
    unsigned char command_mem_request [8] = {
    	0, 0xFF, 0xFF, 1, 0xF0, 0xA6, 0x10, 0x47 };
    
    unsigned char buffer2 [300];
    OVERLAPPED o;
    
    PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
    
    // Зачем это - не знаю. 
    // В логе фирменной программы была установка/снятие BREAK
    //	SetCommBreak (hCom);
    //	ClearCommBreak (hCom);	
    
    // Запрос железке
    // обнулим структуру OVERLAPPED
    o.Internal		= 0;
    o.InternalHigh	= 0;
    o.loffset		= 0;
    o.OffsetHigh	= 0;
    o.hEvent		= 0;
    // можно и так
    // memclr(&o,0,sizeof(OVERLAPPED));
    WriteFile (hCom, @command_mem_request, 8, &dwBytes, &o);	
    if (dwBytes != 8) printf ("Error!!!\n");
    
    // Хотим ответ
    // По факту возможно получаем
    
    dwBytes = comport_read(hCom,&buffer2,32,5000); // << ждем ответ 5 секунд
    printf ("%u bytes read!\n", dwBytes);	  
    }
    
    
    int main(int argc, char *argv[])
    {
    unsigned char buffer, buffer_prev = 0xF0;
    COMMTIMEOUTS CommTimeouts;
    DCB dcb;
    
    hCom = CreateFile( pcCommPort,
    	GENERIC_READ | GENERIC_WRITE,
    	NULL, // must be opened with exclusive-access
    	NULL, // no security attributes
    	OPEN_EXISTING, // must use OPEN_EXISTING
    	0, // not overlapped I/O
    	FILE_FLAG_OVERLAPPED // hTemplate must be NULL for comm devices
    	);
    
    if (hCom == INVALID_HANDLE_VALUE)
    {
    	printf ("CreateFile failed with error %d.\n", GetLastError());
    	return (1);
    }
    
    if (!SetupComm (hCom, 1024, 300); )
    {
    	printf ("SetupComm with error %d.\n", GetLastError());
    	return (1);
    }
    
    if (!GetCommState (hCom, &dcb))
    {
    	printf ("GetCommState failed with error %d.\n", GetLastError());
    	return (1);
    }
    
    dcb.BaudRate = CBR_9600;
    dcb.ByteSize = 8; 
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;	 
    
    if (!SetCommState(hCom, &dcb))
    {
    	printf ("SetCommState failed with error %d.\n", GetLastError());
    	return (1);
    }
    
    PurgeComm(hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
    
    if (hCom != INVALID_HANDLE_VALUE && hCom != NULL)
    	printf ("COM1 cofigured!\n");
    
    mem_read (NULL, 0xA6F0, 0x10);
    
    return (0);
    }

  16. [12/02/2010 22:23:32]

    То ли порт как-то хитро инициализируется, то ли что.... =(

    А что за прога если не секрет?

    Если не большая, и написана не на каком-нибудь визуал басике или жаве, то я могу глянуть что там происходит.

×
×
  • Создать...