本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记

一. uart 基本信息
  • S3C2440A提供了3个独立的串口。
  • 串口的操作使用中断或DMA模式。
  • 串口的接受和发送缓存为 64-byte。
二. uart硬件初始化
  • uart初始化调用的函数是:s3c24xx_init_uarts,这个函数被mini2440_map_io调用,mini2440_map_io函数赋值给了machine_desc.map_io函数。machine_desc.map_io函数在start_kernel函数里面调用。
  • s3c24xx_init_uarts函数传参(mini2440_uartcfgs,3),如下所示:
static struct s3c2410_uartcfg mini2440_uartcfgs[] __initdata = 
{[0] = {.hwport	     = 0,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,},[1] = {.hwport	     = 1,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,},[2] = {.hwport	     = 2,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,}
};

.hwport是硬件端口号,其他的结构体成员暂时往后看。

  • s3c24xx_init_uarts函数调用cpu->init_uarts函数。
void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)
{if (cpu == NULL)return;if (cpu->init_uarts == NULL){printk(KERN_ERR "s3c24xx_init_uarts: cpu has no uart init\n");}else(cpu->init_uarts)(cfg, no);}
.init_uarts	= s3c244x_init_uarts,

最终调用的是s3c244x_init_uarts函数。

  • s3c244x_init_uarts函数,传入了参数s3c2410_uart_resources
void __init s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no)
{s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
}
static struct resource s3c2410_uart0_resource[] = 
{[0] = {.start = S3C2410_PA_UART0,.end   = S3C2410_PA_UART0 + 0x3fff,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_S3CUART_RX0,.end   = IRQ_S3CUART_ERR0,.flags = IORESOURCE_IRQ,}
};static struct resource s3c2410_uart1_resource[] = 
{[0] = {.start = S3C2410_PA_UART1,.end   = S3C2410_PA_UART1 + 0x3fff,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_S3CUART_RX1,.end   = IRQ_S3CUART_ERR1,.flags = IORESOURCE_IRQ,}
};static struct resource s3c2410_uart2_resource[] = 
{[0] = {.start = S3C2410_PA_UART2,.end   = S3C2410_PA_UART2 + 0x3fff,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_S3CUART_RX2,.end   = IRQ_S3CUART_ERR2,.flags = IORESOURCE_IRQ,}
};static struct resource s3c2410_uart3_resource[] = 
{[0] = {.start = S3C2443_PA_UART3,.end   = S3C2443_PA_UART3 + 0x3fff,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_S3CUART_RX3,.end   = IRQ_S3CUART_ERR3,.flags = IORESOURCE_IRQ,},
};struct s3c24xx_uart_resources s3c2410_uart_resources[] __initdata = 
{[0] = {.resources	= s3c2410_uart0_resource,.nr_resources	= ARRAY_SIZE(s3c2410_uart0_resource),},[1] = {.resources	= s3c2410_uart1_resource,.nr_resources	= ARRAY_SIZE(s3c2410_uart1_resource),},[2] = {.resources	= s3c2410_uart2_resource,.nr_resources	= ARRAY_SIZE(s3c2410_uart2_resource),},[3] = {.resources	= s3c2410_uart3_resource,.nr_resources	= ARRAY_SIZE(s3c2410_uart3_resource),},
};

nr_resources = 2

s3c24xx_init_uartdevs函数分析
对platdev填充name,resource,num_resources,dev.platform_data等结构体成员,然后把platdev赋值给了s3c24xx_uart_devs全局变量,最终结果如下:

s3c24xx_uart_devs[0] = 
{.name = "s3c2440-uart",.id = 0,.resource ={[0] = {.start = S3C2410_PA_UART0,.end   = S3C2410_PA_UART0 + 0x3fff,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_S3CUART_RX0,.end   = IRQ_S3CUART_ERR0,.flags = IORESOURCE_IRQ,}},.num_resources = 2,.dev.platform_data = {[0] = {.hwport	     = 0,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,},[1] = {.hwport	     = 1,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,},[2] = {.hwport	     = 2,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,}},
};
三. uart device注册

从上一步看,uart device 设备为s3c24xx_uart_devs,device个数为3.
uart设备在哪里注册呢,可以看到在s3c_arch_init函数中注册了uart设备。

static int __init s3c_arch_init(void)
{int ret;// do the correct init for cpuif (cpu == NULL)panic("s3c_arch_init: NULL cpu\n");ret = (cpu->init)();if (ret != 0)return ret;ret = platform_add_devices(s3c24xx_uart_devs, nr_uarts);return ret;
}

s3c_arch_init函数又是什么时候调用呢?通过arch_initcall(s3c_arch_init)可知,s3c_arch_init函数在内核启动时被调用。

platform_add_devicesplatform_device_add(pdev);if (pdev->id != -1)dev_set_name(&pdev->dev, "%s.%d", pdev->name,  pdev->id);elsedev_set_name(&pdev->dev, "%s", pdev->name);

