请选择 进入手机版 | 继续访问电脑版

Exynos4412/4418/6818/i.MX6开发板俱乐部

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8104|回复: 19

iTOP-4412开发板常见问题及解决办法

[复制链接]

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
发表于 2014-6-19 17:38:44 | 显示全部楼层 |阅读模式
以下跟帖是开发板使用过程中常见问题集锦,请不要跟帖,谢谢!
回复

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:40:41 | 显示全部楼层
iTOP-4412开发板,怎么更改默认休眠时间?

解答:
修改android的休眠默认时间:

frameworks/base/packages/SettingsProvider/res/values/defaults.xml,

< integer name="def_screen_off_timeout">60000< / integer>

默认值为60000ms,也就是60s,改成了600s就是10分钟后没有操作会关屏。

如果想让系统不休眠,修改成-1即可
回复 支持 1 反对 0

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:39:48 | 显示全部楼层
本帖最后由 TOPEET_Sun 于 2014-6-19 17:40 编辑

iTOP-4412开发板如何使声卡在内放和外放之间切换呢?

解答:
这实际上就是耳机和喇叭输出的选择切换,可以通过命令行来实现:
1)使用耳机输出
现在程序默认使用的耳机,使用耳机输入下面的命令:
tinymix 4 127
tinymix 5 1
tinymix 39 1
tinymix 46 1

2)使用外置的喇叭:
在串口输入以下命令:
tinymix 6 127
tinymix 7 1
tinymix 39 1
tinymix 44 1

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:41:37 | 显示全部楼层
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驱动就介绍到这里,大家有兴趣的话可以去内核里面详细的查看一下整个驱动的详细实现。
回复 支持 反对

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:42:32 | 显示全部楼层
iTOP-4412提供的摄像头模块能同时支持200w和500w模块吗?

解答:
请参照网址:
http://www.topeetboard.com/FAQ/20140606.html
回复 支持 反对

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:43:14 | 显示全部楼层
iTOP-4412开发板怎么修改电源管理芯片的输出电压?

解答:
iTOP-4412核心板使用的电源管理芯片是三星专门针对4412研发的S5M8767,S5M8767提供9路BUCK和28路LDO输出,每路电压的大小可以通过软件进行设置。
S5M8767的驱动位于内核的drivers/regulator/s5m8767.c文件中,Exynos 4412处理器是通过I2C总线来控制S5M8767的。S5M8767在系统启动的过程中会注册到内核里面的regulator模块里面。
regulator模块是内核用于控制系统中某些设备的电压/电流供应,在嵌入式系统(尤其是手持设备)中,控制耗电量很重要,它直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不使用,就可以通过regulator关闭其电源;或者降低提供给该模块的电压、电流大小来达到降低功耗的目的。 S5M8767驱动的主要作用就是调用regulator_register函数向内核注册regulator_dev设备,每个regulator_dev代表一个regulator设备,内核可以分别控制每个regulator。
为了实现S5m8767驱动还需要在平台相关的代码里定义regulator_init_data结构,regulator_init_data用来建立父子regulator、受电模块之间的树状结构,以及一些regulator的基本信息,比如电压大小等,下面我们来看下regulator_init_data结构的定义,代码在arch/arm/mach-exynos/mach-itop4412.c里面,在这个文件里使用宏REGULATOR_INIT定义了28个LDO的regulator_init_data结构,代码如下: #define REGULATOR_INIT(_ldo, _name, _min_uV, _max_uV, _always_on, _ops_mask,\
_disabled) \
static struct regulator_init_data s5m8767_##_ldo##_init_data = { \
.constraints = { \
.name = _name, \
.min_uV = _min_uV, \
.max_uV = _max_uV, \
.boot_on = _always_on, \
.apply_uV = 1, \
.valid_ops_mask = _ops_mask, \
.state_mem = { \
.disabled = _disabled, \
.enabled = !(_disabled), \
} \
}, \
.num_consumer_supplies = ARRAY_SIZE(s5m8767_##_ldo##_supply), \
.consumer_supplies = &s5m8767_##_ldo##_supply[0], \
}
上面的宏定义中,第三个和第四个参数指定了LDO的电压最小值和最大值,第五个参数设置LDO在系统开始运行时是输出还是关闭的(1是输出,0是关闭)。
第六个参数是LDO具有哪些功能,例如可以修改电压,电流,改变状态等等,通过位掩码的方式设置,第七个参数是设置在休眠的时候是否由PWREN引脚控制它的开关(1是由PWREN控制,0是不受PWREN控制),休眠的时候PWREN为低电平,LDO会关闭,系统唤醒,PWREN为高电平,LDO会输出。
例如LDO2的定义,如下:
REGULATOR_INIT(ldo2, "VDDQ_M12", 1500000, 1500000, 1,
REGULATOR_CHANGE_STATUS, 1)
根据定义,可以知道LDO2输出的电压是1.5v,系统启动的时候会默认输出,系统休眠的时候会关闭。其他的LDO的设置原理与LDO2是一样的。
系统中BUCK的定义,例如BUCK1:
static struct regulator_init_data s5m8767_buck1_data = {
.constraints = {
.name = "vdd_mif range",
.min_uV = 900000,
.max_uV = 1100000,
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
REGULATOR_CHANGE_STATUS,
.state_mem = {
.disabled = 1,
},
},
.num_consumer_supplies = 1,
.consumer_supplies = &s5m8767_buck1_consumer,
};
根据上面的定义,可以知道BUCK1的电压范围在0.9v到1.1v,他具有可以修改电压,修改状态的功能(变量valid_ops_mask)。可以使用函数regulator_set_voltage修改BUCK1的电压。其他几个BUCK的定义原理和BUCK1是一样的
如果我们想要修改8767的某个LDO的输出电压,就可以通过修改对应LDO的regulator_init_data结构体里面的电压值来实现,修改BUCK的电压可以使用函数regulator_set_voltage来实现。
注意:因为S5M8767的每个BUCK和LDO都有各自规定的输出最大值,因此在修改输出电压的时候,一定要参照S5M8767的datasheet,确保修改的电压在datasheet规定的范围内。
回复 支持 反对

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:43:50 | 显示全部楼层
iTOP-4412开发板,运行Linux QT系统,U盘不能挂载,什么原因?

