kategoria: ANSI C
[#1] *.device w ROMie. Jak?
Witam
Jakiś czas temu napisałem sobie driver dysku (Kod w C).
LoadModule działa, ładuje driver, pojemność i partycje są wykrywane, wszystko ok.
Teraz chciałem go umieścić w ROMie i tu pojawia się problem (czerwone guru).
Co trzeba zrobić żeby driver nadawał się do ROMu?

Jak ustawiać flagi "struct Resident" (RTF_COLDSTART, RTF_AUTOINIT...)? W tej chwili robię to hexedytorem na pliku xxxxxxx.device. Jakiś parametr przy kompilacji, zmienna...?
[#2] Re: *.device w ROMie. Jak?

@piotr_go, post #1

Jakiś czas temu napisałem sobie driver dysku (Kod w C).
LoadModule działa, ładuje driver, pojemność i partycje są wykrywane, wszystko ok.
Teraz chciałem go umieścić w ROMie i tu pojawia się problem (czerwone guru).
Co trzeba zrobić żeby driver nadawał się do ROMu?


Zadnych zmiennych globalnych, driver nie powinien miec zadnej sekcji DATA w pliku wykonywalnym, tylko CODE. Jezeli masz jakiekolwiek zmienne umieszczaj je w bazie device-a. RTF_AUTOINIT ustawiasz w zaleznosci od tego czy pole rt_Init struktury Resident wskazuje na twoj kod inicjalizujacy device czy na strukture InitTab. Nie ustawiaj flagi RTF_SINGLETASK bo wtedy device bedzie inicjalizowane w trybie Supervisor, przed wlaczeniem multitaskingu. RTF_COLDSTART jest ok i ma sens jezeli np. chcialbyc z twojego device moc bootowac.

Po co sie meczysz hexedytorem? Przeciez struktura Resident moze byc ustawiona dokladnie tak samo dla drivera ladowanego z dysku jak i upchanego do ROM-u...
[#3] Re: *.device w ROMie. Jak?

@mschulz, post #2

Po co sie meczysz hexedytorem? Przeciez struktura Resident moze byc ustawiona dokladnie tak samo dla drivera ladowanego z dysku jak i upchanego do ROM-u...

Tylko właśnie nie wiem jak.
struct Resident jest ustawiana automatycznie i nie wiem jak zmienić poszczególne parametry.

Jezeli masz jakiekolwiek zmienne umieszczaj je w bazie device-a

struct Device *myDevPtr; ?
[#4] Re: *.device w ROMie. Jak?

@piotr_go, post #3


Tylko właśnie nie wiem jak.
struct Resident jest ustawiana automatycznie i nie wiem jak zmienić poszczególne parametry.


Aaa czyli z gotowca korzystasz? To nie wiem...


struct Device *myDevPtr; ?


A po co to? Wskaźnik na twoja struct device jest w iorequest przecież...
[#5] Re: *.device w ROMie. Jak?

@mschulz, post #4

Aaa czyli z gotowca korzystasz? To nie wiem...

Na podstawie tego przykładu.
Masz jakiś mniej gotowy przykład device w którym można to zrobić?

A po co to? Wskaźnik na twoja struct device jest w iorequest przecież...

Tyle że ustawiam zmienne w:
int __UserDevInit(struct Device *myDev)
Tu też wykrywam i dodaje partycje.
[#6] Re: *.device w ROMie. Jak?

@piotr_go, post #5


Na podstawie tego przykładu.


Ok, to trochę gorzej. Tam małe odrobinki kodu są przed tobą


Masz jakiś mniej gotowy przykład device w którym można to zrobić?


Jak wytrzymasz tydzień to mogę jakiś przykład do użycia z gcc od bebbo sklecić. To byłby szkielecik device bez żadnych dodatkowych zależności.
[#7] Re: *.device w ROMie. Jak?

@mschulz, post #6

W arosie jest przeciez generowanie device w pamięci przez klasy poseidona, to calkiem niezle przyklady (nie licząc zaciemniających makr arosowych).
[#8] Re: *.device w ROMie. Jak?

@michal_zukowski, post #7


nie licząc zaciemniających makr arosowych


Dlatego chce zrobić przykład zrozumiały i uzywalny dla wszystkich. Potrzebuje tylko chwile bo teraz mam urwanie głowy z jednym projektem...
[#9] Re: *.device w ROMie. Jak?

@mschulz, post #6

Jak wytrzymasz tydzień to mogę jakiś przykład do użycia z gcc od bebbo sklecić. To byłby szkielecik device bez żadnych dodatkowych zależności.

Ok, poczekam.
W międzyczasie spróbuję sklecić pusty driver który się załaduje z ROMu bez błędów.

Ostatnia aktualizacja: 24.01.2019 18:57:53 przez piotr_go
[#10] Re: *.device w ROMie. Jak?

@piotr_go, post #9

W GCC 2.95.3 działają sekcje o niestandardowych nazwach?

__attribute__ ((section(".sekcja0")))
daje error m68k-amigaos-gcc
/tmp/ccyARGC8.s:44: Error: Unknown pseudo-op: `.sekcja0'

natomiast np.
__attribute__ ((section(".data")))
jest już ok.

Kombinuję z sekcjami bo nie dało się usunąć wszystkich DATA korzystając z tamtego przykładu.
[#11] Re: *.device w ROMie. Jak?

@mschulz, post #8

Jak postępy?
[#12] Re: *.device w ROMie. Jak?

@piotr_go, post #11

za dzien lub dwa bedzie gotowy szkielecik
[#13] Re: *.device w ROMie. Jak?

@mschulz, post #12

Ekhmmm...
[#14] Re: *.device w ROMie. Jak?

@piotr_go, post #13

Sorry, nie wyrabiam sie na zakretach, za duzo rzeczy mam na raz.

To co wydlubalem na szybko wrzucilem na githuba, to jeszcze niepelny szkielecik i troche mu brakuje ale moze juz sie do czegos przyda. A ja w miare mozliwosci jeszcze go zaktualizuje i dokoncze...

https://github.com/AmigaPorts/SimpleDevice

Ostatnia aktualizacja: 31.01.2019 20:02:47 przez mschulz
[#15] Re: *.device w ROMie. Jak?

@mschulz, post #14

OK, dzięki
Jakie parametry gcc do kompilacji?

m68k-amigaos-gcc -noixemul -m68000...

Ostatnia aktualizacja: 31.01.2019 20:23:43 przez piotr_go
[#16] Re: *.device w ROMie. Jak?

@piotr_go, post #15

Przepraszam, to jeszcze niepelny kod i niepelny projekt. Kompiluje z flagami -Os -nostartfiles -nostdlib -s

A. dorzucilem prosty makefile...
[#17] Re: *.device w ROMie. Jak?

@mschulz, post #16

OK, mam działający z ROMu driver.
Nie działa tylko bootowanie.
W "hdtoolbox" partycja DH0 jest "bootable", "Boot Options" pokazuje "not bootable".
W AddBootNode coś trzeba dodatkowo ustawić?
[#18] Re: *.device w ROMie. Jak?

@piotr_go, post #17

Nie działa tylko bootowanie.
W "hdtoolbox" partycja DH0 jest "bootable", "Boot Options" pokazuje "not bootable".


Nie wiem co masz w kodzie wiec nie jestem w stanie powiedziec. Co do AddBootNode to mozesz sobie podejrzec jak to robi AROS-owy ata.device (funkcja ata_RegisterVolume):

https://github.com/michalsc/AROS/blob/master/rom/devs/ata/ata_init.c
[#19] Re: *.device w ROMie. Jak?

@mschulz, post #18

Mam podobnie, z tą różnicą że do MakeDosNode parametry biorę z RDB.

AddBootNode(pp[DE_BOOTPRI + 4], ADNF_STARTPROC, devnode, NULL);
Tu czasem zamiast NULL nie powinno być "ConfigDev"?

Co ciekawego jak wyłączę DF0 w "Boot Options" a bootowalna dyskietka siedzi w stacji, to amiga bootuje z mojego "dysku".
[#20] Re: *.device w ROMie. Jak?

@piotr_go, post #19

Tu czasem zamiast NULL nie powinno być "ConfigDev"?


FAkt, wg. manuala od AddDosNode jezeli zamiast ConfigDev podasz NULL to urzadzenie bedzie niebootowalne...
[#21] Re: *.device w ROMie. Jak?

@mschulz, post #20

Wstawiłem pustą strukturę ConfigDev i pojawiło się "priority 0" w "Boot Options" przy dyskach.
Jest też możliwość wyboru w "select boot device".
Niestety nadal nie bootuje.
Jakieś pomysły jak skonfigurować ConfigDev? Nie znalazłem opisu tej struktury.
[#22] Re: *.device w ROMie. Jak?

@piotr_go, post #21

ustaw pozostale pola w ConfigDev:
dn_StackSize=twoj stacksize; BPTR!
dn_SegList=twoj seglist; BPTR!
dn_GlobalVec=-1;
dn_Name=nodename; BSTR!
dn_Startup=; BPTR!
[#23] Re: *.device w ROMie. Jak?

@docent, post #22

ConfigDev nie ma takich pól.
[#24] Re: *.device w ROMie. Jak?

@piotr_go, post #23

racja, to byly pola w Devicenode, ktore pewnie juz masz ustawione.
ConfigDev zawiera parametry karty rozszerzen, wiec w tym przypadku trzeba by odczytac ConfigDev dla urzadzenia, z ktorego sie bootujesz. Sprobuj FindConfigDev( NULL, -1, -1 ) jesli znasz kodproducenta karty, mozesz wstawic w drugim polu.
Druga opcja, to ustaw wiekszy priorytet niz df0, moze sie zabootuje z twojego dysku


Ostatnia aktualizacja: 01.02.2019 20:33:51 przez docent
[#25] Re: *.device w ROMie. Jak?

@docent, post #24

w tym przypadku trzeba by odczytac ConfigDev dla urzadzenia

Tyle że nie ma z czego. Całość siedzi w FPGA i nie dodawałem nic poza komunikacją z "dyskiem".

Wysoki priorytet (10) nie pomógł.

Ostatnia aktualizacja: 01.02.2019 20:39:57 przez piotr_go
[#26] Re: *.device w ROMie. Jak?

@piotr_go, post #25

Sprobuj 30 - trackdisk ma zdaje sie 20
[#27] Re: *.device w ROMie. Jak?

@docent, post #26

Trackdisk ma 5
[#28] Re: *.device w ROMie. Jak?

@piotr_go, post #27

nie chodzi o priorytet w devicenode ale w romtagu - w ten sposob twoj device zostanie zainicjowany wczesniej przed trackdiskiem. W swoim inicie powinienes otworzyc disk.resource i zrobic AllocUnit i trackdisk sie nie zdola zainicjowac - tylko nie wiem czy to Ci potrzebne bo teraz doczytalem, ze pisales o bootowaniu sie z partycji na hd

Ostatnia aktualizacja: 01.02.2019 21:43:23 przez docent
[#29] Re: *.device w ROMie. Jak?

@docent, post #28

teraz doczytalem, ze pisales o bootowaniu sie z partycji na hd

Tak, chodzi o bootowanie z (niestandardowego) HD. Bootowanie z dyskietek nadal ma działać jeżeli coś siedzi w stacji.

Priorytet 30 w struct Resident nie pomógł.
[#30] Re: *.device w ROMie. Jak?

@piotr_go, post #29

Aha. Hm, mozliwe, ze ConfigDev w AddBootNode zadziala. Sprobuj cos takiego:
struct CurrentBinding CurBinding;
struct ConfigDev*configdev;
GetCurrentBindings(&CurBinding, sizeof(struct CurrentBinding));
configdev=CurBinding.cb_ConfigDev;
AddBootNode(..., configdev);
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem