New developer version 0.6.8; added select () function; added demonstrating example...
[ZeXOS.git] / kernel / core / dev.c
blob87f5f073d224e694d4546d39a5c7323f14fed852
2 /*
3 * ZeX/OS
4 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
5 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
6 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include <build.h>
24 #include <system.h>
25 #include <string.h>
26 #include <dev.h>
27 #include <vfs.h>
28 #include <rs232.h>
29 #include <drive.h>
30 #include <partition.h>
31 #include <speaker.h>
32 #include <pci.h>
33 #include <mouse.h>
34 #include <config.h>
36 /* pcnet32 - ethernet card */
37 #include "../drivers/net/pcnet32/pcnet32_dev.h"
38 /* rtl8029 - ethernet card */
39 #include "../drivers/net/rtl8029/rtl8029_dev.h"
40 /* rtl8139 - ethernet card */
41 #include "../drivers/net/rtl8139/rtl8139_dev.h"
42 /* rtl8169 - ethernet card */
43 #include "../drivers/net/rtl8169/rtl8169_dev.h"
44 /* es1370 - sound card */
45 #include "../drivers/char/sound/es1370_dev.h"
46 /* ac97 - sound card */
47 #include "../drivers/char/sound/ac97_dev.h"
48 /* ps2 - mouse driver */
49 #include "../drivers/char/mouse/ps2_dev.h"
51 dev_t dev_list;
53 void dev_display ()
55 dev_t *dev;
56 for (dev = dev_list.next; dev != &dev_list; dev = dev->next)
57 kprintf ("%s: %s\n", dev->devname, dev->desc);
60 dev_t *dev_find (char *devname)
62 dev_t *dev;
63 for (dev = dev_list.next; dev != &dev_list; dev = dev->next) {
64 if (!strcmp (dev->devname, devname))
65 return dev;
68 return 0;
71 dev_t *dev_findbypartition (partition_t *p)
73 dev_t *dev;
74 for (dev = dev_list.next; dev != &dev_list; dev = dev->next) {
75 if (!strncmp (dev->devname, p->name, strlen (dev->devname)))
76 return dev;
79 return 0;
82 dev_t *dev_register (char *devname, char *desc, unsigned attrib, dev_handler_t *handler)
84 /* first check length of device name */
85 /*if (strlen (desc) >= DEFAULT_MAX_DESCLENGTH ||
86 strlen (devname) >= DEFAULT_MAX_DEVNLENGTH)
87 return 0;*/
89 /* when noeth is active, we can't register ethernet devices */
90 if (attrib == DEV_ATTR_NET)
91 if (kernel_attr & KERNEL_NOETH)
92 return 0;
94 /* dev name havent to exists */
95 if (dev_find (devname))
96 return 0;
98 unsigned l = strlen (devname);
100 video_color (9, 0);
101 kprintf (":");
103 video_color (7, 0);
104 kprintf (" %s -> init %s\n", devname, desc);
106 dev_flags_t flags;
107 memset (&flags, 0, sizeof (dev_flags_t));
109 /* chance of getting device name on DEV_ACT_INIT */
110 flags.iomem = (void *) devname;
111 flags.iolen = l;
113 vfs_t *vfs = (vfs_t *) 0;
115 if (handler (DEV_ACT_INIT, (char *) &flags, sizeof (dev_flags_t))) {
116 vfs = vfs_list_add (devname, VFS_FILEATTR_FILE | VFS_FILEATTR_SYSTEM | VFS_FILEATTR_DEVICE, "/dev/");
118 if (!vfs)
119 return 0;
120 } else
121 return 0;
123 /* alloc and init context */
124 dev_t *dev = (dev_t *) kmalloc (sizeof (dev_t));
126 if (!dev)
127 return 0;
129 memcpy (dev->devname, "/dev/", 5);
130 memcpy (dev->devname+5, devname, l);
131 dev->devname[l+5] = '\0';
133 strcpy (dev->desc, desc);
135 dev->attrib = attrib;
136 dev->handler = handler;
138 /* when it's block or character device, let's mmap IO memory to VFS device file */
139 if (flags.iomem && flags.iolen) {
140 vfs_content_t content;
141 content.ptr = flags.iomem;
142 content.len = flags.iolen;
144 vfs_mmap (dev->devname, l+5, &content);
147 /* add into list */
148 dev->next = &dev_list;
149 dev->prev = dev_list.prev;
150 dev->prev->next = dev;
151 dev->next->prev = dev;
153 return dev;
156 //extern unsigned ext2_init (partition_t *p);
157 void dev_install ()
159 dev_t *dev = 0;
161 #ifdef CONFIG_DRV_RS232
162 dev_register ("com", "Serial port", DEV_ATTR_CHAR, (dev_handler_t *) &rs232_acthandler);
163 #endif
165 #ifdef ARCH_i386
166 #ifdef CONFIG_DRV_VGA
167 dev_register ("vga", "Graphics adapter", DEV_ATTR_CHAR, (dev_handler_t *) &video_acthandler);
168 #endif
170 #ifdef CONFIG_DRV_FLOPPY
171 dev = dev_register ("fd", "Floppy drive", DEV_ATTR_BLOCK, (dev_handler_t *) &floppy_acthandler);
172 partition_add (dev, fs_supported ("fat12"), 63); // small HACK
173 #endif
175 #ifdef CONFIG_DRV_ATA
176 dev_register ("ata", "ATA computer bus", DEV_ATTR_SPECIAL, (dev_handler_t *) &ata_acthandler);
177 #endif
179 #ifdef CONFIG_DRV_SPEAKER
180 dev_register ("pcspk", "PC-Speaker", DEV_ATTR_CHAR, (dev_handler_t *) &pcspk_acthandler);
181 #endif
183 #ifdef CONFIG_DRV_PCI
184 dev_register ("pci", "PCI computer bus", DEV_ATTR_SPECIAL, (dev_handler_t *) &bus_pci_acthandler);
185 #endif
187 #ifdef CONFIG_DRV_ES1370
188 dev_register ("es1370", "ES1370", DEV_ATTR_CHAR | DEV_ATTR_SOUND, (dev_handler_t *) &es1370_acthandler);
189 #endif
191 #ifdef CONFIG_DRV_AC97
192 dev_register ("ac97", "AC'97", DEV_ATTR_CHAR | DEV_ATTR_SOUND, (dev_handler_t *) &ac97_acthandler);
193 #endif
195 #ifdef CONFIG_DRV_PCNET32
196 dev_register ("pcnet32", "Ethernet card", DEV_ATTR_NET, (dev_handler_t *) &pcnet32_acthandler);
197 #endif
199 #ifdef CONFIG_DRV_RTL8029
200 dev_register ("rtl8029", "Ethernet card", DEV_ATTR_NET, (dev_handler_t *) &rtl8029_acthandler);
201 #endif
203 #ifdef CONFIG_DRV_RTL8139
204 dev_register ("rtl8139", "Ethernet card", DEV_ATTR_NET, (dev_handler_t *) &rtl8139_acthandler);
205 #endif
207 #ifdef CONFIG_DRV_RTL8169
208 dev_register ("rtl8169", "Ethernet card", DEV_ATTR_NET, (dev_handler_t *) &rtl8169_acthandler);
209 #endif
211 #ifdef CONFIG_DRV_COMMOUSE
212 dev_register ("mousecom", "Serial mouse", DEV_ATTR_CHAR, (dev_handler_t *) &commouse_acthandler);
213 #endif
215 #ifdef CONFIG_DRV_PS2MOUSE
216 dev_register ("mouseps2", "PS/2 mouse", DEV_ATTR_CHAR, (dev_handler_t *) &ps2mouse_acthandler);
217 #endif
218 #endif
221 unsigned int init_dev ()
223 dev_list.next = &dev_list;
224 dev_list.prev = &dev_list;
226 // set default dev values
227 dev_list.devname[0] = '\0';
228 dev_list.desc[0] = '\0';
230 dev_install ();
232 return 1;