Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > физический адрес USB flash


Автор: piritus 20.9.2007, 14:29
Подскажите, пожалуйста, как узнать при помощи только прерываний BIOS узнать физический адрес USB flash-накопителя

Автор: 10110111 20.9.2007, 18:52
Для доступа к любому USB-девайсу надо программить хост-контроллер, к которому подрублен девайс. А насчет них - на сайты:
EHCI и UHCI - Intel
OHCI - <кто-то там, не знаю точно(гугл в помощь)>
Далее есть несколько протоколов работы юсб флешек, про них точно не скажу, т.к. сам еще в этом не разобрался.

Автор: piritus 20.9.2007, 18:56
привер бы, а то так хз что делать...

Автор: MAKCim 20.9.2007, 19:23
piritus
через PCI BIOS можно
http://www.ctyme.com/intr/rb-2373.htm
class code = 0Ch
subclass code = 03h
interface = FEh (или 00h, 10h, 20h, 80h)
после получения bus/device/function номеров
пользуемся
http://www.ctyme.com/intr/rb-2377.htm
и http://www.ctyme.com/intr/rb-2391.htm
для чтения и записи BAR-ов (Base Address Registers) устройства
да, вот еще, возьми datasheet на свой чипсет и почитай про USB контроллер (программирование, конфигурирование)


