44.Linux君正X1000-添加st7789v显示
由于板子LCD旧屏是ili9335型号的,旧屏有时候会断货,如果断货则使用一个st7789v型号的LCD
它们两个屏的区别在于初始化屏的参数不同,引脚都一样,也就是说需要使板子同时支持ili9335型号和st7789v型号
思路:
- 1.uboot在显示LOG(初始化屏参数)之前,通过命令来读LCD型号,来检测LCD型号,然后来修改初始化屏的参数.
- 2.如果屏是新屏,则设置bootargs,向内核传递参数lcd_type=new
- 3.当kernel收到参数lcd_type=new时,则在初始化LCD之前,修改屏的参数.
改uboot
首先来看单板配置信息,根据配置找到哪个文件是初始化LCD屏的
根据make ap60pro_uImage_sfc_nand命令,找ap60pro_uImage_sfc_nand单板信息
vi ./u-boot/boards.cfg
找到:
# Target ARCH CPU Board name Vendor SoC Options
##############################################################
ap60pro_uImage_sfc_nand mips xburst ap60pro ingenic x1000 ap60pro:SPL_SFC_NAND,LIBSLEEP,GET_BT_MAC
从上面看到board name为ap60pro,所以最终通过下面几个来初始化:
./arch/mips/cpu/xburst\x1000\start.S //启动代码
./include/configs/ap60pro.h //各种define配置
./board/ingenic/ap60pro //单板配置源文件
查看ap60pro.h,查看LCD相关的define配置
查找CONFIG_ILI9335_240X320,找到在./board/ingenic/ap60pro/Makefile里调用:
COBJS-$(CONFIG_ILI9335_240X320) += lcd-ili9335_240x320.o //保存LCD初始化参数的信息
查找CONFIG_ILI9335_240X320,找到在./drivers/video/Makefile里调用:
COBJS-$(CONFIG_JZ_LCD_V13) += jz_lcd/jz_lcd_v13.o //根据lcd-ili9335_240*320.c来初始化LCD
修改lcd-ili9335_240x320.c
添加st7789v初始化的数组表(在代码中以New_ili9335_data_table数组表示):
struct smart_lcd_data_table ili9335_data_table[] = { //旧屏的初始化参数表
{SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0xec},
{SMART_CONFIG_DATA,0x1e},
{SMART_CONFIG_DATA,0x8f}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x01},
{SMART_CONFIG_DATA,0x01},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x02},
{SMART_CONFIG_DATA,0x02},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x03},
{SMART_CONFIG_DATA,0x10},
{SMART_CONFIG_DATA,0x30}, {SMART_CONFIG_UDELAY,}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x08},
{SMART_CONFIG_DATA,0x02},
{SMART_CONFIG_DATA,0x02}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x09},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x0a},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x08}, //enable te {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x0d},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x0f},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x60},
{SMART_CONFIG_DATA,0x27},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x61},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x6a},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_UDELAY,}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x10},
{SMART_CONFIG_DATA,0x16},
{SMART_CONFIG_DATA,0x90}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x11},
{SMART_CONFIG_DATA,0x02},
{SMART_CONFIG_DATA,0x27}, {SMART_CONFIG_UDELAY,}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x12},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x0d}, {SMART_CONFIG_UDELAY,}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x21},
{SMART_CONFIG_DATA,0x16},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x29},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x18}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x2b},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x0a}, {SMART_CONFIG_UDELAY,}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x20},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x21},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00},
//============Gamma============
{SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x30},
{SMART_CONFIG_DATA,0x04},
{SMART_CONFIG_DATA,0x03}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x31},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x07}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x32},
{SMART_CONFIG_DATA,0x04},
{SMART_CONFIG_DATA,0x04}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x35},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x02}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x36},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x0f}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x37},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x03}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x38},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x39},
{SMART_CONFIG_DATA,0x03},
{SMART_CONFIG_DATA,0x02}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x3c},
{SMART_CONFIG_DATA,0x02},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x3d},
{SMART_CONFIG_DATA,0x0f},
{SMART_CONFIG_DATA,0x00},
//=============================
// set RAM address
{SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x50},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x51},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0xef}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x52},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x53},
{SMART_CONFIG_DATA,0x01},
{SMART_CONFIG_DATA,0x3f}, {SMART_CONFIG_UDELAY,}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x80},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x81},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x82},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x83},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x84},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x85},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x90},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x10}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x91},
{SMART_CONFIG_DATA,0x06},
{SMART_CONFIG_DATA,0x00}, //display on
{SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x07},
{SMART_CONFIG_DATA,0x01},
{SMART_CONFIG_DATA,0x33}, {SMART_CONFIG_CMD,0x00},
{SMART_CONFIG_CMD,0x22}, }; unsigned long truly_cmd_buf[]= {
0x22002200,
};
struct jzfb_config_info jzfb1_init_data = {
.num_modes = ,
.modes = &jzfb1_videomode,
.lcd_type = LCD_TYPE_SLCD,
.bpp = , //R8G8B8
.pinmd = , .smart_config.rsply_cmd_high = ,
.smart_config.csply_active_high = ,
/* write graphic ram command, in word, for example 8-bit bus, write_gram_cmd=C3C2C1C0. */
.smart_config.newcfg_fmt_conv = ,
.smart_config.clkply_active_rising = ,
.smart_config.data_times = ,
.smart_config.write_gram_cmd = truly_cmd_buf,
.smart_config.length_cmd = ARRAY_SIZE(truly_cmd_buf),
.smart_config.bus_width = , //总线8位的
.smart_config.length_data_table = ARRAY_SIZE(ili9335_data_table),
.smart_config.data_table = ili9335_data_table,
.dither_enable = ,
}; //新屏的初始化参数表
static struct smart_lcd_data_table New_ili9335_data_table[] = {
{SMART_CONFIG_CMD,0x11},
{SMART_CONFIG_UDELAY,}, //Sleep out
{SMART_CONFIG_CMD,0x36}, //控制
{SMART_CONFIG_DATA,0x00}, {SMART_CONFIG_CMD,0x21}, //0x13显示不反转 ,21h 反显 {SMART_CONFIG_CMD,0x3A},
{SMART_CONFIG_DATA,0x05}, {SMART_CONFIG_CMD,0x2A},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0xEF}, {SMART_CONFIG_CMD,0x2B},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x01},
{SMART_CONFIG_DATA,0x3F}, {SMART_CONFIG_CMD,0xB2}, //前后肩
{SMART_CONFIG_DATA,0x0C},
{SMART_CONFIG_DATA,0x0C},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x33},
{SMART_CONFIG_DATA,0x33}, {SMART_CONFIG_CMD,0xB7}, //VGH VGL
{SMART_CONFIG_DATA,0x35}, {SMART_CONFIG_CMD,0xBB}, //VCOM
{SMART_CONFIG_DATA,0x1E}, {SMART_CONFIG_CMD,0xC0}, //LCM
{SMART_CONFIG_DATA,0x2C}, {SMART_CONFIG_CMD,0xC2},
{SMART_CONFIG_DATA,0x01}, {SMART_CONFIG_CMD,0xC3}, //VRH( vcom+vcom offset+vdv)
{SMART_CONFIG_DATA,0x27}, {SMART_CONFIG_CMD,0xC4}, //vdv
{SMART_CONFIG_DATA,0x20}, {SMART_CONFIG_CMD,0xC6}, //帧率
{SMART_CONFIG_DATA,0x0F}, {SMART_CONFIG_CMD,0xD0}, //功率控制模式
{SMART_CONFIG_DATA,0xA4},
{SMART_CONFIG_DATA,0xA1}, {SMART_CONFIG_CMD,0xE0}, //正GAMMA
{SMART_CONFIG_DATA,0xD0},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x05},
{SMART_CONFIG_DATA,0x03},
{SMART_CONFIG_DATA,0x02},
{SMART_CONFIG_DATA,0x07},
{SMART_CONFIG_DATA,0x3F},
{SMART_CONFIG_DATA,0x55},
{SMART_CONFIG_DATA,0x50},
{SMART_CONFIG_DATA,0x09},
{SMART_CONFIG_DATA,0x14},
{SMART_CONFIG_DATA,0x15},
{SMART_CONFIG_DATA,0x22},
{SMART_CONFIG_DATA,0x25}, {SMART_CONFIG_CMD,0xE1}, //负GAMMA
{SMART_CONFIG_DATA,0xD0},
{SMART_CONFIG_DATA,0x00},
{SMART_CONFIG_DATA,0x05},
{SMART_CONFIG_DATA,0x03},
{SMART_CONFIG_DATA,0x02},
{SMART_CONFIG_DATA,0x07},
{SMART_CONFIG_DATA,0x3F},
{SMART_CONFIG_DATA,0x55},
{SMART_CONFIG_DATA,0x54},
{SMART_CONFIG_DATA,0x0C},
{SMART_CONFIG_DATA,0x18},
{SMART_CONFIG_DATA,0x14},
{SMART_CONFIG_DATA,0x22},
{SMART_CONFIG_DATA,0x25}, {SMART_CONFIG_CMD,0x11}, // sleep out
{SMART_CONFIG_UDELAY,}, {SMART_CONFIG_CMD,0x29},//Display On
{SMART_CONFIG_UDELAY,},
};
unsigned long New_truly_cmd_buf[]= {
0x2C2C2C2C,
}; void switch_lcd_New(void) //切换为ST7789V
{
jzfb1_init_data.smart_config.data_table = New_ili9335_data_table;
jzfb1_init_data.smart_config.length_data_table = ARRAY_SIZE(New_ili9335_data_table);
jzfb1_init_data.smart_config.write_gram_cmd = New_truly_cmd_buf;
}
//... ...
查看jz_lcd_v13.c调用顺序
从uboot启动时,调用board_init_r()函数开始:
-> board_init_r()
-> stdio_init()
-> drv_lcd_init() //初始化硬件LCD
-> drv_video_init() //绘制log
其中drv_lcd_init()中调用顺序为:
-> drv_lcd_init()
-> lcd_init()
-> lcd_ctrl_init() // 位于drivers\video\jz_lcd\Jz_lcd_v13.c
所以,接下来,我们便来修改jz_lcd_v13.c,让uboot在初始化LCD之前,读LCD的ID,是否需要切换新屏参数
修改jz_lcd_v13.c
由于X1000的SLCD控制寄存器只能向LCD写命令/数据,没有读数据的寄存器,所以我们便需要使用GPIO来模拟时序,读出ID来
参考ST7789V数据手册,找到ID命令为04h:
参考ST7789V数据手册,找到读写8080时序图:
接下来开始改代码:
//添加下面函数,通过GPIO模拟LCD寄存器,来实现读ID
void gpio_setfunc(unsigned int gpioPort,enum gpio_function fun)
{ enum gpio_port port; switch((gpioPort /))
{
case : port = GPIO_PORT_A; break;
case : port = GPIO_PORT_B; break;
case : port = GPIO_PORT_C; break;
case : port = GPIO_PORT_D; break;
default:
port = GPIO_NR_PORTS; break;
}
gpio_set_func(port, fun, << (gpioPort % )); if(fun == GPIO_OUTPUT0||fun == GPIO_OUTPUT1)
{
if(fun == GPIO_OUTPUT0)
gpio_direction_output(gpioPort, );
else
gpio_direction_output(gpioPort, );
}
} static void write_SLCD_CD(int isCOMD,unsigned int value) //写命令/数据
{ #define SLCD_DC 20
#define SLCD_WR 17
#define SLCD_RD 16
#define SLCD_CS 18 int i;
gpio_direction_output(GPIO_PB(SLCD_CS), ); for( i=;i<;i++)
{
gpio_setfunc(GPIO_PA(i),GPIO_OUTPUT0);
gpio_direction_output(GPIO_PA(i), (value>>i)&0x01);
} mdelay(); if(isCOMD!=) //如果是写命令,则拉低DC脚
{
gpio_direction_output(GPIO_PB(SLCD_DC), );
}
else
{
gpio_direction_output(GPIO_PB(SLCD_DC),);
}
gpio_direction_output(GPIO_PB(SLCD_WR), );
gpio_direction_output(GPIO_PB(SLCD_RD), ); gpio_direction_output(GPIO_PB(SLCD_CS), ); mdelay();
gpio_direction_output(GPIO_PB(SLCD_WR), ); mdelay();
} static unsigned int read_SLCD_DATA(void) //读数据
{ #define SLCD_DC 20
#define SLCD_WR 17
#define SLCD_RD 16
#define SLCD_CS 18 int i;
int ret=; gpio_direction_output(GPIO_PB(SLCD_CS), ); //取消片选 for( i=;i<;i++) //将data脚设为输入脚
{
gpio_setfunc(GPIO_PA(i),GPIO_INPUT);
} gpio_direction_output(GPIO_PB(SLCD_DC), );
gpio_direction_output(GPIO_PB(SLCD_WR), );
gpio_direction_output(GPIO_PB(SLCD_RD), ); gpio_direction_output(GPIO_PB(SLCD_CS), ); //选中片选 mdelay();
gpio_direction_output(GPIO_PB(SLCD_RD), );
for( i=;i<;i++)
ret|=(gpio_get_value(GPIO_PA(i))<<i);
mdelay(); return ret;
} static void lcd_func_init(int isRestore)
{
int i,n;
#define SLCD_DC 20
#define SLCD_WR 17
#define SLCD_RD 16
#define SLCD_TE 19 //input
#define SLCD_CS 18 if(isRestore) //恢复管脚为LCD控制寄存器
{
for(i=;i<;i++)
gpio_setfunc(GPIO_PA(i),GPIO_FUNC_1); gpio_setfunc(GPIO_PB(SLCD_DC),GPIO_FUNC_1);
gpio_setfunc(GPIO_PB(SLCD_WR),GPIO_FUNC_1);
gpio_setfunc(GPIO_PB(SLCD_RD),GPIO_FUNC_1);
gpio_setfunc(GPIO_PB(SLCD_TE),GPIO_FUNC_1);
gpio_setfunc(GPIO_PB(SLCD_CS),GPIO_FUNC_1); }
else //设置为普通IO管脚
{
for(i=;i<;i++)
gpio_setfunc(GPIO_PA(i),GPIO_OUTPUT0); gpio_setfunc(GPIO_PB(SLCD_DC),GPIO_OUTPUT0);
gpio_setfunc(GPIO_PB(SLCD_WR),GPIO_OUTPUT0);
gpio_setfunc(GPIO_PB(SLCD_RD),GPIO_OUTPUT0);
gpio_setfunc(GPIO_PB(SLCD_TE),GPIO_INPUT);
gpio_setfunc(GPIO_PB(SLCD_CS),GPIO_OUTPUT0); } mdelay();
} static u8 Read_ID_isNewLcd(void)
{
#define SLCD_DC 20
#define SLCD_WR 17
#define SLCD_RD 16
#define SLCD_TE 19 //input
#define SLCD_CS 18 u8 ret = ;
u8 IDH,IDL;
lcd_func_init(); //设置LCD相关的引脚,设置为普通IO脚
write_SLCD_CD(,0x04); //写入0x04命令 IDH = read_SLCD_DATA();
IDL = read_SLCD_DATA(); printf("Read ID: 0x%X 0x%X\r\n",IDH,IDL);
IDH = read_SLCD_DATA();
IDL = read_SLCD_DATA(); printf("Read ID: 0x%X 0x%X\r\n",IDH,IDL); if(IDL!=0x52) //如果值!=0X52,则表示是旧屏ili9335
{
ret =;
} lcd_func_init(); //将lcd相关引脚配置为LCD控制脚
mdelay(); return ret;
} extern void switch_lcd_New(void) ;
static int lcd_type_isNew=;
void set_lcd_type_from_cmdline(void) //设置bootargs,向内核传递lcd_type参数
{
if(lcd_type_isNew)
{
run_command("set bootargs "CONFIG_BOOTARGS" lcd_type=new ", );
} }
//在lcd_ctrl_init()函数里添加读ID函数
void lcd_ctrl_init(void *lcd_base)
{
if(Read_ID_isNewLcd()==) //读ID,检测是否是新屏
{
printf("Read_ID_isNewLcd=0\r\n");
switch_lcd_New(); //调用Lcd-ili9335_240x320.c的切换新屏参数的函数 lcd_type_isNew=;
}
//... ... 后面的代码不需要修改,因为后面便会根据LCD初始化参数表.来初始化LCD
}
上面的set_lcd_type_from_cmdline()函数需要在后面调用main_loop()的时候之前被调用,所以还需要修改board_init_r()函数(arch\mips\lib\Board.c ).
然后装上旧屏ili9335,启动uboot,查看读的屏幕ID,屏幕显示正常:
然后换为新屏,启动uboot,查看读的ID信息,log显示正常:
启动内核时,也可以看到传递给内核bootargs有我们新添的参数:
然后在内核中,便通过新参数再次设置屏参数表即可.
44.Linux君正X1000-添加st7789v显示的更多相关文章
- Linux 用户名、主机添加背景色
文章参考:PS1应用之——修改linux终端命令行各字体颜色 Linux 用户名.主机添加背景色,用于生产环境,这样可以减少人为的误操作. [root@zhang ~]# tail /etc/bash ...
- 解密电子书之三:MCU(君正)
汉王科技,早先使用的是Marvell的Xscal(ARM架构).而后据说出于功耗与价格的考虑,汉王旗下的全线产品,除了双品牌的T61(ALEX)以外,都使用北京君正提供的产品.君正的4740,基于MI ...
- Linux程序写入oralce数据库中文显示为问号??? 代码实现设置环境变量!
Linux程序写入oralce数据库中文显示为问号??? 1.问题介绍 根本原因是字符集的问题,是数据库的字符集和写入程序的linux系统的字符集不一致导致: 但是用export NLS_LANG=& ...
- MIPS开发板的“不二”选择——Creator Ci20单板计算机评测(芯片是君正JZ4780 ,也就是MIPS R3000,系统推荐Debian或深度,官网就有,其它语言有FreePascal和Go和Java和Python)
在MIPS架构的CPU上开发软件,当然需要使用MIPS专用的工具链来编译代码.不过一般的LINUX发行版内都有相应的配套工具链供用户使用.Ci20出厂时的LINUX发行版为DEBIAN 7.5,相应的 ...
- Lab1:Linux内核编译及添加系统调用(详细版)
实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...
- 手把手教你君正X2000开发板的OpenHarmony环境搭建
摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况 本文分享自华为云社区<君正X2000开发板的OpenHarmony环境搭建>,作者: 星 ...
- Linux kernel4.4.12 添加make menuconfig 可选项
Linux kernel 源码添加可选项 闲来无事,顺便记录一篇在Linux kernel make menuconfig 内添加一个可选项. 说不定将来就要用到这个东西呢. linux kernel ...
- linux下查看和添加PATH环境变量
linux下查看和添加PATH环境变量 $PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑你的 PA ...
- 添加数据源,管理工具--数据源(ODBC),点击添加不显示该驱动
win7系统下或者64位系统下,安装完mysql-connector-odbc驱动后,直接进入:管理工具--数据源(ODBC),点击添加不显示该ODBC驱动 问题解决如下: C:\Users\Admi ...
随机推荐
- Hibernate知识总结(一)
一.ORM ORM的全称是Object/Relation Mapping,即对象/关系映射,可以将其理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射.可以把ORM看 ...
- python yield 关键字
最近看代码看到python里面的yield关键字,和我之前接触的语言好像都没有来着,我就查了查它的含义,大概理解如下: >>> def createGenerator(): ... ...
- Kali学习笔记33:Linux系统缓冲区溢出实验
之前做过一个Windows应用SLmail的缓冲区溢出的实验 这次来做一个Linux平台的缓冲区溢出实验: 缓冲区溢出是什么? 学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序 ...
- 基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息
技术栈 jquery 文件上传:jquery.fileupload,github 文档 apk 文件解析:app-info-parser,github 文档 参考:前端解析ipa.apk安装包信息 - ...
- dpkg: 处理软件包 qjackctl (--configure)时出错解决方法
第一步:备份 $ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info.bk 第二步:新建 $ sudo mkdir /var/lib/dpkg/info 第三步 ...
- Kubernetes集群搭建之CNI-Flanneld部署篇
本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 Flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具.它的主要思路 ...
- 【hadoop】1、MapReduce进行日志分析,并排序统计结果
1.网上很多关于搭建Hadoop集群的知识,这里不多做叙述,并且本机运行Hadoop程序是不需要hdfs集群的,我们本机运行只做个demo样式,当真的需要运行大数据的时候,才需要真正的集群 2.还有就 ...
- 【分布式事务】基于RocketMQ搭建生产级消息集群?
导读 目前很多互联网公司的系统都在朝着微服务化.分布式化系统的方向在演进,这带来了很多好处,也带来了一些棘手的问题,其中最棘手的莫过于数据一致性问题了.早期我们的软件功能都在一个进程中,数据的一致性可 ...
- git push 到github时,报错:ERROR: Permission to xxx.git denied to user
之前我电脑的本地git已经登录了一个github账号,今天想换另外一个新的github账户来提交项目,相当于同一台电脑使用两个github账户. 于是我先修改用户名和邮箱. git config -- ...
- Linux编程 20 shell编程(shell脚本创建,echo显示信息)
一概述 前面19章里已经掌握了linux系统和命令行的基础知识,从本章开始继续学习shell脚本的基础知识.在大量编辑shell脚本前,先来学习下一些基本概念. 1.1 使用多个命令 Shell ...