Перейти к содержимому


Фото

Доступ к регистрам СОМ порта


  • Чтобы отвечать, сперва войдите на форум
8 ответов в теме

#1 Kir7

Kir7

    Newbie

  • Members
  • Фишка
  • 6 Сообщений:

Опубликовано 09.01.2009 - 06:27

Проблема такая, решил к своему КПК программатор сделать. Естественно через СОМ. На ББ всё понятно , накропал драйвер и всё ОК. Сдесь , в тупике. Как в этой винде найти адрес порта, возможен ли доступ к его регистрам из юзер мода, насколько эта винда многозадачная (то есть можно ли мерить короткие промежутки времени с достаточной точностью например с помощью QueryPerformanceCounter и будет ли кто-то перебивать мой процесс) ? В нете по этой теме вообще ничего. Видел что-то про платформ булдер , но как понял это не для меня. Качать его , он весит как вся моя коллекция порнухи. К концу закачки я постарею окончательно. При том триал. А покупать для баловства, сами понимаете. Видел, даже качнул WinDriver CE, но это какая то карявая вещица. Её драйвер загрузить на устройство не получилось. Так что помогите кто чем может.

#2 Stas Pavlov

Stas Pavlov

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 4 093 Сообщений:
  • МестоположениеМосква

Опубликовано 11.01.2009 - 13:19

Сомневаюсь, что вашу задачу можно решить без Platfrom Builder, но попробовать можно.

В целом, на все вопросы - ответ  - да, с определнными ньюансами.



#3 Mobmax

Mobmax

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 1 326 Сообщений:

Опубликовано 04.02.2009 - 05:05

Попытаюсь рассказать более технически. Идея следующая. Для того чтоб написать программатор надо хорошо знать железо своего КПК (или той машинки, которая будет выступать в роли "думателя"). Из этого описания получается понимание, как работать с железом, доступ из приложения к железу максимально простой для этого есть VirtalAlloc через который отображаем железные порты в адресное пространство приложения и начинаем их иметь. Если нужна обработка прерываний, то придется писать драйвер (частный случай DLL с несколькими обязательными экспортируемыми функциями). Ну еще в реестре надо будет запретить стандартный драйвер (чтоб не лез и не мешался). Что касается многозадачности то в процессе программирования (не разработки приложения, а работы приложения которое программирует) можно обходиться двумя способами, взять все время на себя или работать по прерываниям (почти все железо имеет быстрые таймеры от которых можно правильно засинхронизироваться). Вот в общем случае алгоритм. Чтоб все это делать в качестве средств разработки хватит вполне eVC или Visual Studio, но тут придется надеяться только на собственные силы (взяв Platform Builder, можно смотреть на примеры и делать как там, например посмотрев в исходные тексты драйвера последовательного порта).
Еще раз - два необходимых условия - описание на железо и уменее его программировать.
Средства разработки тут вещь не столь принципиальная.



#4 Kir7

Kir7

    Newbie

  • Members
  • Фишка
  • 6 Сообщений:

Опубликовано 07.02.2009 - 07:10

Вот теперь спасибо за ответ. В принципе программатор уже написал, пришлось работать стандартными средствами Visual Studio. В принципе всё работает. Но вылезла очень неприятная проблема. КПК RX1950, по моиму это важно. Проблема такая, прога открывает порт, дёргает биты на DTR,RTS и слушает CTS, закрывает порт. В сам порт ничего не пишет оттуда не читает . При первом включении всё работает прекрасно, CTS читается верно. Только почему-то при любом уровне на DSR она читает оттуда ноль, хотя мне неважна эта нога. Если закрыть программу а потом окрыть, то при любом уровне на CTS она читает оттуда единицу. Лечится только софтрезетом. Кстати, если после софтрезета (когда всё должно работать) не запуская прогу, выклычить КПК то появляется тот-же косяк. Пробовал перепускать драйвер ser2410.dll , непомогает , и опять вылезает эта проблема.На эмуляторе всё работает на ура. Подозрение на кривость драйвера КПК. Единственное решение вижу, прямой доступ к железу. Вы пишете , это можно организовать с помощью функции VirtalAlloc. Можно ли поподробнее? В реестре написано
IoBase=0x50004000
IoLen=0x2C
отсюда как понимаю и надо плясать.

#5 Mobmax

Mobmax

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 1 326 Сообщений:

Опубликовано 07.02.2009 - 10:26

Начинать надо с Samsung S3C2410 Datasheet. Там есть описание процессора. Что касается IoBase в реестре, то для процессоров с подобной архитектурой это значение может быть с потолка.
Что касается стандартного драйвера то, описанные проблемы типичные... они там пытаются эмулировать 16550 со всеми вытекающими последствиями. Что касается VirtualAlloc, то тут лучше всего смотреть документацию, например тут: http://msdn.microsof...y/aa450975.aspx


