转自:http://blog.sina.com.cn/s/blog_664c545f0100v9zl.html

转载:http://www.mculee.cn/post/48.html

【1】LCD 驱动基础知识

Linux- 2.6.32.2 内核已经支持S3C2440 的LCD 控制器驱动,但在此我们先介绍一下关于2440 LCD 控制器以及驱动相关的LCD 的一些基础知识。
注意:在此我们只讨论 TFT LCD,也就是真彩屏。
LCD 驱动中最关键的就是时钟频率(Clock frequency)的设置,时钟频率设置不对,LCD的显示就会闪,或者根本没有显示。一般LCD 的Datasheet 上会写有一个推荐的频率,比如mini2440 所用的统宝3.5”LCD,在它的数据手册第13 页,有这样一个表格:

可以看到,这里推荐的时钟频率是6.39MHz,近似于6.4MHz,范围,是5M-6.85MHz。S3C2440 之LCD 控制器与此相关的设置为CLKVAL,通过设置它,就可以在LCD 接口的VCLK引脚上产生LCD 所需要的时钟频率,那么CLKVAL 和VCLK 有何种关系呢?在2440 手册(411页)中,有这样一段描述:

The rate of VCLK signal depends on the CLKVAL
field in the LCDCON1 register. Table 15-3 defines the
relationship of VCLK and CLKVAL. The minimum value of CLKVAL is
0

接下来,手册中提供了它们的数学关系公式:

VCLK(Hz) = HCLK/[(CLKVAL+1)x2]

因此可以得出:

VCLK = HCLK / ((CLKVAL+1)*2)

那么HCLK 是多少呢?我们的开发板运行于400Mhz,这个可以在u-boot/cpu/arm920t/start.s 的172行附近可以看到如下代码:

# if
defined(CONFIG_S3C2440)   //the
s3c2440'clock
#define MPLLCON  
0x4C000004   //the address of
register base to the main frequency

   
ldr  r0,
=CLKDIVN         
//FCLK:HCLK:PCLK = 1:4:8
   
mov  r1, #5
   
str  r1, [r0]
   
ldr  r0, =MPLLCON  //the main
frequency is 405MHz 
   
ldr  r1, =0x7f021  //refer to the
manual  PLL VALUE SELECTION TABLE of the s3c2440
chip
   
str  r1, [r0]

可见,FCLK:HCLK:PCLK = 1:4:8,因此得出HCLK=100Mhz,再根据上述公式得出CLKVAL 应为:
CLKVAL=HCLK/(VCLK*2) -1
CLKVAL = 100000000 / (6400000 * 2) - 1 =
6.8
选择最接近的整数值7,并把它写入LCDCON1:17-8(注意:我们实际使用的数值是8),由此产生的VCLK 频率实测为5.63Mhz 左右,它也是在5-6.85Mhz 之间的数值,如图:

【2】 新内核中的pixclock 参数

在以前较老的 Linux 内核中,对于LCD 寄存器的设置都是这样直接填写CLKVAL 的,但Linux-2.6.32.2 内核却不再使用这样简单直观的方式,而是通过一个称为“pixclock”的参数进行调节,它的计算变的复杂和难以理解,我们不清楚Linux 内核中关于2440 部分的移植为何改变成这样的方式,这有可能是为了和X86 体系中的设置保持一致的风格,下面我们根据实际的代码进行一些推导和说明,但推导结果和我们的实际设置是并不一致的,会有一些误差。
提示:我们实际提供的 pixclock 参数并不是按照以下的方式推导计算出的,而是先确定好CLKVAL 的数值,再反复尝试、猜测得到的。
在 Framebuffer 驱动(linux-2.6.32.2/
drivers/video/s3c2410fb.c)中有这样一个函数:
clkdiv =
DIV_ROUND_UP(s3c2410fb_calc_pixclk(fbi,
var->pixclock),
2);
这里的clkdiv 就是我们上面提到的CLKVAL,而DIV_ROUND_UP 是一个宏定义,它位于include/linux/kernel.h 文件中:
#define DIV_ROUND_UP(n,d) (((n) + (d)
- 1) / (d))
这其实是一个数学概念:向上取整。下面是关于“向上取整”的一段说明:

以下信息来自:http://www.vckbase.com/document/viewdoc/?id=743

1>. 问题
A,B 都是整数并且 A>1,
B>1
求┌ A/B ┐ 即 A/B 的上取整。
当 A/B 整除,往上取整返回值为 A/B。
当 不整除,返回值是 int(A/B) + 1
这个算法的一个应用:如果你有一个动态增长的缓冲区,增长的步长是 B,
某一次缓冲区申请的大小是 A,这个时候,就可以用这个算法,计算出缓冲区的一个合
适大小了,正好可以容纳 A,并且不会过于得多,多余部分不会比B 多。
2>. 方法
int( (A+B-1)/B )
3>. HUNTON 的证明
上取整用 UP 表示
由于 A>1、B>1,且A、B 都是整数,所以可以设A=NB+M
其中N 为非负整数,M 为0 到B-1 的数,则
A/B = N + M/B
(A+B-1)/B = N + 1 + (M - 1)/B;
当M 为0 时,
UP(A/B) = N,
int((A+B-1)/B) = N + int(1 - 1/B) = N
当M 为1 到B-1 的数时,0 <= M-1 <=
B-2
UP(A/B) = N + 1,
int((A+B-1)/B) = N + 1 + int((M-1)/B) = N +
1
所以对A>1、B>1 的整数A、B 都有:
UP(A/B) = int((A+B-1)/B)

对于除数为“2”的本算法而言,我们可以简单的理解为“(n/2)+0.5”所对应的整数值,因此这里不可能避免的就出现了误差,也就是说n 的数值是有一定范围的,这里的n 就是“s3c2410fb_calc_pixclk(fbi,
var->pixclock)
”,因此上面的公式可以改写为:
clkdiv= s3c2410fb_calc_pixclk(fbi,
var->pixclock)/2 +
0.5
而 s3c2410fb_calc_pixclk(fbi,
var->pixclock) 这个函数在linux-2.6.32.2/drivers/video/s3c2410fb.c
中是这样定义的:

static unsigned int s3c2410fb_calc_pixclk(struct s3c2410fb_info
*fbi,
unsigned long pixclk)
{
unsigned long clk = fbi->clk_rate;
unsigned long long div;

//;这里计算出本函数的结果
div = (unsigned long long)clk * pixclk;
div >>= 12;
do_div(div, 625 * 625UL * 625);
dprintk("pixclk %ld, divisor is %ld\n", pixclk,
(long)div);
return div;
}

因此得出:
clkdiv=clk*pixclk/(10^12)/2 + 0.5
根据实际打印结果验证,此处的clk 其实就是HCLK。
而根据 static void s3c2410fb_activate_var(struct fb_info
*info)函数中的描述,会得出这样一个关系:
CLKVAL=clkdiv-1
再结合从2440 芯片手册得到的公式CLKVAL=HCLK/(VCLK*2) -1,因此可以得出大致这样的结果(“大致”可以理解为一定的误差范围):
Pixclk=(HCLK-VLCK)x10^12/HCLK*VCLK
以我们所用的统宝屏为例:
HCLK=100Mhz=100,000,000Hz
VLCK=6.4Mhz=6400,000Hz
因此计算出:pixclk =146250,单位是ps(picoseconds),这和我们实际设置的数值170000是有一定误差的。
另外 , 在 Linux 内核文档中, 还有另外一种计算pixclock 的方式, 见linux/Documentation/fb/framebuffer.txt,在此我们就不再详细介绍了,感兴趣的可以自己看下,或者到网上查下相关资料。
如果你对这些参数比较“晕”,建议你按照友善官方已经移植验证好的参数进行设置,下面是具体的参考步骤。

【3】在内核中添加各种LCD 类型的支持

打开 arch/arm/mach-s3c2440/mach-smdk2440.c,定位到114行到157行之间,先删除之前的LCD 设备平台代码,如下:

static struct s3c2410fb_display mini2440_lcd_cfg
__initdata = {

.lcdcon5 =
S3C2410_LCDCON5_FRM565 |
    
S3C2410_LCDCON5_INVVLINE |
    
S3C2410_LCDCON5_INVVFRAME |
    
S3C2410_LCDCON5_PWREN |
    
S3C2410_LCDCON5_HWSWP,

.type  =
S3C2410_LCDCON1_TFT,

.width  =
240,
 .height  =
320,

.pixclock =
166667,
 .xres  =
240,
 .yres  =
320,
 .bpp  =
16,
 .left_margin = 20,
 .right_margin = 8,
 .hsync_len = 4,
 .upper_margin = 8,
 .lower_margin = 7,
 .vsync_len = 4,
};

static struct s3c2410fb_mach_info mini2440_fb_info
__initdata = {
 .displays =
&mini2440_lcd_cfg,
 .num_displays = 1,
 .default_display = 0,

#if 0
 
 .gpccon  =
0xaa940659,
 .gpccon_mask = 0xffffffff,
 .gpcup  =
0x0000ffff,
 .gpcup_mask = 0xffffffff,
 .gpdcon  =
0xaa84aaa0,
 .gpdcon_mask = 0xffffffff,
 .gpdup  =
0x0000faff,
 .gpdup_mask = 0xffffffff,
#endif

.lpcsel  =
((0xCE6) & ~7) |
1<<4,
};
再把友善之臂已经移植好的代码加入,如下:

//;NEC 3.5”LCD 的配置和参数设置
#if defined(CONFIG_FB_S3C2410_N240320)
#define LCD_WIDTH 240
#define LCD_HEIGHT 320
#define LCD_PIXCLOCK 100000
#define LCD_RIGHT_MARGIN 36
#define LCD_LEFT_MARGIN 19
#define LCD_HSYNC_LEN 5
#define LCD_UPPER_MARGIN 1
#define LCD_LOWER_MARGIN 5
#define LCD_VSYNC_LEN 1
//;夏普8”LCD 的配置和参数设置
#elif defined(CONFIG_FB_S3C2410_TFT640480)
#define LCD_WIDTH 640
#define LCD_HEIGHT 480
#define LCD_PIXCLOCK 80000
#define LCD_RIGHT_MARGIN 67
#define LCD_LEFT_MARGIN 40
#define LCD_HSYNC_LEN 31
#define LCD_UPPER_MARGIN 25
#define LCD_LOWER_MARGIN 5
#define LCD_VSYNC_LEN 1
//;统宝3.5”LCD 的配置和参数设置
#elif defined(CONFIG_FB_S3C2410_T240320)
#define LCD_WIDTH 240
#define LCD_HEIGHT 320
#define LCD_PIXCLOCK 146250//170000
#define LCD_RIGHT_MARGIN 25
#define LCD_LEFT_MARGIN 0
#define LCD_HSYNC_LEN 4
#define LCD_UPPER_MARGIN 1
#define LCD_LOWER_MARGIN 4
#define LCD_VSYNC_LEN 1
//;群创7”LCD 的配置和参数设置
#elif defined(CONFIG_FB_S3C2410_TFT800480)
#define LCD_WIDTH 800
#define LCD_HEIGHT 480
#define LCD_PIXCLOCK 11463//40000
#define LCD_RIGHT_MARGIN 67
#define LCD_LEFT_MARGIN 40
#define LCD_HSYNC_LEN 31
#define LCD_UPPER_MARGIN 25
#define LCD_LOWER_MARGIN 5
#define LCD_VSYNC_LEN 1
//;LCD2VGA(分辨率为1024x768)模块的配置和参数设置
#elif defined(CONFIG_FB_S3C2410_VGA1024768)
#define LCD_WIDTH 1024
#define LCD_HEIGHT 768
#define LCD_PIXCLOCK 80000
#define LCD_RIGHT_MARGIN 15
#define LCD_LEFT_MARGIN 199
#define LCD_HSYNC_LEN 15
#define LCD_UPPER_MARGIN 1
#define LCD_LOWER_MARGIN 1
#define LCD_VSYNC_LEN 1
#define LCD_CON5 (S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_HWSWP)
#endif
#if defined (LCD_WIDTH)
static struct s3c2410fb_display mini2440_lcd_cfg __initdata =
{
#if !defined (LCD_CON5)
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
#else
.lcdcon5 = LCD_CON5,
#endif
.type = S3C2410_LCDCON1_TFT,
.width = LCD_WIDTH,
.height = LCD_HEIGHT,
.pixclock = LCD_PIXCLOCK,
.xres = LCD_WIDTH,
.yres = LCD_HEIGHT,
.bpp = 16,
.left_margin = LCD_LEFT_MARGIN + 1,
.right_margin = LCD_RIGHT_MARGIN + 1,
.hsync_len = LCD_HSYNC_LEN + 1,
.upper_margin = LCD_UPPER_MARGIN + 1,
.lower_margin = LCD_LOWER_MARGIN + 1,
.vsync_len = LCD_VSYNC_LEN + 1,
};
static struct s3c2410fb_mach_info mini2440_fb_info __initdata =
{
.displays = &mini2440_lcd_cfg,
.num_displays = 1,
.default_display = 0,
.gpccon = 0xaa955699,
.gpccon_mask = 0xffc003cc,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa95aaa1,
.gpdcon_mask = 0xffc0fff0,
.gpdup = 0x0000faff,
.gpdup_mask = 0xffffffff,
.lpcsel = 0xf82,
};
#endif

