[c/linux] Sterownik LPT - wirtualny

0

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?

0

A lektura http://lwn.net/Kernel/LDD3/ była?

1 użytkowników online, w tym zalogowanych: 0, gości: 1