1. Во-первых, посмотрите на схематическом DM9000C
(#: Указывает активный низкий уровень)
15 ~ SD0: линии 16-битные данные, ЦМД контактный определяет тип доступа
ЦМД: командной строки, когда ЦМД высока, что указывает на SD данных передачи, ЦМД указывает на низкий адрес передачи
INT: прерывание контактов, затем 2440 футов в GPF7
IOR #: Читать булавку, затем noé ноги в 2440
IOW #: контактный писать, то NWe ноги в 2440
CS #: выбор чипа, на bank4 2440 чипа выбрать выше
Отличающийся тем, что диапазон адресов 2440 1,1 bank4 руководство следующим образом:
Интервал bank4 расположен: 0x20000000 ~ 0X28000000 , когда мы посетить этот диапазон адресов, контроллер памяти позволит DM9000C карт разрешающего штифта, так что нашему DM9000C IO базового адреса = 0x20000000
DM9000C , в котором штифт соединен с CMD BANK4 LADDR2 выше
Например, когда адрес 0x2000 0000 при чтении и записи данных, данные , указывающие адреса считывания DM9000C
Адрес доступа 0x2000 0004 при чтении и записи данных, данные , представляющие данные для чтения является DM9000C
1.2 Процесс DM9000C Приемопередатчик
Когда DM9000C получить внешние данные, временно хранятся во внутренний адрес, а восходящая прерывание края генерируется, данные чтения ждать 2440
Когда DM9000C пересылает данные из 2440, он будет производить нарастающее прерывание от края до 2440
Показано, контакт прерывания DM9000C находится под ногой pin34
GPF7 2440 подключен к контакту, прерывание используется EINT7
Далее мы будем модифицировать исходный код, предоставленный производителем DM9000C
2. Установлено, что init_module () существует условная компиляция, прежде чем функция входа
Поэтому я хочу , чтобы закомментировать «#ifdef МОДУЛЬ» и «#endif»
3. Изменить имя функции впускной и выпускной, и их модификации (другие функции с тем же именем, чтобы избежать изменений имени функции ядра)
4. Изменение аппаратным средствам привода несходство (набор регистров базового адреса, прерывания и т.д.)
4.1 Где первый смотреть на код для инициализации аппаратного DM9000C
Введите dm9000c_init ()
-> dmfe_probe ()
структура net_device в __init dmfe_probe * ( аннулируются ) { структура net_device * DEV, DEV = alloc_etherdev ( SizeOf ( структура board_info)); // выделить структуру net_device ... ... ERR = dmfe_probe1 (Dev); // называют dmfe_probe1 ( ) функция ... ... ERR = register_netdev (DEV); // Зарегистрировать net_device структуру ядра ... ... }
Очевидно, что dmfe_probe1) функция-член (используется для инициализации аппаратного и DM9000C, снабженной структурой net_device.
4.2 введите dmfe_probe1 () функцию
На следующей диаграмме, это то, что мы DM9000C iobase переменного И.О. базового адреса 0x20000000
iobase роль:
Как было показано выше, перед чтением við DM9000C младших байт, первый адрес 0x20000000 назначаются, то есть, DM9000C CMD установлен в 0, то значение адресов записи для чтения DM9KS_VID_L к 0x20000000.
Затем конечный адрес +4, который присваивается 0x20000100, ЦМД устанавливается в 1, а затем считывает значение 0x20000100, который является ВИД DM9000C младший байт.
Чтение и запись DM9000C это, сначала CMD установлено в 0, то адрес записи DM9000C, CMD, а затем установить для чтения и записи данных.
4.3 iobase так сбросить переменную в функции инициализации, который является INT iobase
И выйти из функции экспорта, добавить iounmp ()
4,4 продолжается в dmfe_probe1 () функцию, смотреть вниз
Как показано ниже, щит фиги коды красного поля, код используется для проверки версии, номер версии нашего DM9000C разные, поэтому к блоку
4,5 В функции инициализации, изменить имя прерывания, IRQ изменилась IRQ_EINT7
4,6 изменить прерывание
При использовании после register_netdev () зарегистрировал net_device драйвера сетевого адаптера, в использовании IFCONFIG ядра будет ввести net_device-> открытую функцию чтобы запросить перерыв, очередь активации и т.д.
Таким образом, мы должны изменить разомкнутого член функции прерывания функции приложения, то прерывание будет триггер изменен на «IRQT_RISING», поднимаясь по фронту
Следующий набор 2440 начинается регистр управления хранением
2440 bank4 аппаратных средств установить битые ширины, время, из-за различное аппаратное обеспечение, различные передачи и прием данных направлены
5.1 BWSCON регистр установлен Ширина шины управления
Мы только установить BANK4 содержание, только следующие три (BANK0 битовую ширину ОМ [1: 0] аппаратные настройки)
При условии , ST4 = 0 , не используется УБ / LB (УБ / LB: указывает ли передаются отдельно высокие и низкие байты данных)
При условии WS4 = 0 , где WAIT контактный PE4, и мы не DM9000C штырьковый доступа PE4, запрещается
Установите на DW4 = 0x01 , наши линии 16 данных DM9000C
5.2 Регистр управления Set BANKCON4
Перед установкой времени, сначала посмотреть DM9000C чиповых схемы синхронизации по эксплуатации и схемы синхронизации 2440
Со ссылкой на фигуру, составленный BANKCON4 регистр устанавливается следующим образом (HCLK = 100 МГц, 1 часов равна 10 нс)
- Установите TACS = 0, так и CS ЦМД может заканчиваться в то же время (bank4 адрес (т.е. CMD) стабильным после долгого, чипа CS выбрать только начало)
- При условии TCOS = T1 = 0 (после выбора микросхемы CS, сколько времени требуется для чтения и записи включена)
- При условии Tacc = Т2> = 10ns = 1, представляет два часов (после цикла доступа, разрешение записи, сколько времени требуется, чтобы получить доступ к данным)
- При условии, Tcoh = Т4> = 3 нс = 1, представляет собой часы, потому что сигнал записи, когда DM9000 отменен, линия данных должна исчезнуть по крайней мере 3 нс (отменен после Noe чтения, сколько времени необходимо для поддержания выбора микросхемы)
- Установите Tcah = 0, так как CS и CMD может закончиться в то же время (после отмены CS выбора микросхемы, адрес (т.е. CMD) должен длиться долго)
Фигура ниже код, инициализация функция начального набора
(PS: Если DM9000C не может водить машину, может быть Tacc время слишком мало, в результате чего меньше данных считывается, Tacc может быть установлен больше)
Часть связанных аппаратных средств меняется к лучшему, а затем начал компилировать
6. Испытание Compile
Перед компиляции сначала добавить ядра драйвера заголовков необходимо:
# include <ASM / delay.h> #include <ASM / irq.h> #include <Linux / irq.h> #include <ASM / io.h> #include <ASM / арка-S3C2410 / регс-mem.h >
После компиляции правильно, начал тестирование драйвера DM9000C:
1) ядро в / чистый каталог драйверов dm9dev9000c.c, чтобы заменить оригинальное ядро DM9000C
2) изменить водителей / нетто / Makefile
OBJ - $ (CONFIG_DM9000) + = dm9000.o
изменилось (как показано ниже)
OBJ - dm9dev9000c.o $ (CONFIG_DM9000) + =
3) сделать uImage
Ниже описан новый драйвер скомпилирован в ядро
4) с помощью новой загрузки ядра
Ifconfig eth0 192.168.2.107
пинг 192.168.2.1
Ниже, может свистеть каждую успешную трансплантацию