解答:
linux QT系统下挂载u盘,首先用命令mknod /dev/sda1 b 8 1创建U盘的设备节点,然后使用命令mount /dev/sda1 /mnt/udisk/挂载u盘即可。
回复 支持 反对

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:44:23 | 显示全部楼层
iTOP-4412开发板,怎么修改开机lcd显示的logo?

解答:
http://www.topeetboard.com/FAQ/20140602.html
回复 支持 反对

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:44:56 | 显示全部楼层
iTOP-4412开发板,开发板上的几个按键,怎么样定义成自己需要的功能?

解答:
修改内核源码:arch/arm/mach-exynos/mach-itop4412.c,找到里面的gpio_buttons数组仿照里面的格式,把code的值修改成需要的功能就可以。
回复 支持 反对

使用道具 举报

58

主题

122

帖子

382

积分

版主

Rank: 7Rank: 7Rank: 7

积分
382
 楼主| 发表于 2014-6-19 17:45:36 | 显示全部楼层
iTOP4412开发板去掉底板上的重力加速,系统不能启动了

解答:
修改Android源码device/samsung/smdk4x12/device.mk文件,找到里面的
#replace sensor
#PRODUCT_COPY_FILES += \
# device/samsung/smdk4x12/apk/sensors.smdk4x12.so:system/lib/hw/sensors.smdk4x12.so
修改如下:
#replace sensor
PRODUCT_COPY_FILES += \
device/samsung/smdk4x12/apk/sensors.smdk4x12.so:system/lib/hw/sensors.smdk4x12.so
然后找到:
ifeq ($(BOARD_HAVE_MPU6050),true)
include $(LOCAL_PATH)/../common/libsensors_mpu6050/libsensors_product_packages.mk
endif
修改如下:
#ifeq ($(BOARD_HAVE_MPU6050),true)
# include $(LOCAL_PATH)/../common/libsensors_mpu6050/libsensors_product_packages.mk
#endif
如果已经编译过Android了,进入到目录(如果没有编译过,就直接执行./build_android.sh编译Android)
out/target/product/smdk4x12
使用rm命令删除掉下面的文件:
rm -rf ./system/lib/hw/sensors.smdk4x12.so
rm -rf ./obj/lib/sensors.smdk4x12.so
然后回到源码目录下,重新执行./build_android.sh,编译Android
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|迅为电子 ( 京ICP备12036083号-2

GMT+8, 2017-2-26 09:02 , Processed in 0.180418 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表