]>
git.ipfire.org Git - people/teissler/ipfire-2.x.git/blob - src/hwinfo/src/hd/serial.c
d43d9faff837e1c4b09e9d4d6bcb210f9ff71d33
13 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
16 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20 static char *ser_names
[] = {
21 "8250", "16450", "16550", "16650", "16750", "16850", "16950"
24 static void get_serial_info(hd_data_t
*hd_data
);
25 static serial_t
*add_serial_entry(serial_t
**ser
, serial_t
*new_ser
);
26 static void dump_serial_data(hd_data_t
*hd_data
);
28 void hd_scan_serial(hd_data_t
*hd_data
)
34 char buf
[4], *skip_dev
[16];
36 unsigned skip_devs
= 0;
38 if(!hd_probe_feature(hd_data
, pr_serial
)) return;
40 hd_data
->module
= mod_serial
;
43 remove_hd_entries(hd_data
);
44 hd_data
->serial
= NULL
;
46 PROGRESS(1, 0, "read info");
48 get_serial_info(hd_data
);
49 if((hd_data
->debug
& HD_DEB_SERIAL
)) dump_serial_data(hd_data
);
51 for(i
= 0; i
< 2; i
++) {
52 cmd
= get_cmdline(hd_data
, i
== 0 ? "yast2ser" : "console");
53 for(sl
= cmd
; sl
; sl
= sl
->next
) {
54 if(sscanf(sl
->str
, "tty%3[^,]", buf
) == 1) {
57 case 'a': strcpy(buf
, "S0"); break;
58 case 'b': strcpy(buf
, "S1"); break;
61 if(skip_devs
< sizeof skip_dev
/ sizeof *skip_dev
) {
62 skip_dev
[skip_devs
] = NULL
;
63 str_printf(&skip_dev
[skip_devs
++], 0, "/dev/tty%s", buf
);
70 PROGRESS(2, 0, "build list");
72 for(ser
= hd_data
->serial
; ser
; ser
= ser
->next
) {
73 hd
= add_hd_entry(hd_data
, __LINE__
, 0);
74 hd
->base_class
.id
= bc_comm
;
75 hd
->sub_class
.id
= sc_com_ser
;
76 hd
->prog_if
.id
= 0x80;
77 for(i
= 0; (unsigned) i
< sizeof ser_names
/ sizeof *ser_names
; i
++) {
78 if(strstr(ser
->name
, ser_names
[i
])) hd
->prog_if
.id
= i
;
80 hd
->device
.name
= new_str(ser
->name
);
82 str_printf(&hd
->unix_dev_name
, 0, "/dev/ttyS%u", ser
->line
);
83 for(i
= 0; i
< (int) skip_devs
; i
++) {
84 if(!strcmp(skip_dev
[i
], hd
->unix_dev_name
)) {
90 if(strstr(ser
->device
, "modem-printer")) {
91 hd
->tag
.ser_device
= 1;
93 else if(strstr(ser
->device
, "infrared")) {
94 hd
->tag
.ser_device
= 2;
96 else if(strstr(ser
->device
, "modem")) {
97 hd
->tag
.ser_device
= 3;
101 res
= add_res_entry(&hd
->res
, new_mem(sizeof *res
));
102 res
->baud
.type
= res_baud
;
103 res
->baud
.speed
= ser
->baud
;
105 res
= add_res_entry(&hd
->res
, new_mem(sizeof *res
));
106 res
->io
.type
= res_io
;
108 res
->io
.base
= ser
->port
;
109 res
->io
.access
= acc_rw
;
111 res
= add_res_entry(&hd
->res
, new_mem(sizeof *res
));
112 res
->irq
.type
= res_irq
;
113 res
->irq
.enabled
= 1;
114 res
->irq
.base
= ser
->irq
;
117 for(ser
= hd_data
->serial
; ser
; ser
= next
) {
121 free_mem(ser
->device
);
124 hd_data
->serial
= NULL
;
127 if(hd_module_is_active(hd_data
, "irda")) {
128 hd
= add_hd_entry(hd_data
, __LINE__
, 0);
129 hd
->base_class
.id
= bc_comm
;
130 hd
->sub_class
.id
= sc_com_ser
;
131 hd
->prog_if
.id
= 0x80;
132 hd
->device
.name
= new_str("IrDA Serial");
133 hd
->unix_dev_name
= new_str("/dev/ircomm0");
138 void get_serial_info(hd_data_t
*hd_data
)
142 #if !defined(__PPC__)
146 str_list_t
*sl
, *sl0
;
149 #if !defined(__PPC__)
151 * Max. 44 serial lines at the moment; the serial proc interface is
152 * somewhat buggy at the moment (2.2.13), hence the explicit 44 lines
153 * limit. That may be dropped later.
155 sl0
= read_file(PROC_DRIVER_SERIAL
, 1, 44);
157 // ########## FIX !!!!!!!! ########
159 for(sl
= sl0
; sl
; sl
= sl
->next
) {
162 sscanf(sl
->str
, "%u: uart:%31s port:%x irq:%u baud:%u", &u0
, buf
, &u1
, &u2
, &u3
) == 5 ||
163 (i
= 1, sscanf(sl
->str
, "%u: uart:%31s port:%x irq:%u tx:%u", &u0
, buf
, &u1
, &u2
, &u3
) == 5)
166 * The 'baud' or 'tx' entries are only present for real interfaces.
168 ser
= add_serial_entry(&hd_data
->serial
, new_mem(sizeof *ser
));
172 if(!i
) ser
->baud
= u3
;
173 ser
->name
= new_str(buf
);
177 if((hd_data
->debug
& HD_DEB_SERIAL
)) {
178 /* log just the first 16 entries */
179 ADD2LOG("----- "PROC_DRIVER_SERIAL
" -----\n");
180 for(sl
= sl0
, i
= 16; sl
&& i
--; sl
= sl
->next
) {
181 ADD2LOG(" %s", sl
->str
);
183 ADD2LOG("----- "PROC_DRIVER_SERIAL
" end -----\n");
186 #endif /* !defined(__PPC__) */
189 sl0
= read_file(PROC_DRIVER_MACSERIAL
, 1, 0);
192 for(sl
= sl0
; sl
; sl
= sl
->next
) {
194 (i
= sscanf(sl
->str
, "%u: port:%x irq:%u con:%63[^\n]", &u0
, &u1
, &u2
, buf
)) >= 3
196 ser
= add_serial_entry(&hd_data
->serial
, new_mem(sizeof *ser
));
200 ser
->name
= new_str("SCC");
201 if(i
== 4) ser
->device
= new_str(buf
);
205 if((hd_data
->debug
& HD_DEB_SERIAL
)) {
206 /* log just the first 16 entries */
207 ADD2LOG("----- "PROC_DRIVER_MACSERIAL
" -----\n");
208 for(sl
= sl0
, i
= 16; sl
&& i
--; sl
= sl
->next
) {
209 ADD2LOG(" %s", sl
->str
);
211 ADD2LOG("----- "PROC_DRIVER_MACSERIAL
" end -----\n");
214 #endif /* defined(__PPC__) */
220 serial_t
*add_serial_entry(serial_t
**ser
, serial_t
*new_ser
)
222 while(*ser
) ser
= &(*ser
)->next
;
223 return *ser
= new_ser
;
226 void dump_serial_data(hd_data_t
*hd_data
)
230 ADD2LOG("----- serial info -----\n");
231 for(ser
= hd_data
->serial
; ser
; ser
= ser
->next
) {
233 " uart %s, line %d, port 0x%03x, irq %d, baud %d\n",
234 ser
->name
, ser
->line
, ser
->port
, ser
->irq
, ser
->baud
237 ADD2LOG("----- serial info end -----\n");