pdev->id = 0,1,2, 最终注册的设备为s3c2440-uart.0,s3c2440-uart.1,s3c2440-uart.2
设备路径:/sys/devices/platform/s3c2440-uart.0
/sys/devices/platform/s3c2440-uart.1
/sys/devices/platform/s3c2440-uart.2

四. uart driver的注册

搜索设备名s3c2440-uart,找到uart driver的注册文件/drivers/serial/s3c2440.c文件
在s3c2440.c文件中platform_driver的定义如下:

static struct platform_driver s3c2440_serial_driver = 
{.probe		= s3c2440_serial_probe,.remove		= __devexit_p(s3c24xx_serial_remove),.driver		= {.name	= "s3c2440-uart",.owner	= THIS_MODULE,},
};

最后通过调用platform_driver_register函数注册uart driver。

  • driver在/sys/bus/platform/drivers/s3c2440-uart目录下。
五. uart driver的probe函数

uart driver的probe函数为s3c2440_serial_probe,但是s3c2440_serial_probe函数又调用了s3c24xx_serial_probe函数,s3c24xx_serial_probe函数传参s3c2440_uart_inf,如下所示:

#define S3C2440_UFSTAT_TXFULL	  (1<<14)
#define S3C2440_UFSTAT_RXFULL	  (1<<6)
#define S3C2440_UFSTAT_TXSHIFT	  (8)
#define S3C2440_UFSTAT_RXSHIFT	  (0)
#define S3C2440_UFSTAT_TXMASK	  (63<<8)
#define S3C2440_UFSTAT_RXMASK	  (63)static struct s3c24xx_uart_info s3c2440_uart_inf = 
{.name		= "Samsung S3C2440 UART",.type		= PORT_S3C2440,.fifosize	= 64,.rx_fifomask	= S3C2440_UFSTAT_RXMASK,.rx_fifoshift	= S3C2440_UFSTAT_RXSHIFT,.rx_fifofull	= S3C2440_UFSTAT_RXFULL,.tx_fifofull	= S3C2440_UFSTAT_TXFULL,.tx_fifomask	= S3C2440_UFSTAT_TXMASK,.tx_fifoshift	= S3C2440_UFSTAT_TXSHIFT,.get_clksrc	= s3c2440_serial_getsource,.set_clksrc	= s3c2440_serial_setsource,.reset_port	= s3c2440_serial_resetport,
};

.fifosize = 64:表示缓冲buffer为64byte。
.rx_fifomask = 63:读缓冲buffer count正常取值为0 ~ 63,否则就是读缓冲buffer满了。
.rx_fifoshift = 0:因为 Rx FIFO Count为【5:0】,不需要移动
rx_fifofull = (1<<6):表示读缓冲buffer满了
.tx_fifofull = (1<<14):写缓冲buffer满了
.tx_fifomask = (63<<8):写缓冲buffer count正常取值为0 ~ 63,但是要右移8位
.tx_fifoshift = (8):写缓冲buffer count需要右移8位
在这里插入图片描述
在这里插入图片描述
s3c2440_serial_getsource,,s3c2440_serial_resetport几个函数放在后面看。

  • s3c2440_serial_setsource
    设置时钟源,总共有3种类型时钟给串口使用: PCLK, UEXTCLK or FCLK/n。
    当选择FCLK/n时钟时,要通过 UCON寄存器的[15:12]设置n值。
    uart clock = FCLK / (divider+6)
    n = divider+6
    当设置UCON0时, 7<= n <= 21; UCON1,UCON2要设置为0
    当设置UCON1时, 22 <= n <= 36 UCON0,UCON2要设置为0
    当设置UCON2时, 37 <= n <= 43 UCON0,UCON1要设置为0

设置PCLK, UCON的[11:10]设置为0,2
设置UCLK, UCON的[11:10]设置为1
设置FCLK/n, UCON的[11:10]设置为3

static int s3c2440_serial_setsource(struct uart_port *port, struct s3c24xx_uart_clksrc *clk)
{unsigned long ucon = rd_regl(port, S3C2410_UCON);/* todo - proper fclk<>nonfclk switch. */ucon &= ~S3C2440_UCON_CLKMASK;if (strcmp(clk->name, "uclk") == 0)ucon |= S3C2440_UCON_UCLK;else if (strcmp(clk->name, "pclk") == 0)ucon |= S3C2440_UCON_PCLK;else if (strcmp(clk->name, "fclk") == 0)ucon |= S3C2440_UCON_FCLK;else {printk(KERN_ERR "unknown clock source %s\n", clk->name);return -EINVAL;}wr_regl(port, S3C2410_UCON, ucon);return 0;
}

