Kernel 0.5.7-r4; network inteface support, initial pcnet32 ethernet
[ZeXOS.git] / kernel / core / dev.c
blobc8582a773bf1fe06a1b149d16375d4ae47b0f7a2
1 /*
2 * ZeX/OS
3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <system.h>
21 #include <string.h>
22 #include <dev.h>
23 #include <vfs.h>
24 #include <rs232.h>
25 #include <drive.h>
26 #include <partition.h>
27 #include <speaker.h>
28 #include <pci.h>
29 #include <config.h>
31 /* pcnet32 - ethernet card */
32 #include "../drivers/net/pcnet32/pcnet32_dev.h"
35 dev_t dev_list;
37 void dev_display ()
39 dev_t *dev;
40 for (dev = dev_list.next; dev != &dev_list; dev = dev->next)
41 kprintf ("%s: %s\n", dev->devname, dev->desc);
44 dev_t *dev_find (char *devname)
46 dev_t *dev;
47 for (dev = dev_list.next; dev != &dev_list; dev = dev->next) {
48 if (!strcmp (dev->devname, devname))
49 return dev;
52 return 0;
55 dev_t *dev_findbypartition (partition_t *p)
57 dev_t *dev;
58 for (dev = dev_list.next; dev != &dev_list; dev = dev->next) {
59 if (!strncmp (dev->devname, p->name, strlen (dev->devname)))
60 return dev;
63 return 0;
66 dev_t *dev_register (char *devname, char *desc, unsigned attrib, dev_handler_t *handler)
68 /* first check length of device name */
69 /*if (strlen (desc) >= DEFAULT_MAX_DESCLENGTH ||
70 strlen (devname) >= DEFAULT_MAX_DEVNLENGTH)
71 return 0;*/
73 /* dev name havent to exists */
74 /*if (dev_find (devname) != 0)
75 return 0;*/
77 dev_t *dev;
79 /* alloc and init context */
80 dev = (dev_t *) kmalloc (sizeof (dev_t));
82 unsigned l = strlen (devname);
83 memcpy (dev->devname, "/dev/", 5);
84 memcpy (dev->devname+5, devname, l);
85 dev->devname[l+5] = '\0';
87 strcpy (dev->desc, desc);
89 dev->attrib = attrib;
90 dev->handler = handler;
92 /* add into list */
93 dev->next = &dev_list;
94 dev->prev = dev_list.prev;
95 dev->prev->next = dev;
96 dev->next->prev = dev;
98 settextcolor (9, 0);
99 putch (':');
101 settextcolor (7, 0);
102 kprintf (" %s -> init %s\n", devname, desc);
104 vfs_list_add (devname, VFS_FILEATTR_FILE | VFS_FILEATTR_SYSTEM, "/dev/");
106 handler (DEV_ACT_INIT);
108 return dev;
111 void dev_install ()
113 #ifdef CONFIG_DRV_VGA
114 dev_register ("vga", "Graphics adapter", DEV_ATTR_CHAR, (dev_handler_t *) &video_acthandler);
115 #endif
117 #ifdef CONFIG_DRV_FLOPPY
118 dev_t *dev = dev_register ("fd", "Floppy drive", DEV_ATTR_BLOCK, (dev_handler_t *) &floppy_acthandler);
119 partition_add (dev, fs_supported ("fat12")); // small HACK
120 #endif
122 #ifdef CONFIG_DRV_RS232
123 dev_register ("com0", "Serial port", DEV_ATTR_CHAR, (dev_handler_t *) &rs232_acthandler);
124 #endif
126 #ifdef CONFIG_DRV_ATA
127 dev_register ("ata", "ATA computer bus", DEV_ATTR_SPECIAL, (dev_handler_t *) &ata_acthandler);
128 #endif
130 #ifdef CONFIG_DRV_SPEAKER
131 dev_register ("pcspk", "PC-Speaker", DEV_ATTR_CHAR, (dev_handler_t *) &pcspk_acthandler);
132 #endif
134 #ifdef CONFIG_DRV_PCI
135 dev_register ("pci", "PCI computer bus", DEV_ATTR_SPECIAL, (dev_handler_t *) &bus_pci_acthandler);
136 #endif
138 #ifdef CONFIG_DRV_PCNET32
139 dev_register ("pcnet32", "Ethernet card", DEV_ATTR_NET, (dev_handler_t *) &pcnet32_acthandler);
140 #endif
143 unsigned int init_dev ()
145 dev_list.next = &dev_list;
146 dev_list.prev = &dev_list;
148 // set default dev values
149 dev_list.devname[0] = '\0';
150 dev_list.desc[0] = '\0';
152 dev_install ();
154 return 1;