Автор: piritus 20.9.2007, 19:56
Благодарю.
SI = device index (0-n) как его узнать?
interface = FEh (или 00h, 10h, 20h, 80h) почему или-или?
как PCI будет искать устройства на USB?
я наверное не точно выразился... Нужно узнать серийный номер флешки, т.е. ее отличительная особенность (типа MAC'а на сетевых картах), программа, использующая привязку к железу...

Автор: MAKCim 20.9.2007, 21:10
Цитата(piritus @  20.9.2007,  19:56 Найти цитируемый пост)
SI = device index (0-n) как его узнать?

думаю, перебором
Цитата(piritus @  20.9.2007,  19:56 Найти цитируемый пост)
interface = FEh (или 00h, 10h, 20h, 80h) почему или-или?

разные номера интерфейсов соответствуют разным компонентам
00h    Universal Serial Bus (USB) following
               the Universal Host Controller
               Specification
10h    Universal Serial Bus (USB) following
               the Open Host Controller
               Specification
20h    USB2 host controller following the
               Intel Enhanced Host Controller
               Interface
80h    Universal Serial Bus with no specific
               programming interface
FEh    USB device (not host controller)
Цитата(piritus @  20.9.2007,  19:56 Найти цитируемый пост)
как PCI будет искать устройства на USB?

я ж говорю, при помощи PCI BIOS находишь USB контроллер
дальше по спецификации на чипсет с ним работаешь

Автор: piritus 21.9.2007, 07:33
почему в регистрах не передается адрес на буфер,
т.е. мне нужно считать "02h    WORD    device ID (read-only)" где он располагается в памяти?
для чего нужна спецификация на чипсет, если меня интересует device ID?

Автор: MAKCim 21.9.2007, 08:38
Цитата(piritus @  21.9.2007,  07:33 Найти цитируемый пост)
для чего нужна спецификация на чипсет, если меня интересует device ID? 

что управляет флеш-устройством?
контроллер USB
т. е чтобы получить информацию про какой-то конкретный девайс, нужно работать с контроллером шины, к которой этот девайс подключен
обычно наличие того или иного контроллера определяется чипсетом
потому и нужна спецификация

Автор: piritus 23.9.2007, 11:24
DI = register number (0000h-00FFh, must be multiple of 4) - как его узнать
02h    WORD    device ID (read-only) - как считать

Автор: MAKCim 23.9.2007, 11:49
Цитата(piritus @  23.9.2007,  11:24 Найти цитируемый пост)
DI = register number (0000h-00FFh, must be multiple of 4) - как его узнать

смещение в конфигурационном простанстве PCI устройства
в твоем случае PCI устройство - это USB контроллер
описание регистров конфигурационного пространства ищи в спецификации на чипсет
Цитата(piritus @  23.9.2007,  11:24 Найти цитируемый пост)
02h    WORD    device ID (read-only) - как считать 

это где?

Автор: piritus 23.9.2007, 11:58
Цитата(MAKCim @  23.9.2007,  11:49 Найти цитируемый пост)
это где?

в PCI BIOS v2.0c+ - READ CONFIGURATION DWORD 
после описания функции:

Format of PCI Configuration Data:

Offset  Size    Description     (Table 00878)
00h    WORD    vendor ID (read-only) (see #00732 at AX=B102h)
FFFFh returned if requested device non-existent
02h    WORD    device ID (read-only)
04h    WORD    command register (see #00879)
06h    WORD    status register (see #00880)
08h    BYTE    revision ID
09h  3 BYTEs   class code

Автор: MAKCim 23.9.2007, 12:37
piritus
каждое PCI устройство имеет конфигурационное пространство
по различным смещениям в нем храняться различные регистры, которые отвечают за включение/выключение определенных функций устройства и его идентификацию
Format of PCI Configuration Data:

Offset  Size    Description     (Table 00878)
00h    WORD    vendor ID (read-only) идентификатор производителя устройства (для Intel 8086h)
FFFFh returned if requested device non-existent
02h    WORD    device ID (read-only) идентификатор устройства для данного производителя
04h    WORD    command register (see #00879) включение/выключение различной функциональности
06h    WORD    status register (see #00880) регистр статуса устройства
08h    BYTE    revision ID
09h  3 BYTEs   class code


Автор: piritus 23.9.2007, 12:59
у меня по PCI Configuration Map (SMBUS-D31:F3)
00-01h        VID        Vendor ID        8086h    RO
02-03h    DID        Device ID        2413h    RO

т.е. что бы узнать DeviceID, register number должен быть равен 0000h, т.к. значение
должно быть кратно 4. Так?

тогда получится что-то типа:
Код

...
;PCI BIOS v2.0c+ - FIND PCI CLASS CODE
    mov si, 0ffh

find_index:
    mov ax, 0b103h
    mov ecx, 000c03feh
    inc si
    int 1ah
    
    cmp bl, 86h
    je find_index


;PCI BIOS v2.0c+ - READ CONFIGURATION DWORD
    mov ax, 0b10ah
    xor di, di
    int 1ah
...


но Device ID - это как я понял не ID flash-накопителя, а ID host контроллера USB и в моем случае дефолтным является значение: 2413h
как тогда узнать ID флешки?

Автор: MAKCim 23.9.2007, 14:39
piritus
Код

    xor    bh, bh ; bus number
    mov    bl, F8h ; device (bits 7-3) and function (bits 2-0) number
    xor    di, di ; register number
    mov    ax, B10Ah
    int    1Ah

Автор: piritus 23.9.2007, 14:46
пока я редактировал сообщение, ты уже ответил smile

у меня по PCI Configuration Map (SMBUS-D31:F3)
00-01h        VID        Vendor ID        8086h    RO
02-03h    DID        Device ID        2413h    RO

т.е. что бы узнать DeviceID, register number должен быть равен 0000h, т.к. значение
должно быть кратно 4. Так?

тогда получится что-то типа:
Код

...
;PCI BIOS v2.0c+ - FIND PCI CLASS CODE
    mov si, 0ffh

find_index:
    mov ax, 0b103h
    mov ecx, 000c03feh
    inc si
    int 1ah
    
    cmp bl, 86h
    je find_index


;PCI BIOS v2.0c+ - READ CONFIGURATION DWORD
    mov ax, 0b10ah
    xor di, di
    int 1ah
...


но Device ID - это как я понял не ID flash-накопителя, а ID host контроллера USB и в моем случае дефолтным является значение: 2413h
как тогда узнать ID флешки?

Автор: MAKCim 23.9.2007, 15:42
Цитата(piritus @  23.9.2007,  14:46 Найти цитируемый пост)
Так?

Код

...
    mov si, -1
find_index:
    mov ax, 0b103h
    mov ecx, 000c03feh
    inc si
    int 1ah
    jc error ; ошибка
    cmp bl, 86h
    je find_index
...

Цитата(piritus @  23.9.2007,  14:46 Найти цитируемый пост)
но Device ID - это как я понял не ID flash-накопителя, а ID host контроллера USB и в моем случае дефолтным является значение: 2413h
как тогда узнать ID флешки?

Device ID = 2413h это SMBus контроллер, а не USB
еще раз говорю, посмотри какой у тебя USB контроллер на чипсете
потом сходи http://www.pcidatabase.com/vendor_details.php?id=1302
и найди нужный Device ID
после того, как найдешь USB контроллер, с помощью него определишь подключенные устройства (в т. ч флешку)

Автор: piritus 23.9.2007, 16:39
вот что нашлось по моему чипсету:

0x24D2        Chip Number:    82801EB/ER
Chip Description:    USB UHCI Controller #1

0x24D4        Chip Number:    82801EB/ER
Chip Description:    USB UHCI Controller #2

0x24D7        Chip Number:    82801EB/ER
Chip Description:    USB UHCI Controller #3

0x24DE        Chip Number:    82801EB/ER
Chip Description:    USB UHCI Controller #4


Цитата(MAKCim @  23.9.2007,  15:42 Найти цитируемый пост)
с помощью него определишь подключенные устройства (в т. ч флешку)

USB контроллер найден, как с его помощью определять устройства?

данные для FIND PCI CLASS CODE, как я понял, тоже берутся из спецификации, тогда для моего случая
class code будет 000c0300h

Автор: piritus 23.9.2007, 19:23
посмотрел еще, чем отличается 
"Поиск устройства PCI" от "Поиск кода класса PCI"...
при чтении конфигурации номер какого регистра писать...
как определить USB контроллер...
как определить устройство...
в общем я совсем запутался. если можешь
приведи, пожалуйста, пример считывания заводского идентификатора flash'ки, 
подключенной к шине USB. 

Автор: MAKCim 24.9.2007, 09:49
piritus
1. Скачай http://download.intel.com/technology/usb/UHCI11D.pdf UHCI
2. Определи базовый адрес регистров UHCI (смещение 20h в конфигурационном пространстве UHCI)
3. Скачай спецификацию USB для определения команд, идентифицирующих устройства на шине
4. Используя 1, 2, 3 ищи то, что тебе нужно
пример не приведу, поскольку с этим не работал
да и времени нет

Автор: piritus 24.9.2007, 17:51
1. Это нужно для FIND PCI CLASS CODE, как я понял...

CLASS CODE REGISTER
Address Offset:    09-0Bh
Default Value:        010180h
Attribute:             Read Only
Size:            24 bits

This register contains the device programming interface infomation related to the
Sub-Class Code and Base Class Code definition. This register also identifies the
Base Class Code and the function sub-class in relation to the Base Class Code.
   Bit                Description
  23:16           Base Class Code (BASEC). 0Ch=Serial Bus controller.
  15:8           Sub-Class Code (SCC). 03h=Universal Serial Bus Host Controller.
   7:0           Programming Interface (PI). 00h=No specific register level programming interface 
               defined.
как понимать, что Default Value имеет значение 010180h, а в описании ниже, значение равно 0с0300h ?
;======================================================

2. Базовый адрес регистров UHCI - это USB BASE--IO SPACE BASE ADDRESS REGISTER?
Address Offset:    20-23h
Default Value:                00000001h
Attribute:                Read/Write
Size:                    32 bits

This register contains the base address of the USB I/O Registers
   Bit                Description
  31:16           Reserved. Hardwired to 0s. Must be written as 0s.
  15:5           Index Register Base Address. Bits [15:5] correspond to I/O address signals AD [15:5],
               respectively.
   4:1           Reserved. Read as 0.
    0           Resource Type Indicator (RTE) - RO. This bit is harswired to 1 indicating that the base           
               address field in this register maps to I/O space.    

3. Пролистал спецификацию несколько раз и не нашел команд, идентифицирующих устройства на шине
4. "Используя 1, 2, 3 ищи то, что тебе нужно" какая функция?

Автор: PRT 16.10.2007, 15:52
Советую посмотреть http://forum.sources.ru/index.php?showtopic=113980&view=showall

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)