在这里插入图片描述

  • s3c2440_serial_getsource
    读UCON寄存器的[11:10],判断时钟源是PCLK, UEXTCLK or FCLK/n。
    如果是PCLK,UEXTCLK时钟源,clk->divisor = 1,如果是FCLK/n时钟,clk->divisor需要根据UCON寄存器的[15:12]获得。
    在这里插入图片描述

现在看s3c24xx_serial_probe函数。

  • 端口初始化,端口是全局变量s3c24xx_serial_ports。调用函数s3c24xx_serial_init_port。s3c24xx_serial_ports变量里面有个uart_port类型的变量,主要是给该变量赋值。
    ①保存info结构体
ourport->info	= info;

②ourport->port.fifosize = info->fifosize = 64,之前给的默认值是16
③获取mem资源,保存在port->mapbase和port->membase变量中

res = platform_get_resource(platdev, IORESOURCE_MEM, 0);
if (res == NULL) {printk(KERN_ERR "failed to find memory resource for uart\n");return -EINVAL;
}
dbg("resource %p (%lx..%lx)\n", res, res->start, res->end);port->mapbase = res->start;
port->membase = S3C_VA_UART + res->start - (S3C_PA_UART & 0xfff00000);

④获取终端号,保存在ourport->rx_irq和ourport->tx_irq变量中

ret = platform_get_irq(platdev, 0);
if (ret < 0)port->irq = 0;
else {port->irq = ret;ourport->rx_irq = ret;ourport->tx_irq = ret + 1;

⑤获取uart时钟,保存在ourport->clk中

ourport->clk	= clk_get(&platdev->dev, "uart");

⑥reset fifo,设置串口,调用函数s3c24xx_serial_resetport,实际是调用s3c2440_uart_inf的reset_port函数。
就是s3c2440_serial_resetport函数。s3c2440_serial_resetport函数设置了下面的几步的寄存器。

static struct s3c2410_uartcfg mini2440_uartcfgs[] __initdata = {[0] = {.hwport	     = 0,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,},
};

⑦给UCON0寄存器追加写入0x3c5(1111000101)
1:发送时产生电平中断(而不是脉冲中断)
1:接收时产生电平中断
1:允许接收时产生超时中断
1:允许接收时产生错误中断
0:一般模式,不用回环模式,就是一个串口的RX接TX
0:不发送break信号
01:中断或者轮询方式发送数据
01:中断或者轮询方式接收数据

⑧给 ULCON0寄存器写入0x03(00000011)
0: 普通模式(而不是红外模式)
000: 无校验位
0: 1个停止位
11: 8个数据位
在这里插入图片描述

⑨给 UFCON0寄存器写入0x51(1010001)
01: Tx FIFO Trigger Level = 16-byte
01: Rx FIFO Trigger Level = 8-byte
0:Reserved
0:
0:
1:使能FIFO
在这里插入图片描述

  • 调用uart_add_one_port函数,uart_add_one_port函数里面主要是注册tty设备。
    注册后的设备为s3c2410_serial0,在目录:/sys/devices/platform/s3c2440-uart.0/tty下面。
六. ktermios结构体

ktermios结构体结构体定义如下:

struct ktermios 
{tcflag_t c_iflag;		/* input mode flags */tcflag_t c_oflag;		/* output mode flags */tcflag_t c_cflag;		/* control mode flags */tcflag_t c_lflag;		/* local mode flags */cc_t c_line;			/* line discipline */cc_t c_cc[NCCS];		/* control characters */speed_t c_ispeed;		/* input speed */speed_t c_ospeed;		/* output speed */
};

下面参考大牛的博客
c_iflag常用的如下:
IGNBRK:忽略输入中的 BREAK 状态
BRKINT
IGNPAR:忽略桢错误和奇偶校验错
PARMRK:如果没有设置 IGNPAR,在有奇偶校验错或桢错误的字符前插入 /377 /0。如果既没有设置 IGNPAR 也没有设置PARMRK,将有奇偶校验错或桢错误的字符视为 /0
INPCK:启用输入奇偶检测
ISTRIP:去掉第八位
INLCR:将输入中的 NL 翻译为 CR
IGNCR:忽略输入中的回车
ICRNL:将输入中的回车翻译为新行 (除非设置了 IGNCR)
IUCLC:将输入中的大写字母映射为小写字母
IXON:启用输入的XON流控制
IXANY:允许任何字符来重新开始输出
IXOFF:启用输入的XFF流控制

c_oflag常用的如下:
OPOST:启用具体实现自行定义的输出处理。
OLCUC:将输出中的小写字母映射为大写字母。
ONLCR:将输出中的新行符映射为回车-换行。
OCRNL:将输出中的回车映射为新行符
ONOCR:不在第 0 列输出回车。
ONLRET:不输出回车。
OFILL:发送填充字符作为延时,而不是使用定时来延时。
OFDEL:填充字符是 ASCII DEL (0177)。如果不设置,填充字符则是 ASCII NUL。
NLDLY:新行延时掩码。取值为 NL0 和 NL1。
CRDLY:回车延时掩码。取值为 CR0, CR1, CR2, 或 CR3。
TABDLY:水平跳格延时掩码。取值为 TAB0, TAB1, TAB2, TAB3 (或 XTABS)。取值为 TAB3,即 XTABS,将扩展跳格为空格 (每个跳格符填充 8 个空格)。
BSDLY:回退延时掩码。取值为 BS0 或 BS1。(从来没有被实现过)
VTDLY:竖直跳格延时掩码。取值为 VT0 或 VT1。
FFDLY:进表延时掩码。取值为 FF0 或 FF1。

c_cflag 标志常量:
CBAUD:波特率掩码 (4+1 位)。
CBAUDEX:扩展的波特率掩码 (1 位),包含在 CBAUD 中。
CSIZE:字符长度掩码。取值为 CS5, CS6, CS7, 或 CS8。
CSTOPB:设置两个停止位,而不是一个。
CREAD:打开接受者。
PARENB:允许输出产生奇偶信息以及输入的奇偶校验。
PARODD:输入和输出是奇校验。
HUPCL:在最后一个进程关闭设备后,降低 modem 控制线 (挂断)。
CLOCAL:忽略 modem 控制线。
LOBLK:从非当前 shell 层阻塞输出(用于 shl )。(?)
CIBAUD:输入速度的掩码。CIBAUD 各位的值与 CBAUD 各位相同,左移了 IBSHIFT 位。
CRTSCTS:启用 RTS/CTS (硬件) 流控制。

七. uart_ops结构体

在上面的probe函数中,有个重要的结构体uart_ops,这个结构体定义了uart驱动层的操作。

static struct uart_ops s3c24xx_serial_ops = 
{.pm		= s3c24xx_serial_pm,                            //电源管理.tx_empty	= s3c24xx_serial_tx_empty,              //检测发送缓冲区是否为空.get_mctrl	= s3c24xx_serial_get_mctrl,              //获取串口是否流控.set_mctrl	= s3c24xx_serial_set_mctrl,               //设置串口流控.stop_tx	= s3c24xx_serial_stop_tx,                  //停止发送.start_tx	= s3c24xx_serial_start_tx,                  //启动发送.stop_rx	= s3c24xx_serial_stop_rx,                 //停止接收.enable_ms	= s3c24xx_serial_enable_ms,.break_ctl	= s3c24xx_serial_break_ctl,              //发送break信号.startup	= s3c24xx_serial_startup,                 //启动串口的发送接收.shutdown	= s3c24xx_serial_shutdown,           //关闭串口.set_termios	= s3c24xx_serial_set_termios,      //串口时钟,波特率等参数设置.type		= s3c24xx_serial_type,.release_port	= s3c24xx_serial_release_port,     //释放串口.request_port	= s3c24xx_serial_request_port,    //申请串口.config_port	= s3c24xx_serial_config_port,      //串口配置.verify_port	= s3c24xx_serial_verify_port,        //串口校验
};

下面一一分析里面的函数。

  • s3c24xx_serial_tx_empty函数分析
    该函数是判断发送端是否为空
    ①读 UFCON0寄存器,判断第0位是否为1,为1表示FIFO模式,为0表示非FIFO模式
    ②FIFO模式下,判断 UFSTAT0寄存器的 Tx FIFO Count是否为0,或者判断 Tx FIFO Full标志位,为空返回1,否则返回0.
    在这里插入图片描述
if (ufcon & S3C2410_UFCON_FIFOMODE) 
{if ((ufstat & info->tx_fifomask) != 0 ||(ufstat & info->tx_fifofull))return 0;return 1;
}

③非FIFO模式下,判断 UTRSTAT0寄存器的第2位,为1表示空了。
在这里插入图片描述

static int s3c24xx_serial_txempty_nofifo(struct uart_port *port)
{return (rd_regl(port, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE);
}
  • s3c24xx_serial_get_mctrl和s3c24xx_serial_set_mctrl
    硬件流控函数

  • s3c24xx_serial_stop_tx
    TX disable,就是把port->unused[0]设置为0,如果是流控的话,还要调用s3c24xx_serial_rx_enable函数打开串口的流控制接收。

  • s3c24xx_serial_start_tx
    TX enable,就是把port->unused[0]设置为1,如果是流控的话,还要调用s3c24xx_serial_rx_disable函数停止串口的流控制接收。

  • s3c24xx_serial_stop_rx
    RX disable, 就是把port->unused[1]设置为0

  • s3c24xx_serial_break_ctl
    设置 UCON寄存器的第4位,写1表示发送break信号
    在这里插入图片描述

#define S3C2410_UCON_SBREAK	  (1<<4)
ucon = rd_regl(port, S3C2410_UCON);
ucon |= S3C2410_UCON_SBREAK;
wr_regl(port, S3C2410_UCON, ucon);
  • s3c24xx_serial_startup
    RX enable, TX enable, 申请串口接收和发送中断
rx_enabled(port) = 1;
ret = request_irq(ourport->rx_irq, s3c24xx_serial_rx_chars, 0, s3c24xx_serial_portname(port), ourport);tx_enabled(port) = 1;
ret = request_irq(ourport->tx_irq, s3c24xx_serial_tx_chars, 0, s3c24xx_serial_portname(port), ourport);
  • s3c24xx_serial_shutdown
    TX disable,释放TX中断
    RX disable,释放RX中断
free_irq(ourport->tx_irq, ourport);
tx_enabled(port) = 0;free_irq(ourport->rx_irq, ourport);
rx_enabled(port) = 0;
  • s3c24xx_serial_set_termios
    在注册uart driver时,init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;串口core层调用uart_ops的set_termios函数时,会传入这个init_termios.c_cflag。
    ①不支持流控制
termios->c_cflag &= ~(HUPCL | CMSPAR);
termios->c_cflag |= CLOCAL;

HUPCL:在最后一个进程关闭设备后,降低 modem 控制线 (挂断)。
CLOCAL:忽略 modem 控制线。
②根据termios找到对用的波特率,init_termios.c_cflag |= B9600,返回波特率baud = 9600

baud = uart_get_baud_rate(port, termios, old, 0, 115200*8);

③计算分频系数,分频系数的计算公式为: UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1

quot = s3c24xx_serial_getclk(port, &clksrc, &clk, baud);

最后将分频系数写入 UBRDIV寄存器

wr_regl(port, S3C2410_UBRDIV, quot);

在这里插入图片描述

④获取到时钟源clksrc,clk

⑤刚开始的时候ourport->clksrc = NULL, ourport->baudclk = NULL
需要将时钟源写入 UCON[11:10]

s3c24xx_serial_setsource(port, clksrc);

使能时钟

clk_enable(clk);

将时钟源保存起来,下次时钟源没有更新的时候不用重新设置上面的步骤

ourport->clksrc = clksrc;
ourport->baudclk = clk;
ourport->baudclk_rate = clk ? clk_get_rate(clk) : 0;

⑥ULCON寄存器的设置
设置数据位数,init_termios.c_cflag |= CS8,数据是8位

#define S3C2410_LCON_CS8	  (0x3)
ulcon = S3C2410_LCON_CS8;

是否设置2个停止位,我们这里不用设置

#define S3C2410_LCON_STOPB	  (1<<2)
if (termios->c_cflag & CSTOPB)ulcon |= S3C2410_LCON_STOPB;

是否设置奇偶校验位,我们这里没有奇偶校验

if (termios->c_cflag & PARENB) 
{if (termios->c_cflag & PARODD)ulcon |= S3C2410_LCON_PODD;elseulcon |= S3C2410_LCON_PEVEN;
} 
else
{ulcon |= S3C2410_LCON_PNONE;
}

⑦UMCON寄存器的设置,主要是设置流控制,我们这里不用流控制

#define	S3C2410_UMCOM_AFC	  (1<<4)
umcon = (termios->c_cflag & CRTSCTS) ? S3C2410_UMCOM_AFC : 0;
wr_regl(port, S3C2410_UMCON, umcon);

⑧给port->read_status_mask赋值
接收溢出错误中断:port->read_status_mask = S3C2410_UERSTAT_OVERRUN;
如果启用检验:
port->read_status_mask |= S3C2410_UERSTAT_FRAME | S3C2410_UERSTAT_PARITY;
我们这里是没有启用校验的。
⑨给port->ignore_status_mask赋值

if (termios->c_iflag & IGNPAR)port->ignore_status_mask |= S3C2410_UERSTAT_OVERRUN;
if (termios->c_iflag & IGNBRK && termios->c_iflag & IGNPAR)port->ignore_status_mask |= S3C2410_UERSTAT_FRAME;

一定要init_termios.c_cflag |= CREAD,不然会忽略所有的输入字符

if ((termios->c_cflag & CREAD) == 0)port->ignore_status_mask |= RXSTAT_DUMMY_READ;
八. 串口中断模式下接收数据

Rx FIFO Trigger Level = 8-byte,即缓存中超过了8个字节数据,就会产生中断。

  • 读 UFSTAT寄存器,获取缓存中有多少个数据。如果没有数据,退出。
if (s3c24xx_serial_rx_fifocnt(ourport, ufstat) == 0)break;
  • 从URXH寄存器中读取一个字符,并且port->icount.rx计数加1。
ch = rd_regb(port, S3C2410_URXH);
port->icount.rx++;
  • 读错误状态寄存器 UERSTAT
    如果收到break信号,port->icount.brk加1;
    如果产生 Frame Error,port->icount.frame加1;
if (uerstat & S3C2410_UERSTAT_FRAME)port->icount.frame++;

如果产生溢出,port->icount.overrun加1

if (uerstat & S3C2410_UERSTAT_OVERRUN)port->icount.overrun++;
  • 将读到的字符放入tty->buffer中。调用函数uart_insert_char。
uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN, ch, flag);
  • 缓存中的数据读完了,退出while循环,调用tty_flip_buffer_push函数,将数据push到上层。
tty_flip_buffer_push(tty);
九. 串口中断模式下发送数据
  • 如果是软件流控字符(xon/xoff char),将字符写入UTXH寄存器后退出。
if (port->x_char) 
{wr_regb(port, S3C2410_UTXH, port->x_char);port->icount.tx++;port->x_char = 0;goto out;
}
  • 如果xmit这个环形buffer是空的,或者串口被停止了,TX disable
if (uart_circ_empty(xmit) || uart_tx_stopped(port)) 
{s3c24xx_serial_stop_tx(port);goto out;
}
  • 把xmit这个环形buffer的数据一个一个写入到UTXH寄存器,直到TX缓存满了,或者xmit buffer空了,
    同时port->icount.tx加1.
while (!uart_circ_empty(xmit) && count-- > 0) 
{if (rd_regl(port, S3C2410_UFSTAT) & ourport->info->tx_fifofull)break;wr_regb(port, S3C2410_UTXH, xmit->buf[xmit->tail]);xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);port->icount.tx++;
}
  • 退出上面的写这个步骤,判断一下xmit buffer剩余的字符,如果小于一半,唤醒tty,请求注入更多的数据。
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)uart_write_wakeup(port);tasklet_schedule(&state->tlet);tasklet_init(&state->tlet, uart_tasklet_action, (unsigned long)state);tty_wakeup(state->port.tty);
  • 如果xmit buffer空了,TX disable掉。