然后打开drivers/video/Kconfig:

config FB_S3C2410_DEBUG
 bool "S3C2410 lcd debug messages"
 depends on FB_S3C2410
 help
   Turn on debugging messages.
Note that you can set/unset at run time
   through sysfs
choice
 prompt "LCD select"
 depends on FB_S3C2410
 help
  S3C24x0 LCD size
select

config FB_S3C2410_T240320
 boolean "3.5 inch 240X320 Toppoly LCD"
 depends on FB_S3C2410
 help
  3.5 inch 240X320 Toppoly
LCD

config FB_S3C2410_N240320
 boolean "3.5 inch 240X320 NEC LCD"
 depends on FB_S3C2410
 help
  3.5 inch 240x320 NEC
LCD

config FB_S3C2410_TFT640480
 boolean "8 inch 640X480 L80 LCD"
 depends on FB_S3C2410
 help
  8 inch 640X480
LCD

config FB_S3C2410_TFT800480
 boolean "7 inch 800x480 TFT LCD"
 depends on FB_S3C2410
 help
  7 inch 800x480 TFT
LCD

config FB_S3C2410_VGA1024768
 boolean "VGA 1024x768"
 depends on FB_S3C2410
 help
  VGA 1024x768

endchoice

config FB_SM501
 tristate "Silicon Motion SM501 framebuffer
support"
 depends on FB &&
MFD_SM501
 select FB_CFB_FILLRECT
 select FB_CFB_COPYAREA

在arch/arm/mach-mini2440/mach-smdk2440.c中,在初始化部分加入以下代码(检查是否存在):

static void __init mini2440_map_io(void)
{
 s3c24xx_init_io(mini2440_iodesc,
ARRAY_SIZE(mini2440_iodesc));
 s3c24xx_init_clocks(12000000);
 s3c24xx_init_uarts(mini2440_uartcfgs,
ARRAY_SIZE(mini2440_uartcfgs));
 
}

static void __init
mini2440_machine_init(void)
{
#if defined
(LCD_WIDTH)

 s3c24xx_fb_set_platdata(&mini2440_fb_info);

#endif
 s3c_i2c0_set_platdata(NULL);

s3c_device_nand.dev.platform_data =
&mini2440_nand_info;
 platform_add_devices(mini2440_devices,
ARRAY_SIZE(mini2440_devices));
 //smdk_machine_init();
}

这样,我们就完成了LCD 驱动的移植,如果你需要加入其他型号的LCD 驱动,也可以参照上面的方式复制即可,一般小尺寸的pixclock 参数可以参考统宝3.5”的,超过640x480分辨率的参数可以参考8”LCD 的,特别要注意你使用的LCD 的长宽也要修改。

【4】配置内核并下载到开发板测试

现在,我们在命令行输入:make menuconfig 进入内核配置,依次按下面的子菜单项选择:

Device Drivers --->
    Graphics
support --->
       
