Witam,
Usiłuję napisać sterownik do LPT - chcę stworzyć wirtualny port, widoczny przez programy użytkowe jako fizyczny/prawdziwy. Otworzyłem źródła modułu parport zamieszczonych razem z kernelem....
Znalazłem strukturę:
struct parport_operations {
/* IBM PC-style virtual registers. */
void (*write_data)(struct parport *, unsigned char);
unsigned char (*read_data)(struct parport *);
void (*write_control)(struct parport *, unsigned char);
unsigned char (*read_control)(struct parport *);
unsigned char (*frob_control)(struct parport *, unsigned char mask,
unsigned char val);
unsigned char (*read_status)(struct parport *);
/* IRQs. */
void (*enable_irq)(struct parport *);
void (*disable_irq)(struct parport *);
/* Data direction. */
void (*data_forward) (struct parport *);
void (*data_reverse) (struct parport *);
/* For core parport code. */
void (*init_state)(struct pardevice *, struct parport_state *);
void (*save_state)(struct parport *, struct parport_state *);
void (*restore_state)(struct parport *, struct parport_state *);
/* Block read/write */
size_t (*epp_write_data) (struct parport *port, const void *buf,
size_t len, int flags);
size_t (*epp_read_data) (struct parport *port, void *buf, size_t len,
int flags);
size_t (*epp_write_addr) (struct parport *port, const void *buf,
size_t len, int flags);
size_t (*epp_read_addr) (struct parport *port, void *buf, size_t len,
int flags);
size_t (*ecp_write_data) (struct parport *port, const void *buf,
size_t len, int flags);
size_t (*ecp_read_data) (struct parport *port, void *buf, size_t len,
int flags);
size_t (*ecp_write_addr) (struct parport *port, const void *buf,
size_t len, int flags);
size_t (*compat_write_data) (struct parport *port, const void *buf,
size_t len, int flags);
size_t (*nibble_read_data) (struct parport *port, void *buf,
size_t len, int flags);
size_t (*byte_read_data) (struct parport *port, void *buf,
size_t len, int flags);
struct module *owner;
};
I to wyglądało by na wszystko - wystarczy obsłużyć funkcje. Pozostaje tylko "zarejestrować" sterownik.... właśnie... jak?
Tak wygląda fragment funkcji parport_pc_probe_port. Widać tutaj funkcję parport_register_port - chyba jakaś powiązana ściśle z istniejącym LPT bo dma i przerwania ma.... i mi coś nie pasuje.
ops = kmalloc(sizeof(struct parport_operations), GFP_KERNEL);
/*...*/
pdev = platform_device_register_simple("parport_pc",
base, NULL, 0);
/*...*/
p = parport_register_port(base, irq, dma, ops);
/*...*/
base_res = request_region(base, 3, p->name);
Jak zarejestrować strukturę żeby sterownik stał się sterownikiem "LPT" z podanym adresem?