if (uart_circ_empty(xmit))s3c24xx_serial_stop_tx(port);
十. 串口计算分频系数

计算分频系数调用的函数是:

static int s3c24xx_serial_calcbaud(struct baud_calc *calc, struct uart_port *port,struct s3c24xx_uart_clksrc *clksrc, unsigned int baud)
{struct s3c24xx_uart_port *ourport = to_ourport(port);unsigned long rate;calc->src = clk_get(port->dev, clksrc->name);if (calc->src == NULL || IS_ERR(calc->src))return 0;rate = clk_get_rate(calc->src);rate /= clksrc->divisor;calc->clksrc = clksrc;if (ourport->info->has_divslot){unsigned long div = rate / baud;/* The UDIVSLOT register on the newer UARTs allows us to* get a divisor adjustment of 1/16th on the baud clock.** We don't keep the UDIVSLOT value (the 16ths we calculated* by not multiplying the baud by 16) as it is easy enough* to recalculate.*/calc->quot = div / 16;calc->calc = rate / div;} else {calc->quot = (rate + (8 * baud)) / (16 * baud);calc->calc = (rate / (calc->quot * 16));}calc->quot--;return 1;
}

分频系数的计算公式为: UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
获取时钟源,这里的时钟源应该是PCLK,假设为100M
rate = 100000000Hz。
因为是PCLK,clksrc->divisor = 1,因此rate还是100000000Hz
ourport->info->has_divslot这个变量没有定义,因此:
calc->quot = (rate + (8 * baud)) / (16 * baud);
calc->calc = (rate / (calc->quot * 16));
按照计算公式,calc->quot = (rate ) / (16 * baud),可是为什么这里
calc->quot = (rate + (8 * baud)) / (16 * baud)?
原因是:calc->quot值要进行四舍五入。
最后,calc->quot要减1才是实际的值。