#6 Kir7

Kir7

    Newbie

  • Members
  • Фишка
  • 6 Сообщений:

Опубликовано 08.02.2009 - 04:37

Непойму, в чём ошибка. Практически по всем адресам возвращает нули. Пробовал перебирать с нулевого до 0x50000000, только в одном месте считалась десятка два каких-то значений. Пробовал на эмуляторах WM 5.0 , CE 5.0 и на девайсе WM 5.0. Везде одно и тоже.

[DllImport("Coredll.dll")]
extern public static bool VirtualCopy(UInt32 lpvDest, UInt32 lpvSrc,
UInt32 cbSize, PageAccessFlags fdwProtect);

[DllImport("Coredll.dll")]
extern public static UInt32 VirtualAlloc(UInt32 lpAddress, UInt32
dwSize, MemUsageFlags flAllocationType, PageAccessFlags
flProtect);

[DllImport("Coredll.dll")]
extern public static bool VirtualFree(UInt32 lpAddress, UInt32 dwSize,
MemUsageFlags dwFreeType);

UInt32 PHYSADDR = 0x50000000;
UInt32 SIZE = 4800 * 1;
UInt32 lpv;
bool bRet;

lpv = VirtualAlloc(0, SIZE, MemUsageFlags.MEM_RESERVE, PageAccessFlags.PAGE_NOACCESS);

bRet = VirtualCopy(lpv, PHYSADDR, SIZE, PageAccessFlags.PAGE_READWRITE |
PageAccessFlags.PAGE_NOCACHE | PageAccessFlags.PAGE_PHYSICAL);

if (bRet)
{
byte[] ar = new byte[SIZE];
Marshal.Copy((IntPtr)lpv, ar, 0, (Int32)SIZE);
Stream st = new FileStream("\\Storage Card\\Damp.bin", FileMode.OpenOrCreate);
st.Write(ar, 0, (Int32)SIZE);
st.Close();
}


#7 Mobmax

Mobmax

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 1 326 Сообщений:

Опубликовано 09.02.2009 - 08:30

Это кусок из документации на Samsung:

There are three UART line control registers including ULCON0, ULCON1, and ULCON2 in the UART block.
Register Address R/W Description Reset Value
ULCON0 0x50000000 R/W UART channel 0 line control register 0x00
ULCON1 0x50004000 R/W UART channel 1 line control register 0x00
ULCON2 0x50008000 R/W UART channel 2 line control register 0x00

UART CONTROL REGISTER
There are three UART control registers including UCON0, UCON1 and UCON2 in the UART block.
Register Address R/W Description Reset Value
UCON0 0x50000004 R/W UART channel 0 control register 0x00
UCON1 0x50004004 R/W UART channel 1 control register 0x00
UCON2 0x50008004 R/W UART channel 2 control register 0x00

UART FIFO CONTROL REGISTER
There are three UART FIFO control registers including UFCON0, UFCON1 and UFCON2 in the UART block.
Register Address R/W Description Reset Value
UFCON0 0x50000008 R/W UART channel 0 FIFO control register 0x0
UFCON1 0x50004008 R/W UART channel 1 FIFO control register 0x0
UFCON2 0x50008008 R/W UART channel 2 FIFO control register 0x0


UART MODEM CONTROL REGISTER
There are two UART MODEM control registers including UMCON0 and UMCON1 in the UART block.
Register Address R/W Description Reset Value
UMCON0 0x5000000C R/W UART channel 0 Modem control register 0x0
UMCON1 0x5000400C R/W UART channel 1 Modem control register 0x0
Reserved 0x5000800C - Reserved Undef


UART TX/RX STATUS REGISTER
There are three UART Tx/Rx status registers including UTRSTAT0, UTRSTAT1 and UTRSTAT2 in the UART block.
Register Address R/W Description Reset Value
UTRSTAT0 0x50000010 R UART channel 0 Tx/Rx status register 0x6
UTRSTAT1 0x50004010 R UART channel 1 Tx/Rx status register 0x6
UTRSTAT2 0x50008010 R UART channel 2 Tx/Rx status register 0x6


UART ERROR STATUS REGISTER
There are three UART Rx error status registers including UERSTAT0, UERSTAT1 and UERSTAT2 in the UART
block.
Register Address R/W Description Reset Value
UERSTAT0 0x50000014 R UART channel 0 Rx error status register 0x0
UERSTAT1 0x50004014 R UART channel 1 Rx error status register 0x0
UERSTAT2 0x50008014 R UART channel 2 Rx error status register 0x0


