2023年6月26日发(作者:)
内核为友善提供的linux-3.0.31版本。
一、首先分析linux内核怎么启动并使用uart驱动的。
Tiny4412首先为uart注册了一个platform驱动,通过注册相应的platform设备来触发polatform总线的probe函数,在probe函数里根据相关配置信息注册TTY设备,uart的TTY驱动完成后就可以使用uart了。
为uart注册platform总线设备Probe为uart注册tty设备为uart注册platform总线驱动uart的tty驱动完成为uart注册tty驱动
二、接下来我们首先分析uart的tty驱动部分
其源码路径为:
“linux-3.0.31driversttyserialsamsung.c”
没错这就是三星提供的通用串口tty驱动内核模块。该模块的入口函数为“s3c24xx_serial_modinit”,该入口函数只做了一件事,那就是调用“uart_register_driver”函数来注册串口tty驱动。 s3c24xx_serial_modinit(void)uart_register_driver(&s3c24xx_uart_drv)int uart_register_driver(struct uart_driver *drv){struct tty_driver *normal; ……………………………………………..normal = alloc_tty_driver(drv->nr);…………………………………….drv->tty_driver = normal;……………………………………tty_set_operations(normal, &uart_ops);………………………………………….retval = tty_register_driver(normal);……………………………………...put_tty_driver(normal);………………………………….}static struct uart_driver s3c24xx_uart_drv = {.owner= THIS_MODULE,.driver_name= "s3c2410_serial", //在/sys/class/tty/driver在在在.nr= CONFIG_SERIAL_SAMSUNG_UARTS,#ifdef
CONFIG_SERIAL_SAMSUNG_CONSOLE_= NULL,# = S3C24XX_SERIAL_CONSOLE,#_name= S3C24XX_SERIAL_NAME, //在/sys/class/tty/device在在在.major= S3C24XX_SERIAL_MAJOR,.minor= S3C24XX_SERIAL_MINOR,};static const struct tty_operations uart_ops = {.open= uart_open,.close= uart_close,.write= uart_write,.put_char= uart_put_char,.flush_chars= uart_flush_chars,.write_room= uart_write_room,.chars_in_buffer= uart_chars_in_buffer,.flush_buffer= uart_flush_buffer,.ioctl= uart_ioctl,.throttle= uart_throttle,.unthrottle= uart_unthrottle,.send_xchar= uart_send_xchar,.set_termios= uart_set_termios,.set_ldisc= uart_set_ldisc,.stop= uart_stop,.start= uart_start,.hangup= uart_hangup,.break_ctl= uart_break_ctl,.wait_until_sent= uart_wait_until_sent,#ifdef CONFIG_PROC__fops= &uart_proc_fops,#et= uart_tiocmget,.tiocmset= uart_tiocmset,.get_icount= uart_get_icount,#ifdef CONFIG_CONSOLE__init= uart_poll_init,.poll_get_char= uart_poll_get_char,.poll_put_char= uart_poll_put_char,#endif};
然后我们再看“s3c24xx_serial_probe”这个函数,该函数为platform总线探测函数,当platform总线上挂载了uart的platform设备和驱动时就会调用,该函数做的主要工作是根据“platform_device”的配置及资源信息注册tty设备。 int s3c24xx_serial_probe(struct platform_device *dev, struct s3c24xx_uart_info *info){struct s3c24xx_uart_port *ourport;int ret;dbg("s3c24xx_serial_probe(%p, %p) %dn", dev, info, probe_index);ourport = &s3c24xx_serial_ports[probe_index];//在在在在在在在在probe_index++;dbg("%s: initialising port %p...n", __func__, ourport);ret = s3c24xx_serial_init_port(ourport, info, dev);//在在“platform_device ”在“s3c24xx_uart_info”在在在在在在在在在在在在在在在在在在if (ret < 0)goto probe_err;dbg("%s: adding portn", __func__);uart_add_one_port(&s3c24xx_uart_drv, &ourport->port);//在在在在在在在在tty在在在platform_set_drvdata(dev, &ourport->port);ret = device_create_file(&dev->dev, &dev_attr_clock_source);if (ret < 0)printk(KERN_ERR "%s: failed to add clksrc attr.n", __func__);#ifdef CSR_GPS_WORK_AROUND_UART_DRIVERret = device_create_file(&dev->dev, &dev_attr_rts_cts_gate); /* woojun*/if (ret < 0)printk(KERN_ERR "%s: failed to add rts_cts_gate attr.n", __func__);#endifret = s3c24xx_serial_cpufreq_register(ourport);if (ret < 0)dev_err(&dev->dev, "failed to add cpufreq notifiern");return 0; probe_err:return ret;}
到了这里uart有了“s3c24xx_serial_modinit”中注册的“tty驱动”,有了“s3c24xx_serial_probe”中注册的“tty设备”,这样一个完整的tty设备驱动就完成了。其操作函数调用关系如下图所示:
三、然后我们再看uart的platform总线驱动
其源码路径比较分散:
“linux-3.0.31driversttyserials3c2410.c”(注册串口的platform驱动)
“linux-3.0.31archarmplat-s3c24xxdevs.c”(串口platform设备资源)
“linux-3.0.31archarmplat-samsungdev-uarts.c”(串口platform设备)
“linux-3.0.31archarmmach-exynosmach-tiny4412.c”(注册串口platform设备)
其在“s3c2410.c”中注册串口platform驱动,在“mach-tiny4412.c”中注册串口platform设备,接下来我们主要看串口platform设备是怎么注册的。
在“mach-tiny4412.c”源码中,有一个“smdk4x12_map_io”这个函数,串口platform设备就是通过这个函数进去注册的。
smdk4x12_map_io()S3c24xx_init_uartsS3c2410_init_uartsS3c2410_init_uartdevsS3c_arch_init()根据“smdk4x12_uartcfgs”和“s3c2410_uart_resources”初始化串口的platform设备“s3c24xx_uart_devs”Platform_add_devoce(s3c24xx_uart_devs,nr_uarts)注册串口platform设备成功
所以针对不同的CPU做串口驱动移植,还需要修改mach-tiny4412.c 中的“smdk4x12_uartcfgs”及devs.c中的“s3c2410_uart_resources”。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687753412a39530.html
评论列表(0条)