十一. s3c24xx_serial_getclk函数

  • 获取s3c2410_uartcfg时钟的个数,s3c2410_uartcfg在mach-mini2440.c定义如下:
static struct s3c2410_uartcfg mini2440_uartcfgs[] __initdata = 
{[0] = {.hwport	     = 0,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,},[1] = {.hwport	     = 1,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,},[2] = {.hwport	     = 2,.flags	     = 0,.ucon	     = 0x3c5,.ulcon	     = 0x03,.ufcon	     = 0x51,}
};

没有定义cfg->clocks_size,那么cfg->clocks_size = 0
当cfg->clocks_size = 0时,采用默认的时钟pclk

static struct s3c24xx_uart_clksrc tmp_clksrc = 
{.name		= "pclk",.min_baud	= 0,.max_baud	= 0,.divisor	= 1,
};

最终函数输出:*clksrc = tmp_clksrc
*clk = pclk

但是如果有多个时钟呢,最终采用哪一个时钟?
每个时钟都计算出一个波特率的值,这几个值都比较接近传入的baud的值。并且让resptr指针指向所有时钟源的数组的末尾。

for (i = 0; i < cfg->clocks_size; i++, clkp++) 
{if (s3c24xx_serial_calcbaud(resptr, port, clkp, baud))resptr++;
}          