<*> Support for frame buffer devices
--->
           
LCD select (3.5 inch 240X320 Toppoly LCD)
--->

(X) 3.5 inch 240X320 Toppoly
LCD   
//选择统宝3.5寸液晶

Console display driver support 
--->

<*> Framebuffer Console
support   //支持Framebuffer控制台

[*]
Select compiled-in fonts  //选择字库,默认VGA 8x8 , VGA 8x16

[*]   VGA 8x8
font

[*]   VGA 8x16
font

[*]
Bootup logo 
--->

[*]   Standard 224-color Linux
logo

按空格或者回车键选择我们需要的 LCD 型号,然后退出保存内核配置。
在命令行执行:
#make uImage
将会生成arch/arm/boot/uImage,把它烧写到开发板中,就可以看到一个小企鹅出现在屏幕上了,如图

而且logo左下方有一个光标提示符在闪动。

( mknod   /dev/fb0  
c   29   0

创建framebuffer设备节点,运行cat
/dev/fb0,如果发现有一堆乱码输出在屏幕上,则表示找到了/dev/fb0这个设备。如果没有,则可能是你的显卡不支持)

【6】通过LCD显示内核启动信息

之前内核通过串口打印内核信息时,内核命令行参数为console=ttySAC0,现在可以多加一项,即“console=ttySAC0, console=tty1 ”。

注意,tty1表示第一个虚拟终端,tty2表示第二个虚拟终端,... ... tty0表示当前虚拟终端。

不过要想通过它来登录,还需要修改inittab文件,增加以下6行:

#/etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
tty1::askfirst:-/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
tty5::askfirst:-/bin/sh
tty6::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a –r

这样会在虚拟终端上启动shell程序。在LCD的USB键盘上按下Alt+Fn(n=1~6)可以在第1~6个控制台之间切换。

在串口终端中

[root@mini2440 /]#ls -l /dev/tty0
crw-rw----   
1
root    
root      
4,  
0
Jan  1 00:00 /dev/tty0
[root@mini2440 /]#ls -l /dev/tty1
crw-rw----   
1
root    
root      
4,  
1
Jan  1 00:00 /dev/tty1
[root@mini2440 /]#

可以看到虚拟终端tty0,tty1的主设备号位4,此设备号分别为0和1,c表示是字符设备。

在串口终端中

[root@mini2440 /]#echo hello
>/dev/tty0
[root@mini2440 /]#

可以子在当前LCD上显示hello 字符。

2410上跑的Linux的控制台放到LCD上去,然后用USB键盘作为输入,形成一个小终端。在网上找了一些资料,大部分只是说可以将kernel的启动参数的“console”设置为“tty0”即可,试了一下,修改之后的确可以把内核启动的信息打印到LCD上,但是却无法输入任何信息,没有任何用处。

索性自己研究了一下Linux的配置项,终于可以完全按照自己的意愿实现 LCD+USB键盘的 console了:

第一步,进入“Character devices”:

console" height="660" border="0" width="832">

勾选“[*]   Support for console on
virtual terminal”:

console" height="660" border="0" width="832">

第二步,进入“Console drivers ”-->“Frame-buffer
support”:

console" height="660" border="0" width="832">

console" height="660" border="0" width="832">

取消选择“Support only 8 pixels wide fonts”,并选择“Select compiled-in
fonts”下的某一款字体,参考下图。这一步是为了改善LCD上的显示字体,默认的字体太小了,不好看。

console" height="660" border="0" width="832">

第三步,进入“General setup”:

console" height="660" border="0" width="832">

选择“Support
CONSOLE_PM”。这一步是为了打开光标,否则当使用LCD作为console的时候,没有光标,非常不好用。这一点在网上找了很久都没有找到,非常遗憾。后来索性去读kernel的代码,才发现光标的显示与否,竟然是跟“CONSOLE_PM”选项有关的,一直没想明白为什么~(PM是Power
Management的所写吧?)

console" height="660" border="0" width="832">

最后一步,修改kernel的启动参数。以vivi作为bootloader为例,通常我们使用的启动参数如下:

