2
generate_driver (char *name, conf_t * conf, char *cfg_name, char *cfg_header,
3
char *dirname, char *topdir)
8
char tmp[256], line[256], *p, *s;
10
char *options[MAXOPTS];
11
char *option_desc[MAXOPTS];
15
sprintf (tmp, "target/build/%s.c", name);
16
if ((src = fopen (tmp, "w")) == NULL)
22
fprintf (src, "/*\n");
23
fprintf (src, " * Automatically generated file - do not edit.\n");
24
fprintf (src, " */\n");
25
fprintf (src, "#include \"devid.h\"\n\n");
27
fprintf (src, "#define DRIVER_NAME\t%s\n", name);
28
fprintf (src, "#define DRIVER_NICK\t\"%s\"\n", name);
29
fprintf (src, "#define DRIVER_PURPOSE\t\"%s\"\n", conf->purpose);
30
fprintf (src, "#define DRIVER_STR_INFO\t%s_str_info\n", name);
31
fprintf (src, "#define DRIVER_ATTACH\t%s_attach\n", name);
32
fprintf (src, "#define DRIVER_DETACH\t%s_detach\n", name);
33
fprintf (src, "#define DRIVER_TYPE\tDRV_%s\n", conf->bus);
34
fprintf (src, "#define DEVTYPE_%s\n", conf->bus);
38
* Handle driver specific configuration options
41
sprintf (tmp, "%s/.params", dirname);
42
if ((f = fopen (tmp, "r")) != NULL)
44
while (fgets (line, sizeof (line) - 1, f) != NULL)
46
p = line + strlen (line) - 1;
50
fprintf (src, "%s\n", line);
51
if (strncmp (line, "int ", 4) == 0)
53
char *s = line + 4, *p = s;
55
while (*p && *p != '=' && *p != ';' && *p != ' ')
60
fprintf (stderr, "Too many options for driver '%s' (%d)\n",
65
if (nopts != 0 && *desc != 0)
66
option_desc[nopts - 1] = strdup (desc);
67
option_desc[nopts] = 0;
68
options[nopts++] = strdup (s);
75
while (*s == ' ' || *s == '/' || *s == '*')
89
p = desc + strlen (desc);
90
sprintf (p, "\n\"%s\\n\"", tmp);
97
if (nopts > 0 && *desc != 0)
98
option_desc[nopts - 1] = strdup (desc);
100
if ((f = fopen ("devices.list", "r")) == NULL)
102
perror ("devices.list");
106
if (strcmp (conf->bus, "PCI") == 0)
108
fprintf (src, "static device_id_t id_table[] = {\n");
110
while (fgets (line, sizeof (line) - 1, f) != NULL)
113
p = line + strlen (line) - 1;
118
while (*p && *p != '\t')
123
if (strcmp (line, name) != 0)
129
while (*p && *p != '\t')
134
if (strncmp (s, "pci", 3) == 0)
136
if (sscanf (s + 3, "%x,%x", &vendor, &product) != 2)
138
fprintf (stderr, "Bad PCI id %s\n", s);
141
fprintf (src, "\t{0x%x,\t0x%x},\n", vendor, product);
148
fprintf (src, "\t{0}\n");
149
fprintf (src, "};\n");
154
if (strcmp (conf->bus, "USB") == 0)
156
fprintf (src, "#include <linux/mod_devicetable.h>\n\n");
157
fprintf (src, "#define strcpy dummy_strcpy\n");
158
fprintf (src, "#include <linux/usb.h>\n");
159
fprintf (src, "#undef strcpy\n");
160
fprintf (src, "static struct usb_device_id udi_usb_table[] = {\n");
162
while (fgets (line, sizeof (line) - 1, f) != NULL)
165
p = line + strlen (line) - 1;
170
while (*p && *p != '\t')
175
if (strcmp (line, name) != 0)
181
while (*p && *p != '\t')
186
if (strcmp (s, "usbif,class1") == 0)
189
if (strncmp (s, "usbi", 4) == 0)
191
if (sscanf (s + 4, "%x,%x", &vendor, &product) != 2)
193
fprintf (stderr, "Bad USB id %s\n", s);
197
"\t{.match_flags=USB_DEVICE_ID_MATCH_DEVICE,\t.idVendor=0x%x,\t.idProduct=0x%x},\n",
202
if (strncmp (s, "usb", 3) == 0)
204
if (sscanf (s + 3, "%x,%x", &vendor, &product) != 2)
206
fprintf (stderr, "Bad USB id %s\n", s);
210
"\t{.match_flags=USB_DEVICE_ID_MATCH_DEVICE,\t.idVendor=0x%x,\t.idProduct=0x%x},\n",
220
fprintf (src, "\t{match_flags:USB_DEVICE_ID_MATCH_INT_CLASS,\n");
221
fprintf (src, "\tbInterfaceClass: USB_CLASS_AUDIO},\n");
222
fprintf (src, "\t{0}\n");
223
fprintf (src, "};\n");
228
fprintf (src, "#include \"module.inc\"\n");
231
if (strcmp (conf->bus, "PCI") == 0)
234
"DEFINE_CLASS_0(%s, osspci_driver, osspci_methods, sizeof(struct _oss_device_t));\n",
237
"DRIVER_MODULE(%s, pci, osspci_driver, osspci_devclass, 0, 0);\n",
241
for (i = 0; i < nopts; i++)
243
fprintf (src, "TUNABLE_INT(\"%s.%s\", &%s);\n", name, options[i], options[i]);
245
if (option_desc[i] != NULL)
246
fprintf (src, "MODULE_PARM_DESC(%s, %s);\n", options[i],
254
sprintf (tmp, "%s/%s", dirname, cfg_header);
255
if ((src = fopen (tmp, "w")) == NULL)
261
fprintf (src, "/*\n");
262
fprintf (src, " * Automatically generated file - do not edit.\n");
263
fprintf (src, " */\n");
265
fprintf (src, "#include <oss_config.h>\n");
268
fprintf (src, "#define DRIVER_NAME\t%s\n", name);
269
fprintf (src, "#define DRIVER_NICK\t\"%s\"\n", name);
270
fprintf (src, "#define DRIVER_STR_INFO\t%s_str_info\n", name);
271
fprintf (src, "#define DRIVER_ATTACH\t%s_attach\n", name);
272
fprintf (src, "#define DRIVER_DETACH\t%s_detach\n", name);
273
fprintf (src, "#define DRIVER_TYPE\tDRV_%s\n", conf->bus);
276
fprintf (src, "extern int DRIVER_ATTACH(oss_device_t *ossdev);\n");
277
fprintf (src, "extern int DRIVER_DETACH(oss_device_t *ossdev);\n");