把每一个时钟源计算出来的波特率值sptr->calc与原来的baud比较,哪一个值最接近baud,就把哪一个作为uart的时钟源。

for (sptr = res; sptr < resptr; sptr++) 
{calc_deviation = baud - sptr->calc;if (calc_deviation < 0)calc_deviation = -calc_deviation;if (calc_deviation < deviation) {best = sptr;deviation = calc_deviation;}
}
参考:

https://www.cnblogs.com/colife/p/5531093.html

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 麦克风阵列声源定位解决方案

    其高科技:http://www.keygotech.com/cn/solution/ssl/array/noise-source-location-based-on-mic-array一般来说,基于麦克风阵列的声源定位算法划分为三类:一是基于波束形成的方法;二是基于高分辨率谱估计的方法;三是基于声达时延差(TDOA)的方法。语音定位跟踪系统基于可…...

    2024/4/21 8:31:59
  2. 微信小程序JS字符串操作方法汇总

    对于字符串的切割截取平时所用可能不是特别多,而且分的比较细,所以自备自查。有备无患。由于之前所有均在一个demo测试,若是哪里打错了,敬请谅解。一些其余属性找时间继续添加。1.函数:split()功能:使用一个指定的分隔符把一个字符串分割存储到数组例子: str=”jpg|bmp|…...

    2024/5/7 14:19:58
  3. linux 下的串口通信 python代码

    串口通信 摘要 之前要基于树莓派做一个设计,在这里面由于需要使用一个USB外设, 没办法只能通过串口通信来从USB外设那里读取数据。外设的检测 首先在目录下,确认外设的名称(这一步是所有的前提,之前一起做的一同事就是因为这个外设都没有驱动起来),可以使用以下步骤来完成…...

    2024/4/21 8:31:57
  4. NotifyIcon的简单使用

    转载自:http://blog.csdn.net/liuyuehui110/article/details/6517351 最常见使用NotifyIcon的程序就是QQ了,当初我很好奇这通知区域的小企鹅是如何随着QQ的运行放上去的,这的确是个有趣的技巧。 要是用到自己的程序上的确显得很专业!我们来为自己的小程序也添加个 : ) …...

    2024/5/8 6:47:01
  5. linux查看新增串口、USB设备,Minicom + Usb转串口

    查看新增串口、USB设备注意:虚拟机环境下的ubuntu默认情况下是不能自动识别的,需要在虚拟机窗口右下角点击"Prolific USB-Serial Controller",然后选择"Connect(Disconnect from Host)",这样才能被ubuntu系统识别。1) 显示已经加载到内核中的模块的状态…...

    2024/5/8 0:05:47
  6. WPF 使用NotifyIcon控件

    转载自:https://www.cnblogs.com/celery94/archive/2010/10/26/1861371.html1.在什么地方找到NotifyIcon普通的WPF控件基本上都是在该命名空间下:System.Windows.Controls,该命名空间在C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramewo…...

    2024/5/7 17:11:22
  7. Mac程序怎么打包?

    当程序开发完成之后,面对的一个重要问题就是打包的发布,当然打包的方法有很多,不过在mac电脑环境中,比较典型的打包安装方式是dmg的镜像打包。 dmg打包的好处,就是可以刻录光盘。具体的步骤和方法,现总结如下: 1、首先,当然是将你需要的程序编译好,形成app文件,如果要…...

    2024/4/21 8:31:53
  8. js中字符串处理常用的方法(字符分割、字符拼接、截取字符串、是否包含一个字符串)

    1、将数组中的所有元素以指定的字符分隔拼接为一个字符串——array.join(separator) 该方法返回一个字符串。 separator:用于分隔的字符 不传入分隔符直接使用array.join()时,用逗号进行分割 eg:以"."分割数组中的每一个元素 var arr = new Array(3) arr[0] = &qu…...

    2024/4/21 8:31:57
  9. linux下与TQ2440进行串口通信

    windows下进行串口通信,如果是笔记本的话一般需要安装PL2303的驱动,win7的话经常会无法识别,非常烦人。 其实linux下也有串口的驱动,默认已经安装了Pl2303.本人使的是ubuntu10.04 效果图:一、安装minicom 控制台指令: # sudo apt-get install minicom 自动完成部分: ***…...

    2024/4/20 0:43:03
  10. C# WinForm中NotifyICon控件的用法【1】

    任务栏中的图标是一些进程的快捷方式,这些进程在计算机后台运行,如防病毒程序或音量控制。 平时我们在使用QQ的时候,QQ主界面隐藏到系统托盘里,需要调用的时候在点击出来,很好很强大。 那么我们在C#中如何实现呢。本节将来一起探讨一下。其实就是NotifyICon控件的作用。那…...

    2024/5/8 3:31:21
  11. js从字符串中截取10个字节的长度

    效果:例如你输入的为"你们好好好好",截取之后是"你们好好好",数字和字母就直接是10位了,如果是"你们好11111111",截取之后是"你们好1111",希望对大家有帮助。。。<script type="text/javascript">function Count…...

    2024/4/20 18:28:54
  12. 使用nsis打包程序

    nsis下载地址:http://www.pc6.com/softview/SoftView_14342.htmlnsis使用启动NSIS程序主界面,选择“可视化脚本编辑器(VNISEdit)”菜单,开始制作自己的安装包 选择“使用脚本向导创建新的脚本文件”,确定进步脚本向导,下一步 第一步,这里填写应用程序的一些基本信息,下…...

    2024/5/8 6:52:03
  13. smarty实例教程

    smarty实例教程 ---模板设计部分关键词:smarty,PHP模板引擎一、什么是smarty?smarty是一个使用PHP写出来的模板PHP模板引擎,它…...

    2024/4/20 18:28:52
  14. winform 获取NotifyIcon的位置

    Winform 获取NotifyIcon的位置主要代码:public class NotifyIconHelper {public static Rectangle GetIconRect(NotifyIcon icon){RECT rect = new RECT();NOTIFYICONIDENTIFIER notifyIcon = new NOTIFYICONIDENTIFIER();notifyIcon.cbSize = Marshal.SizeOf(notifyIcon);//u…...

    2024/5/4 15:58:35
  15. linux下串口转TCP网络通信

    “`include”test.h”include”modbus.h”define BUFFER_SIZE 29int ret; modbus_t *mb; int16_t tab_reg[32]={0}; //初始化串口端口号啊 void ComInit() { mb = modbus_new_rtu(“/dev/ttySAC3”,19200,’N’,8,1);//open port modbus_set_slave(mb,1);//set slave address…...

    2024/4/20 18:28:51
  16. MacOS 开发 -- 程序打包生成dmg

    MacOS 开发 — 程序打包生成dmg本章介绍,苹果应用程序的常用的打包方法,dmg打包,后续会介绍如何打包pkg敬请期待:1、 打包app 生成工程文件.appXcode ——— > Product ———> Archive ———> Export 将打包后的工程文件导出。2、创建映像文件2.1 、打开LaunchP…...

    2024/4/20 18:28:49
  17. JS提供两个截取字符串的方法,分别是:slice()和substring()

    JS提供两个截取字符串的方法,分别是:slice()和substring()slice和substring都可以接受一个或两个参数,第1个参数是获取要截取的字符串的直始位置,第2个参数如果不为空则是获取要截取的字符串的结束位置的前一位(也就是说获取的终点位置不在返回值内),为空表示截取到整个字符串…...

    2024/4/21 8:31:51
  18. C#WinForm程序设计——系统托盘NotifyIcon控件(二)

    这篇文章继续介绍系统托盘NotifyIcon的使用,项目实现效果为:最小化窗体时,在系统托盘区域显示程序图标,并有气球提示,时间为30秒。效果如图,具体实现如下:1、创建一个新的项目From1;修改其Text属性为“系统托盘演示”,修改其ShowInTaskbar属性为False,为其添加一个图…...

    2024/5/6 20:59:08
  19. Linux下的串口调试工具

    minicom是linux下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有“超级终端”那么易用,但是使用习惯之后读者将会体会到它的高效与便利,下面将讲解minicom的安装和配置。一、安装minicom:使用以下命令: # sudo apt-get install minicom以下为安装的详细信息: # su…...

    2024/4/21 8:31:49
  20. VS2015 打包winform 安装程序

    最近开发了一个小软件。由于需要打包。网上找了一些资料。然后整合了起来。希望对大家有所帮助。不全面请见谅。 打包控件 InstallShield-Limited-Edition 下面是注册地址 http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio?la…...

    2024/4/20 10:00:05

最新文章

  1. JetBrains的多数据库管理和SQL工具DataGrip 2024.1版本在Windows/Linux系统的下载与安装配置

    目录 前言一、DataGrip在Windows安装二、DataGrip在Linux安装三、Windows下使用配置四、Linux下使用配置总结 前言 ​ “ DataGrip是一款多数据库管理和SQL工具&#xff0c;适用于不同类型的数据库。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地管理数据库、…...

    2024/5/8 11:07:14
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 利用Sentinel解决雪崩问题(一)

    1、解决雪崩问题的常见方式有四种: 超时处理:设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息&#xff0c;不会无休止等待;舱壁模式:限定每个业务能使用的线程数&#xff0c;避免耗尽整个tomcat的资源&#xff0c;因此也叫线程隔离;熔断降级:由断路器统计业务…...

    2024/5/4 23:53:05
  4. Java深度优先搜索DFS(含面试大厂题和源码)

    深度优先搜索&#xff08;Depth-First Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。DFS 通过沿着树的深度来遍历节点&#xff0c;尽可能深地搜索树的分支。当节点v的所在边都已被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这个…...

    2024/5/5 8:52:24
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57