Есть плата с DSP процессором от SpectrumDigital. У платы есть PCI
интерфейс. Вместе с платой шёл пример работы с PCI сделанный с помощью
Jungo, в примере можно почитать/пописать память устройства и.т.д.
Теперь мне бы хотелось написать драйвер для этой платы под Linux,
который для начала мог бы моргать светодиодами на самой плате. Я
написал простой дарйвер, который находит эту плату, определяет её
ресурсы (там два MMIO) и делает ioremap. Теперь я хотел бы через
writeb записать в регистр определящий состояние светодиодов своё
значение.
В примере идущим с платой есть файл dm642_lib.h
в нём есть следующие определения.
#define kBaseAddr_CE0 (0x80000000u)
#define kBaseAddr_CE1 (0x90000000u)
#define kBaseAddr_CE2 (0xA0000000u)
#define kBaseAddr_CE3 (0xB0000000u)
#define kFpgaAmrOffs (0x00080010)
#define kFpgaAmrBaseAddress (kBaseAddr_CE1 + kFpgaAmrOffs)
enum
{
kFamrOffs_OSDCR = kFpgaAmrOffs, // OSD Control Reg => 0x9008_0010
kFamrOffs_DMATLR, // DMA Threshold LSB Reg => 0x9008_0011
kFamrOffs_DMATMR, // DMA Threshold MSB Reg => 0x9008_0012
kFamrOffs_ISR, // Interrupt Status Reg
kFamrOffs_IER, // Interrupt Enable Reg
kFamrOffs_GPIODR, // GPIO Direction Reg
kFamrOffs_GPIOSR, // GPIO Status Reg
kFamrOffs_LEDR, // LED Reg
kFamrOffs_FPR, // Flash Page Reg => 0x9008_0018
kFamrOffs_RESERVED, // Reserved (19 - 1E)
kFamrOffs_FVR = kFpgaAmrOffs + 0xF // FPGA Version Reg => 0x9008_001F
};
И когда из программы-примера (того что в комплекте) пишу по адресу
0x90080017 своё значение, то светодиоды меняют своё состояние.
Соотвественно у меня такой вопрос как мне имея на руках адрес
полученный через ioremap(mmio_start, mmio_len) записать по адресу
0x90080017 своё значение в драйвере под Linux?
> как мне имея на руках адрес
> полученный через ioremap(mmio_start, mmio_len) записать по адресу
> 0x90080017 своё значение в драйвере под Linux?
Попробуй так:
К адресу, полученному через ioremap прибавляешь смещение 0x00080010
(странное оно какое-то) а потом смещение регистра определящий состояние
светодиодов - я так пологаю = 0x07.
mmio_len для первого ресурса имеет размер в 4 мегабайта, для второго 8 мегабайт. Я так пробовал, к сожалению ничего не получается. Даже прочитать содержимое FPGA Version Register (которое по адресу 9008001F не получается). Засада.
На самом деле я просто тупил. Внимательно почитав документацию на плату, я понял что KbaseAddr_CE0,CE_1 это вообще внутрення память платы, никак не связанная с PCI контроллером :) Спасибо за помощь!