UART FIFO STATUS REGISTER
There are three UART FIFO status registers including UFSTAT0, UFSTAT1 and UFSTAT2 in the UART block.
Register Address R/W Description Reset Value
UFSTAT0 0x50000018 R UART channel 0 FIFO status register 0x00
UFSTAT1 0x50004018 R UART channel 1 FIFO status register 0x00
UFSTAT2 0x50008018 R UART channel 2 FIFO status register 0x00

UART MODEM STATUS REGISTER
There are two UART modem status registers including UMSTAT0 and UMSTAT1 in the UART block.
Register Address R/W Description Reset Value
UMSTAT0 0x5000001C R UART channel 0 Modem status register 0x0
UMSTAT1 0x5000401C R UART channel 1 Modem status register 0x0
Reserved 0x5000801C – Reserved Undef


UART TRANSMIT BUFFER REGISTER (HOLDING REGISTER & FIFO REGISTER)
There are three UART transmit buffer registers including UTXH0, UTXH1 and UTXH2 in the UART block.
UTXHn has an 8-bit data for transmission data.
Register Address R/W Description Reset Value
UTXH0 0x50000020(L)
0x50000023(B)
W
(by byte)
UART channel 0 transmit buffer register –
UTXH1 0x50004020(L)
0x50004023(B)
W
(by byte)
UART channel 1 transmit buffer register –
UTXH2 0x50008020(L)
0x50008023(B)
W
(by byte)
UART channel 2 transmit buffer register –

UART RECEIVE BUFFER REGISTER (HOLDING REGISTER & FIFO REGISTER)
There are three UART receive buffer registers including URXH0, URXH1 and URXH2 in the UART block.
URXHn has an 8-bit data for received data.
Register Address R/W Description Reset Value
URXH0 0x50000024(L)
0x50000027(B)
R
(by byte)
UART channel 0 receive buffer register –
URXH1 0x50004024(L)
0x50004027(B)
R
(by byte)
UART channel 1 receive buffer register –
URXH2 0x50008024(L)
0x50008027(B)
R
(by byte)
UART channel 2 receive buffer register –

UART BAUD RATE DIVISOR REGISTER
There are three UART baud rate divisor registers including UBRDIV0, UBRDIV1 and UBRDIV2 in the UART block.
The value stored in the baud rate divisor register (UBRDIVn), is used to determine the serial Tx/Rx clock rate (baud
rate) as follows:
UBRDIVn = (int)(PCLK / (bps x 16) ) –1
or
UBRDIVn = (int)(UEXTCLK / (bps x 16) ) –1
Where, the divisor should be from 1 to (216-1) and UEXTCLK should be smaller than PCLK.
For example, if the baud-rate is 115200 bps and PCLK or UEXTCLK is 40 MHz, UBRDIVn is:
UBRDIVn = (int)(40000000 / (115200 x 16) ) -1
= (int)(21.7) -1
= 21 -1 = 20
Register Address R/W Description Reset Value
UBRDIV0 0x50000028 R/W Baud rate divisior register 0 –
UBRDIV1 0x50004028 R/W Baud rate divisior register 1 –
UBRDIV2 0x50008028 R/W Baud rate divisior register 2 –

Остатльные детали в документации. Одно замечание, часть регистров работают только как слово, а чать только байтовые и эти правила обязательны иначе в результате чтения записи будут левые значения.





#8 Mobmax

Mobmax

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 1 326 Сообщений:

Опубликовано 09.02.2009 - 08:36

И еще очень рекомендую статейку: http://www.windowsfo...6839474863.html



#9 Kir7

Kir7

    Newbie

  • Members
  • Фишка
  • 6 Сообщений:

Опубликовано 10.02.2009 - 05:28

Спасибо за ответы. Даташ я уже давно скачал. Адреса портов как раз те что в реестре. Правда всё как не работало так и никак. Лазя по нету видал пару примеров, у меня вроде тоже самое, возможно вы правильно намекаете на необходимость использования функции VirtualSetAttributes но непойму вот эти её параметы (DWORD dwNewFlags, DWORD dwMask, LPDWORD lpdwOldFlags) что туда писать в моём случай, подскажите пожалуйста. Ещё ,объясните вот это
"0x10000000>>8" зачем такое проделывают с адресом,и надо ли мне это делать?


/* allocate dwBytes of virtual address space */
void *pVirtMem = VirtualAlloc(NULL,
dwBytes,
MEM_RESERVE,
0);

/* map the memory to physical address 0x10000000 (arbitrary) */
VirtualCopy(pVirtMem,
(void *)(0x10000000>>8), <<<----????????????????????????????????????
dwBytes,
PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE);

/* set the attributes on the pages */
VirtualSetAttributes(pVirtMem,
dwBytes,
0x13,
0x13,
NULL);





1 пользователей читают эту тему

0 members, 1 guests, 0 anonymous users