vivi>param set linux_cmd_line "noinitrd
root=/dev/mtdblock/1 init=/linuxrc console=ttyS0"

这里,console=ttyS0表示使

嵌入式Linux支持LCD console【转】的更多相关文章

  1. 嵌入式Linux学习(一)

    嵌入式系统 嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板.事实上,所有带有数字接口的设备,如手表.微波炉.录像机.汽车等, ...

  2. 嵌入式 Linux 应用:概述

    转载:http://www.ibm.com/developerworks/cn/linux/embed/embl/overview/index.html   从腕表到基于群集的超级计算机 在对嵌入式 ...

  3. 为什么要有uboot?带你全面分析嵌入式linux系统启动过程中uboot的作用

    1.为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游戏机).单片机(家用 ...

  4. 嵌入式linux和嵌入式android系统有什么区别和联系?

    转自:http://bbs.eeworld.com.cn/thread-430437-1-1.html 这个问题很多人问,尤其是初入嵌入式的菜鸟.其实大家都认为android是java,已经不是lin ...

  5. 嵌入式Linux开发板

    嵌入式Linux开发板开发介绍: iTOP-4412嵌入式Linux开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,独家配备三星S5M8767电源管理,配备Andro ...

  6. 《嵌入式Linux基础教程学习笔记一》

    常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...

  7. 制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)

    转:http://blog.csdn.net/zyb19831212/article/details/1887930 一.什么是文件系统 (Filesystem): A directory struc ...

  8. 嵌入式Linux开发系列之一: 走进嵌入式Linux的世界

    转载:http://www.ibm.com/developerworks/cn/linux/l-embed/part1/index.html   随着信息化技术的发展和数字化产品的普及,以计算机技术. ...

  9. 转:嵌入式linux启动时运行的inittab文件

    嵌入式系统下的linux启动配置文件,不同与普通的PC linux启动配置,启动相关文件与文件的内容也要少得多.嵌入式系统下的linux启动过程一般是:     1 在bootloader中制定各种要 ...

随机推荐

  1. 零基础学html第一天

    html:超文本标记语言 unicode(UTF-8):万国码 <...>:标记标签   :空格 <br>:换行 <hr>:水平线 <p></p& ...

  2. 【UE4】二十三、UE4笔试面试题

    在CSDN博客看到的,带着这些问题,多多留意,正所谓带着问题学习. 一. 1.Actor的EndPlay事件在哪些时候会调用? 2.BlueprintImplementableEvent和Bluepr ...

  3. Python os.walk() 简介

    Table of Contents 1. os.walk目录遍历 1.1. os.walk 1.2. 例子 1.2.1. 测试topdown 1.2.2. 运行时修改遍历目录 2. 参考资料 os.w ...

  4. 十一、mysql老是停止运行该怎么解决

    mysql老是停止运行该怎么解决 你可能还会遇到无法启动mysql的错误 解决方法如下:      

  5. laravel5.5表单验证

    1. 在第一次验证失败后停止 有时,你希望在某个属性第一次验证失败后停止运行验证规则.为了达到这个目的,附加 bail 规则到该属性: $this->validate($request, [ ' ...

  6. 内存压缩PK页面交换 解决内存问题谁更在行

    一台服务器能够支持的虚拟机数量通常取决于物理硬件所能够提供的可用计算资源.大多数资源, 比如处理器周期.存储I/O和网络带宽等,都能够相对简单地进行共享.这种做法的原理在于负载并不总是处于忙碌状态,因 ...

  7. 【Linear Models for Binary Classification】林轩田机器学习基石

    首先回顾了几个Linear Model的共性:都是算出来一个score,然后做某种变化处理. 既然Linear Model有各种好处(训练时间,公式简单),那如何把Linear Regression给 ...

  8. GTID环境中手动修复主从故障一例(Error 1146)

      Preface       In my last test of pt-heartbeat,both of master and slave were out of disk.And the my ...

  9. Webdriver--获得验证信息

    title:获得当前页面的标题 current_url:获得当前页面的URL text:前面提到过,获得标签对的文本信息 try: couseTitle = driver.find_element_b ...

  10. 孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录

    孤荷凌寒自学python第五十二天初次尝试使用python读取Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...