iTOP-4412 开发板的 GPIO 是怎么操作的?
Exynos4412 全部的 GPIO 都有固定的地址,为了方便操作这些 GPIO。Linux 内核
在 gpio-exynos4.h 里面定义了一些 GPIO 的宏。比如:
#define EXYNOS4_GPA0(_nr) (EXYNOS4_GPIO_A0_START + (_nr))
#define EXYNOS4_GPA1(_nr) (EXYNOS4_GPIO_A1_START + (_nr))
#define EXYNOS4_GPB(_nr) (EXYNOS4_GPIO_B_START + (_nr))
.....................................
#define EXYNOS4_GPY5(_nr) (EXYNOS4_GPIO_Y5_START + (_nr))
#define EXYNOS4_GPY6(_nr) (EXYNOS4_GPIO_Y6_START + (_nr))
#define EXYNOS4_GPZ(_nr) (EXYNOS4_GPIO_Z_START + (_nr))
这些宏就是把每一个 GPIO 的地址做了一下封装,它的优点就是方便我们使用而且
依据宏的名字就能直观的知道是在操作哪个 GPIO。
Linux 内核中关于 GPIO 的驱动在 driver/gpio/gpio-exynos4.c 文件中面。 在这
个文件里 GPIO 驱动初始化入口函数是 exynos4_gpiolib_init。 由于这个文件同
时也支持 4210 的 GPIO。所以開始先初始化了一些通用的 GPIO (4412 和 4210 都
有的 GPIO) ,代码例如以下:
chip = exynos4_gpio_common_4bit;
nr_chips = ARRAY_SIZE(exynos4_gpio_common_4bit);
for (i = 0; i < nr_chips; i++, chip++) {
if (chip->config == NULL)
chip->config = &gpio_cfg;
if (chip->base == NULL)
pr_err("No allocation of base address for [common gpio]");
}
samsung_gpiolib_add_4bit_chips(exynos4_gpio_common_4bit,
nr_chips);
变量 exynos4_gpio_common_4bit 是一个数组。 定义了一些通用的 GPIO, nr_chips
是记录的 exynos4_gpio_common_4bit 数组里面素个数。
首先使用 for 循环遍历 exynos4_gpio_common_4bit 全部的素,为每一个素的
config 结构赋值:
if (chip->config == NULL)
chip->config = &gpio_cfg;
gpio_cfg 是类型为 s3c_gpio_cfg 的结构体。这个结构体的定义例如以下:
struct s3c_gpio_cfg {
unsigned int cfg_eint;
s3c_gpio_pull_t (*get_pull)(struct s3c_gpio_chip *chip, unsigned
offs);
int (*set_pull)(struct s3c_gpio_chip *chip, unsigned offs,
s3c_gpio_pull_t pull);
unsigned (*get_config)(struct s3c_gpio_chip *chip, unsigned offs);
int (*set_config)(struct s3c_gpio_chip *chip, unsigned offs,
unsigned config);
};
通过上面的代码我们能够看到这个结构体里主要是一些函数指针。get_pull 是
获取 GPIO 的上拉状态。set_pull 是设置 GPIO 上拉或下拉的,set_config 是设
置 GPIO 的工作模式,比如:输出/输入/其它功能。以下我们来看看 gpio_cfg
变量的定义,例如以下:
static struct s3c_gpio_cfg gpio_cfg = {
.set_config = s3c_gpio_setcfg_s3c64xx_4bit,
.set_pull = s3c_gpio_setpull_exynos4,
.get_pull = s3c_gpio_getpull_exynos4,
};
通过上面的代码。能够看到分别对 gpio_cfg 结构的三个函数指针赋值。这三个
函数 的 定义 是在 gpio-config.c 里面 实现 的 , 这个 文 件 在 内核 源 码
arch/arm/plat-samsung 文件夹下,这三个函数的作用就是依据传进来的參数,配
置 GPIO 对应的寄存器,从而实现对 GPIO 的操作。
然后 我们 回到 gpio-exynos4.c , 接 着看 下 面 的代 码, 完毕 了
exynos4_gpio_common_4bit 中每一个素的 config 结构赋值后。 接着会调用函数
samsung_gpiolib_add_4bit_chips(exynos4_gpio_common_4bit, nr_chips) 来
向系统注冊 GPIO 结构体。
代码例如以下:
void __init samsung_gpiolib_add_4bit_chips(struct s3c_gpio_chip *chip,
int nr_chips)
{
for (; nr_chips > 0; nr_chips--, chip++) {
samsung_gpiolib_add_4bit(chip);
s3c_gpiolib_add(chip);
}
}
上面的代码主要有两个函数组成各自是 samsung_gpiolib_add_4bit(chip) 和
s3c_gpiolib_add(chip)。 首先我们来看下 samsung_gpiolib_add_4bit(chip)函
数的实现:
void __init samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip)
{
chip->chip.direction_input = samsung_gpiolib_4bit_input;
chip->chip.direction_output = samsung_gpiolib_4bit_output;
chip->pm = __gpio_pm(&s3c_gpio_pm_4bit);
}
这个函数也是为函数指针赋值。direction_input 是设置 GPIO 为输入模式,
direction_output 是设置 GPIO 为输出。
s3c_gpiolib_add(chip)函数主要作用是给一些函数指针赋值。然后依据传进来
的參数把相应的 GPIO 的信息保存到 gpio_desc 结构里,gpio_desc 是内核里面
定义的一个全局变量。用来保存每一个 GPIO 的信息。
至此 GPIO 的驱动初始化就完
成了。其它它主要完毕的功能就是为每一个 GPIO 的结构体里面的函数指针赋值,
最后把每一个 GPIO 结构信息保存到全局变量 gpio_desc 里面。
上面已经完毕了一些通用的 GPIO 驱动的初始化,我们在回到 gpio-exynos4.c,
以下是依据 CPU 的型号初始化 CPU 特定的 GPIO 了。代码例如以下:
/* Only 4210 GPIO part */
if (soc_is_exynos4210()) {
chip = exynos4210_gpio_4bit;
nr_chips = ARRAY_SIZE(exynos4210_gpio_4bit);
for (i = 0; i < nr_chips; i++, chip++) {
if (chip->config == NULL)
chip->config = &gpio_cfg;
if (chip->base == NULL)
pr_err("No allocation of base address [4210 gpio]");
}
samsung_gpiolib_add_4bit_chips(exynos4210_gpio_4bit,
nr_chips);
} else {
/* Only 4212/4412 GPIO part */
chip = exynos4212_gpio_4bit;
nr_chips = ARRAY_SIZE(exynos4212_gpio_4bit);
for (i = 0; i < nr_chips; i++, chip++) {
if (chip->config == NULL)
chip->config = &gpio_cfg;
if (chip->base == NULL)
pr_err("No allocation of base address [4212 gpio]");
}
samsung_gpiolib_add_4bit_chips(exynos4212_gpio_4bit,
nr_chips);
}
通过看上面的代码,初始化过程与前面介绍的初始化通用 GPIO 原理是一样的,
这里我们不在细介绍。对全部 GPIO 的初始化完毕以后内核中的其它驱动模块
就能够方便的使用我们注冊到 gpio_desc 里面的 GPIO 了。
内核提供了几个全局
函数来操作这些 GPIO:
int gpio_request(unsigned gpio, const char *label)
void gpio_free(unsigned gpio)
int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)
gpio_request 函数是申请 GPIO 操作, 依据传递进来的參数 gpio。 会去全局变量
gpio_desc 里面找到相应的 GPIO 结构,推断 desc 的标志位 flag 有没有被设置
FLAG_REQUESTED,假设有设置说明其它地方在使用这个 GPIO。程序返回-EBUSY
错误,假设没有设置就设置 flags 的标记为 FLAG_REQUESTED。
gpio_free 函数是释放 GPIO 操作,依据传递进来的參数,在 gpio_desc 全局变
量找到相应的 GPIO 结构,清除掉 desc 的 flag 标志变量的 FLAG_REQUESTED 位。
s3c_gpio_setpull 函数是设置 GPIO 的上拉或下拉的,变量 pull 的取值范围如
下定义:
#define S3C_GPIO_PULL_NONE ((__force s3c_gpio_pull_t)0x00)
#define S3C_GPIO_PULL_DOWN ((__force s3c_gpio_pull_t)0x01)
#define S3C_GPIO_PULL_UP ((__force s3c_gpio_pull_t)0x02)
S3C_GPIO_PULL_NONE 是悬空
S3C_GPIO_PULL_DOWN 是下拉
S3C_GPIO_PULL_UP 是上拉
s3c_gpio_cfgpin 函数是设置 GPIO 的功能:输入/输出/其它功能,第二个參数
config 取值范围例如以下:
#define S3C_GPIO_INPUT (S3C_GPIO_SPECIAL(0))
#define S3C_GPIO_OUTPUT (S3C_GPIO_SPECIAL(1))
#define S3C_GPIO_SFN(x) (S3C_GPIO_SPECIAL(x))
S3C_GPIO_INPUT 是输入模式,S3C_GPIO_OUTPUT 是输出模式。S3C_GPIO_SFN(x)
是其它模式,比如中断模式等。
gpio_direction_input 函数设置 GPIO 是输入功能。
gpio_direction_output 设置 GPIO 输出,第二个參数 value 取值 0 或 1,0 代表
输出低电平。1 代表输出高电平。
以下我们来看几个 GPIO 操作的样例:
if (gpio_request(EXYNOS4_GPX3(3), "MPU6050 INT"))
printk(KERN_WARNING "MPU6050 INT(GPX3.3) Port request error!!!\n");
else{
s3c_gpio_setpull(EXYNOS4_GPX3(3), S3C_GPIO_PULL_NONE);
s3c_gpio_cfgpin(EXYNOS4_GPX3(3), S3C_GPIO_SFN(0));
gpio_direction_input(EXYNOS4_GPX3(3));
gpio_free(EXYNOS4_GPX3(3));
}
上面的代码是设置 GPIO 引脚 GPX3_3 为输入模式。悬空。
err = gpio_request_one(EXYNOS4_GPX0(0), GPIOF_IN, "mcp251x_INT");
if (err) {
printk(KERN_ERR "failed to request mcp251x_INT\n");
return -1;
}
s3c_gpio_cfgpin(EXYNOS4_GPX0(0), S3C_GPIO_SFN(0xf));
s3c_gpio_setpull(EXYNOS4_GPX0(0), S3C_GPIO_PULL_NONE);
gpio_free(EXYNOS4_GPX0(0));
上面的代码设置 GPIO 引脚 GPX0_0 为中断模式。
if(gpio_request(EXYNOS4_GPK1(0), "GPK1_0"))
{
printk(KERN_ERR "failed to request GPK1_0 for "
"USI control\n");
return err;
}
gpio_direction_output(EXYNOS4_GPK1(0), 1);
s3c_gpio_cfgpin(EXYNOS4_GPK1(0), S3C_GPIO_OUTPUT);
gpio_free(EXYNOS4_GPK1(0));
上面的代码设置 GPIO 引脚 GPK1_0 为输出模式,而且输出高电平。
iTOP-4412 的 GPIO 驱动就介绍到这里,大家有兴趣的话能够去内核里面细的
查看一下整个驱动的细实现。
Exynos4412 全部的 GPIO 都有固定的地址。为了方便操作这些 GPIO,Linux 内核
在 gpio-exynos4.h 里面定义了一些 GPIO 的宏,比如:
#define EXYNOS4_GPA0(_nr) (EXYNOS4_GPIO_A0_START + (_nr))
#define EXYNOS4_GPA1(_nr) (EXYNOS4_GPIO_A1_START + (_nr))
#define EXYNOS4_GPB(_nr) (EXYNOS4_GPIO_B_START + (_nr))
.....................................
#define EXYNOS4_GPY5(_nr) (EXYNOS4_GPIO_Y5_START + (_nr))
#define EXYNOS4_GPY6(_nr) (EXYNOS4_GPIO_Y6_START + (_nr))
#define EXYNOS4_GPZ(_nr) (EXYNOS4_GPIO_Z_START + (_nr))
这些宏就是把每一个 GPIO 的地址做了一下封装,它的优点就是方便我们使用而且
依据宏的名字就能直观的知道是在操作哪个 GPIO。
Linux 内核中关于 GPIO 的驱动在 driver/gpio/gpio-exynos4.c 文件中面, 在这
个文件里 GPIO 驱动初始化入口函数是 exynos4_gpiolib_init, 由于这个文件同
时也支持 4210 的 GPIO,所以開始先初始化了一些通用的 GPIO (4412 和 4210 都
有的 GPIO) ,代码例如以下:
chip = exynos4_gpio_common_4bit;
nr_chips = ARRAY_SIZE(exynos4_gpio_common_4bit);
for (i = 0; i < nr_chips; i++, chip++) {
if (chip->config == NULL)
chip->config = &gpio_cfg;
if (chip->base == NULL)
pr_err("No allocation of base address for [common gpio]");
}
samsung_gpiolib_add_4bit_chips(exynos4_gpio_common_4bit,
nr_chips);
变量 exynos4_gpio_common_4bit 是一个数组, 定义了一些通用的 GPIO, nr_chips
是记录的 exynos4_gpio_common_4bit 数组里面素个数。
首先使用 for 循环遍历 exynos4_gpio_common_4bit 全部的素。为每一个素的
config 结构赋值:
if (chip->config == NULL)
chip->config = &gpio_cfg;
gpio_cfg 是类型为 s3c_gpio_cfg 的结构体,这个结构体的定义例如以下:
struct s3c_gpio_cfg {
unsigned int cfg_eint;
s3c_gpio_pull_t (*get_pull)(struct s3c_gpio_chip *chip, unsigned
offs);
int (*set_pull)(struct s3c_gpio_chip *chip, unsigned offs,
s3c_gpio_pull_t pull);
unsigned (*get_config)(struct s3c_gpio_chip *chip, unsigned offs);
int (*set_config)(struct s3c_gpio_chip *chip, unsigned offs,
unsigned config);
};
通过上面的代码我们能够看到这个结构体里主要是一些函数指针,get_pull 是
获取 GPIO 的上拉状态,set_pull 是设置 GPIO 上拉或下拉的。set_config 是设
置 GPIO 的工作模式,比如:输出/输入/其它功能。以下我们来看看 gpio_cfg
变量的定义。例如以下:
static struct s3c_gpio_cfg gpio_cfg = {
.set_config = s3c_gpio_setcfg_s3c64xx_4bit,
.set_pull = s3c_gpio_setpull_exynos4,
.get_pull = s3c_gpio_getpull_exynos4,
};
通过上面的代码,能够看到分别对 gpio_cfg 结构的三个函数指针赋值,这三个
函数 的 定义 是在 gpio-config.c 里面 实现 的 , 这个 文 件 在 内核 源 码
arch/arm/plat-samsung 文件夹下,这三个函数的作用就是依据传进来的參数,配
置 GPIO 对应的寄存器,从而实现对 GPIO 的操作。
然后 我们 回到 gpio-exynos4.c 。 接 着看 下 面 的代 码, 完毕 了
exynos4_gpio_common_4bit 中每一个素的 config 结构赋值后, 接着会调用函数
samsung_gpiolib_add_4bit_chips(exynos4_gpio_common_4bit, nr_chips) 来
向系统注冊 GPIO 结构体。代码例如以下:
void __init samsung_gpiolib_add_4bit_chips(struct s3c_gpio_chip *chip,
int nr_chips)
{
for (; nr_chips > 0; nr_chips--, chip++) {
samsung_gpiolib_add_4bit(chip);
s3c_gpiolib_add(chip);
}
}
上面的代码主要有两个函数组成各自是 samsung_gpiolib_add_4bit(chip) 和
s3c_gpiolib_add(chip)。 首先我们来看下 samsung_gpiolib_add_4bit(chip)函
数的实现:
void __init samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip)
{
chip->chip.direction_input = samsung_gpiolib_4bit_input;
chip->chip.direction_output = samsung_gpiolib_4bit_output;
chip->pm = __gpio_pm(&s3c_gpio_pm_4bit);
}
这个函数也是为函数指针赋值,direction_input 是设置 GPIO 为输入模式,
direction_output 是设置 GPIO 为输出。
s3c_gpiolib_add(chip)函数主要作用是给一些函数指针赋值。然后依据传进来
的參数把相应的 GPIO 的信息保存到 gpio_desc 结构里,gpio_desc 是内核里面
定义的一个全局变量,用来保存每一个 GPIO 的信息。
至此 GPIO 的驱动初始化就完
成了。其它它主要完毕的功能就是为每一个 GPIO 的结构体里面的函数指针赋值。
最后把每一个 GPIO 结构信息保存到全局变量 gpio_desc 里面。
上面已经完毕了一些通用的 GPIO 驱动的初始化,我们在回到 gpio-exynos4.c。
以下是依据 CPU 的型号初始化 CPU 特定的 GPIO 了,代码例如以下:
/* Only 4210 GPIO part */
if (soc_is_exynos4210()) {
chip = exynos4210_gpio_4bit;
nr_chips = ARRAY_SIZE(exynos4210_gpio_4bit);
for (i = 0; i < nr_chips; i++, chip++) {
if (chip->config == NULL)
chip->config = &gpio_cfg;
if (chip->base == NULL)
pr_err("No allocation of base address [4210 gpio]");
}
samsung_gpiolib_add_4bit_chips(exynos4210_gpio_4bit,
nr_chips);
} else {
/* Only 4212/4412 GPIO part */
chip = exynos4212_gpio_4bit;
nr_chips = ARRAY_SIZE(exynos4212_gpio_4bit);
for (i = 0; i < nr_chips; i++, chip++) {
if (chip->config == NULL)
chip->config = &gpio_cfg;
if (chip->base == NULL)
pr_err("No allocation of base address [4212 gpio]");
}
samsung_gpiolib_add_4bit_chips(exynos4212_gpio_4bit,
nr_chips);
}
通过看上面的代码,初始化过程与前面介绍的初始化通用 GPIO 原理是一样的,
这里我们不在细介绍。对全部 GPIO 的初始化完毕以后内核中的其它驱动模块
就能够方便的使用我们注冊到 gpio_desc 里面的 GPIO 了。内核提供了几个全局
函数来操作这些 GPIO:
int gpio_request(unsigned gpio, const char *label)
void gpio_free(unsigned gpio)
int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)
gpio_request 函数是申请 GPIO 操作。 依据传递进来的參数 gpio, 会去全局变量
gpio_desc 里面找到相应的 GPIO 结构,推断 desc 的标志位 flag 有没有被设置
FLAG_REQUESTED,假设有设置说明其它地方在使用这个 GPIO。程序返回-EBUSY
错误。假设没有设置就设置 flags 的标记为 FLAG_REQUESTED。
gpio_free 函数是释放 GPIO 操作,依据传递进来的參数。在 gpio_desc 全局变
量找到相应的 GPIO 结构,清除掉 desc 的 flag 标志变量的 FLAG_REQUESTED 位。
s3c_gpio_setpull 函数是设置 GPIO 的上拉或下拉的,变量 pull 的取值范围如
下定义:
#define S3C_GPIO_PULL_NONE ((__force s3c_gpio_pull_t)0x00)
#define S3C_GPIO_PULL_DOWN ((__force s3c_gpio_pull_t)0x01)
#define S3C_GPIO_PULL_UP ((__force s3c_gpio_pull_t)0x02)
S3C_GPIO_PULL_NONE 是悬空
S3C_GPIO_PULL_DOWN 是下拉
S3C_GPIO_PULL_UP 是上拉
s3c_gpio_cfgpin 函数是设置 GPIO 的功能:输入/输出/其它功能。第二个參数
config 取值范围例如以下:
#define S3C_GPIO_INPUT (S3C_GPIO_SPECIAL(0))
#define S3C_GPIO_OUTPUT (S3C_GPIO_SPECIAL(1))
#define S3C_GPIO_SFN(x) (S3C_GPIO_SPECIAL(x))
S3C_GPIO_INPUT 是输入模式,S3C_GPIO_OUTPUT 是输出模式,S3C_GPIO_SFN(x)
是其它模式。比如中断模式等。
gpio_direction_input 函数设置 GPIO 是输入功能。
gpio_direction_output 设置 GPIO 输出,第二个參数 value 取值 0 或 1,0 代表
输出低电平,1 代表输出高电平。
以下我们来看几个 GPIO 操作的样例:
if (gpio_request(EXYNOS4_GPX3(3), "MPU6050 INT"))
printk(KERN_WARNING "MPU6050 INT(GPX3.3) Port request error!!!\n");
else{
s3c_gpio_setpull(EXYNOS4_GPX3(3), S3C_GPIO_PULL_NONE);
s3c_gpio_cfgpin(EXYNOS4_GPX3(3), S3C_GPIO_SFN(0));
gpio_direction_input(EXYNOS4_GPX3(3));
gpio_free(EXYNOS4_GPX3(3));
}
上面的代码是设置 GPIO 引脚 GPX3_3 为输入模式。悬空。
err = gpio_request_one(EXYNOS4_GPX0(0), GPIOF_IN, "mcp251x_INT");
if (err) {
printk(KERN_ERR "failed to request mcp251x_INT\n");
return -1;
}
s3c_gpio_cfgpin(EXYNOS4_GPX0(0), S3C_GPIO_SFN(0xf));
s3c_gpio_setpull(EXYNOS4_GPX0(0), S3C_GPIO_PULL_NONE);
gpio_free(EXYNOS4_GPX0(0));
上面的代码设置 GPIO 引脚 GPX0_0 为中断模式。
if(gpio_request(EXYNOS4_GPK1(0), "GPK1_0"))
{
printk(KERN_ERR "failed to request GPK1_0 for "
"USI control\n");
return err;
}
gpio_direction_output(EXYNOS4_GPK1(0), 1);
s3c_gpio_cfgpin(EXYNOS4_GPK1(0), S3C_GPIO_OUTPUT);
gpio_free(EXYNOS4_GPK1(0));
上面的代码设置 GPIO 引脚 GPK1_0 为输出模式。而且输出高电平。
iTOP-4412 的 GPIO 驱动就介绍到这里,大家有兴趣的话能够去内核里面细的
查看一下整个驱动的细实现。
iTOP-4412 开发板的 GPIO 是怎么操作的?的更多相关文章
- 基于讯为4412开发板的Android开发流程
讯为4412开发板 使用三星2410芯片,基于arm9架构,由于自己电脑硬件的局限,只能跑Android4.0.3系统. 1.Uboot这个直接使用官方镜像烧写就可以了,一般情况不用去重复烧写. 略 ...
- 【开学季】自学嵌入式开发|四核开发板|4412开发板|ARM+Android+linux技术
淘宝店铺:迅为开发板http://arm-board.taobao.com 网站:http://www.topeetboard.com QQ咨询:2551456065 电话咨询:010-5895758 ...
- 迅为三星Exynos 4412开发板四核Cortex-A9ARM安卓linux开发板
开发板光盘资料包含:原理图(PDF格式).底板PCB(Allegro格式).驱动程序源码.芯片和LCD数据手册.开发环境.产品使用手册. 4412开发板简介: iTOP-Exynos4412开发板采用 ...
- 迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法
迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法 详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com/ 用户在开发板上运 ...
- 【转帖】嵌入式4412开发板QT5.7编译安装到arm
QT5.7.0+UBUNTU16.04+ARM-NONE-LINUX-GNUEABI4.8+busybox最小LINUX系统 Orandragon记录 本文转自迅为4412开发板群:http://to ...
- 4412开发板升级4.2之后改了logo开机后屏幕闪解决办法
荣品4412开发板升级到4.2请注意增加虚拟机内存. 问:荣品4412开发板升级到Android4.2之后,改了logo.4412板子开机后,过一会屏幕就一闪一闪,是什么原因? Android4.2编 ...
- [转帖]4412开发板/4418开发板Android4.4.4实现ble功能
本文转自迅为论坛:http://bbs.topeetboard.com ①.4418开发板实现ble功能方法: 在4418/android/device/nexell/drone2/device.mk ...
- 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板
网站:http://www.topeetboard.com 光盘资料+网盘资料+配套视频+售后支持,助您加速学习研发的进程 产品介绍 iTOP-Exynos4412开发板采用 Exynos4412的主 ...
- 迅为4412开发板支持AVIN视频输入/AV监控摄像头输入模块
AVIN模块(iTOP-4412开发板专用) 产品介绍:视频输入/AV监控摄像头输入模块: 该模块及配套的软件为开发视频采集.监控.车载后视等产品提供了很好的参考. iTOP-4412 开发平台 开发 ...
随机推荐
- Swift 学习之二十一:?和 !(详解)
http://blog.csdn.net/woaifen3344/article/details/30244201 Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始 ...
- 使用go写一个检测tcpudp状态的包
使用go写一个检测tcpudp状态的包 http://www.2cto.com/os/201501/367596.html
- 用java实现word转html
由于项目需要,要完成将上传的word文件转成html文件的功能.在网上搜了一下,大致有3种方法:1.用jacob实现 2.用poi实现 3.用openoffice实现. 从网上来看好像jacob用的人 ...
- delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同,内存分配函数
来自:http://www.cnblogs.com/qiusl/p/4028437.html?utm_source=tuicool&utm_medium=referral ---------- ...
- KVM(二)CPU 和内存虚拟化
1. 为什么需要 CPU 虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring 是指 ...
- (八)MySQL索引操作
(1)准备环境 mysql> create table t1(id int,name varchar(50)); mysql> \d $$ mysql> create procedu ...
- java网络通信:TCP协议
面试的时候,面试官由于需要考察一个面试人对于网络编程的熟悉程度,往往会考察学生对于TCP.HTTP.UDP.这些常见的网络编程当中的协议的了解程度,而TCP协议则是首当其冲的,作为进程之间通信常用的一 ...
- 【cocos2d-js官方文档】十七、事件分发机制
简介http://blog.csdn.net/qinning199/article/details/41951517 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处 ...
- json数据格式了解
json数据格式介绍: https://en.wikipedia.org/wiki/JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 json语法 ...
- (5)python 字符串和输入输出
一.字符串转义 字符串可以包含任何字符可以用单引号也可以用双引号 a='hello' a="hello" 如果字符串中存在单引号,可以用双引号里包含单引号的方式 a="I ...