S3C2440驱动简析——串口驱动
- };
- //
device management // - static
int s3c2440_serial_probe(struct platform_device *dev) - {
//完成串口的添加 dbg("s3c2440_serial_probe: dev=%p/n", dev); return s3c24xx_serial_probe(dev, &s3c2440_uart_inf); - }
- static
struct platform_driver s3c2440_serial_driver = { //注册串口设备 .probe = s3c2440_serial_probe, .remove = __devexit_p(s3c24xx_serial_remove), .driver = { .name = "s3c2440-uart", .owner = THIS_MODULE, }, - };
- s3c24xx_console_init(&s3c2440_serial_driver,
&s3c2440_uart_inf); - static
int __init s3c2440_serial_init(void) - {
//初始化模块 return s3c24xx_serial_init(&s3c2440_serial_driver, &s3c2440_uart_inf); - }
- static
void __exit s3c2440_serial_exit(void) - {
//退出模块 platform_driver_unregister(&s3c2440_serial_driver); //注销串口设备 - }
- module_init(s3c2440_serial_init);
- module_exit(s3c2440_serial_exit);
- MODULE_DESCRIPTION("Samsung
S3C2440,S3C2442 SoC Serial port driver"); - MODULE_AUTHOR("Ben
Dooks "); - MODULE_LICENSE("GPL
v2"); - MODULE_ALIAS("platform:s3c2440-uart");
几个问题需要我们注意:
1.设备如何注册、注销
串口驱动被作为一个单独的模块被加载进内核,在模块的加载和卸载函数中,只需注册和注销一个platform_driver结构体。
注册:
[c-sharp]
- static
struct platform_driver s3c2440_serial_driver = { .probe = s3c2440_serial_probe, .remove = __devexit_p(s3c24xx_serial_remove), .driver = { .name = "s3c2440-uart", .owner = THIS_MODULE, }, - };
注销:
[c-sharp]
- platform_driver_unregister(&s3c2440_serial_driver);
2.几个非常重要的结构体
s3c2410_uartcfg :保存ucon ulcon ufcon三个串口寄存器的值
[c-sharp]
- struct
s3c2410_uartcfg { unsigned char hwport; // hardware port number // unsigned char unused; unsigned short flags; upf_t uart_flags; // default uart flags // unsigned int has_fracval; unsigned long ucon; // value of ucon for port // unsigned long ulcon; // value of ulcon for port // unsigned long ufcon; // value of ufcon for port // struct s3c24xx_uart_clksrc *clocks; unsigned int clocks_size; - };
s3c24xx_uart_info :提供串口设备环境信息,并提供三个函数的接口
[c-sharp]
- struct
s3c24xx_uart_info { char *name; unsigned int type; unsigned int fifosize; unsigned long rx_fifomask; unsigned long rx_fifoshift; unsigned long rx_fifofull; unsigned long tx_fifomask; unsigned long tx_fifoshift; unsigned long tx_fifofull; // uart port features // unsigned int has_divslot:1; // clock source control // int (*get_clksrc)(struct uart_port *, struct s3c24xx_uart_clksrc *clk); int (*set_clksrc)(struct uart_port *, struct s3c24xx_uart_clksrc *clk); // uart controls // int (*reset_port)(struct uart_port *, struct s3c2410_uartcfg *); - };
platform_device :设备的信息
[c-sharp]
- struct
platform_device { const char * name; int id; struct device dev; u32 num_resources; struct resource * resource; const struct platform_device_id *id_entry; // arch specific additions // struct pdev_archdata archdata; - };
platform_driver :设备注册用
[c-sharp]
- struct
platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_device *, pm_message_t state); int (*resume)(struct platform_device *); struct device_driver driver; const struct platform_device_id *id_table; - };
3.读写寄存器的宏定义
(1)读寄存器
unsigned long ucon = rd_regl(port, S3C2410_UCON);
#define rd_regl(port, reg)
static unsigned char __raw_readb(unsigned int ptr)
{
}
#define portaddr(port, reg)
(2)写寄存器
wr_regl(port, S3C2410_UCON, ucon);
#define wr_regl(port, reg, val)
#define portaddr(port, reg)
#define __raw_writel(v,p)
4.函数的注册方式
S3C2440驱动简析串口驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)