LINUX.ORG.RU

Как обратиться к функциям драйвера...?


0

1

В системе установлен драйвер сетевой карты Intel. Имеется исходный код данного драйвера. Возник вопрос, как вызвать из своего драйвера или программы эти функции? Прошу ногами не пинать, так как новичок и в С и в Linux.

Привожу часть кода, чтобы было понятно, чего хочу сделать. Есть несколько сишных файлов, в одном из них есть функции, к которым я хочу обратиться, наример:

[code] /** * e1000_read_phy_reg - Reads PHY register

* @hw: pointer to the HW structure

* @offset: the register to read

* @data: the buffer to store the 16-bit read.

* Reads the PHY register and returns the value in data.

* This is a function pointer entry point called by drivers.

**/

s32 e1000_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) {

   if (hw->phy.ops.read_reg)       

return hw->phy.ops.read_reg(hw, offset, data);

   return E1000_SUCCESS; } [/code]

сорри, теги пока не осилил


для начала уточни, ты все это хочешь из юзерспейса провернуть? если так, то не получится по определению (в этом случае почитать бы тебе про устройство ОС).

Deleted
()

Если ты действительно новичёк в С - напиши лучше програму для перемножения матриц.

Я серьёзно.

anonymous
()
Ответ на: комментарий от Eddy_Em

а ещё можно поднять символьное устройство и через него организовать RPC :3

yoghurt ★★★★★
()

Судя по тому что ты спрашиваешь - бери мануал по карте в руки и напиши свой драйвер с нужным функционалом. Я сам так делал. Код оригинального драйвера тебе в помощь.

tim239 ★★
()
Ответ на: комментарий от Deleted

мне как бы все-равно откуда это сделать, но по аналогии с W..))) я понимаю, что скорее всего придется делать в kernell mode, а потом передавать в user space. Тогда подскажите, а как происходит в Linux взаимодействие user space и kernell mode. что-то типа DeviceIoControl??? куда копать?

fers
() автор топика
Ответ на: комментарий от frey

вот у меня по сути вопрос, можно ли подправить код, чтобы функции можно было вызывать из вне, то етсь чтобы они были экспортируемыми?

fers
() автор топика
Ответ на: комментарий от exception13

если можно поподробнее, как я понимаю вы про Media Independent Interface правильно?

fers
() автор топика
Ответ на: комментарий от fers

Не нужно. Лучше сделайте, как вам выше говорили: либо сделав виртуальное «устройство» в /dev, либо через виртуальный файл в /proc, либо при помощи дополнительного сис. вызова.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

фух, ну только не ругайтесь))) можно по полочкам. ну создам я в /dev виртуальное устройство (с этим надеюсь разберусь), а дальше что, просто перенести все функции в этот виртуальный девайс? просто мне надо с железом реальной сетевой карты поработать. получится?

fers
() автор топика
Ответ на: комментарий от anonymous

ну да, так делается в ... ну сами поняли, а как в Linux? хоть куда копать скажите и пойду сам найду

fers
() автор топика
Ответ на: комментарий от fers

Гуглите «linux kernel module programming guide», почитайте эту брошюрку (всего ~80стр.), будет меньше вопросов.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

>Если ты действительно новичёк в С - напиши лучше програму для перемножения матриц.

Лучший коммент. Жму руку!

ttnl ★★★★★
()

Непонятно зачем это вам надо. Расскажите что вы пытаетесь сделать.

anonymous
()
Ответ на: комментарий от anonymous

хочу считать область eeprom сетевой карты, используя функции, которые уже написаны в оригинальном драйвере.

fers
() автор топика
Ответ на: комментарий от fers

Так возьми код оригинального драйвера, вставь в него после инициализации устройства свой код, который сдампит содержимое eeprom (там мало, можно хоть в лог сдампить), загрузи вместо оригинального драйвера. Там будут ЕМНИП значения по умолчанию для некоторых регистров.

tim239 ★★
()
Ответ на: комментарий от tim239

Сначала я так и хотел сделать, только возник вопрос, а что с записью делать? смогу я из режима ядра считать файл с диска и передать его на запись в eeprom?

fers
() автор топика
Ответ на: комментарий от fers

Да, сможете. Либо по-простому, прямо в коде, через

uint16_t eeprom_new[] = {
    0x0400, 0xAA23, 0x32F6, 0x0410, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xC413, 0x0003, 0x4C0B, 0x107A, 0x8086, 0x107A, 0x8086, 0x3CE8,
    0xC109, 0x107A, 0x0000, 0x0000, 0x1AC8, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xC10D, 0xFF63, 0x280C, 0x2102, 0x02C8, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0E84,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5F9B,

    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,

    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,

    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
};
Либо, если это нужно не на один раз и сделать надо «фирменно» и правильно, через функцию request_firmware().

tim239 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.