# BSP 内核启动错误及警告
## pll错误
~~~
[ 0.118408] Not Found clk pll_isp in script
[ 0.118535] Not Found clk pll_video in script
[ 0.118732] Not Found clk pll_ve in script
[ 0.118841] Not Found clk pll_periph0 in script
[ 0.119038] Not Found clk pll_de in script
~~~
drivers/clk/sunxi/clk-default.c
似乎是废弃的代码,warning不管
## I2C 错误
~~~
[ 0.126676] twi_chan_cfg()340 - [twi0] has no twi_regulator.
[ 0.126891] twi_chan_cfg()340 - [twi1] has no twi_regulator.
[ 0.127229] twi_request_gpio()408 - TWI0 devm_pinctrl_get() failed! return -22
[ 0.127447] sunxi_i2c_hw_init()1128 - [i2c0] request i2c gpio failed!
[ 0.127587] twi: probe of twi0 failed with error -5
~~~
drivers/i2c/busses/i2c-sunxi.c
~~~
static int __init sunxi_i2c_adap_init(void)
{
sunxi_twi_device_scan(); //填充platformdata
twi_chan_cfg(sunxi_twi_pdata); //获取twi通道在script里的使能情况
for (i=0; i<SUNXI_TWI_NUM; i++)
{
if (twi_chan_is_enable(i)) {
I2C_DBG("Sunxi I2C init channel %d \n", i);
ret = platform_device_register(&sunxi_twi_device[i]); //注册平台设备
if (ret < 0) {
I2C_ERR("platform_device_register(%d) failed, return %d\n", i, ret);
return ret;
}
sunxi_i2c_sysfs(&sunxi_twi_device[i]); //新建sys/devices/platform/twi.0
}
}
if (twi_used_mask)
return platform_driver_register(&sunxi_i2c_driver); //注册平台驱动
I2C_DBG("cannot find any using configuration for all twi controllers!\n");
return 0;
}
subsys_initcall(sunxi_i2c_adap_init);
~~~
驱动信息:
~~~
static struct platform_driver sunxi_i2c_driver = {
.probe = sunxi_i2c_probe,
.remove = __devexit_p(sunxi_i2c_remove),
.driver = {
.name = SUNXI_TWI_DEV_NAME,
.owner = THIS_MODULE,
.pm = SUNXI_I2C_DEV_PM_OPS,
},
};
~~~
驱动插入
~~~
static int __devinit sunxi_i2c_probe(struct platform_device *pdev)
{
struct sunxi_i2c *i2c = NULL;
struct resource *res = NULL;
struct sunxi_i2c_platform_data *pdata = NULL;
int ret, irq;
//获取内存和中断
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
irq = platform_get_irq(pdev, 0);
……
request_mem_region(res->start, resource_size(res), res->name)
……
//适配器的一些参数设置
i2c->adap.owner = THIS_MODULE;
i2c->adap.nr = pdata->bus_num;
i2c->adap.retries = 3;
i2c->adap.timeout = 5*HZ;
i2c->adap.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
i2c->bus_freq = pdata->frequency;
i2c->irq = irq;
i2c->bus_num = pdata->bus_num;
i2c->status = I2C_XFER_IDLE;
i2c->suspended = 0;
snprintf(i2c->adap.name, sizeof(i2c->adap.name), SUNXI_TWI_DEV_NAME"%u", i2c->adap.nr);
pdev->dev.init_name = i2c->adap.name;
i2c->mclk = clk_get(NULL, i2c->adap.name); //获取twi0时钟
i2c->base_addr = ioremap(res->start, resource_size(res)); //映射地址
i2c->adap.algo = &sunxi_i2c_algorithm; //i2c发送的具体方法
ret = request_irq(irq, sunxi_i2c_handler, IRQF_DISABLED, i2c->adap.name, i2c); //申请中断
i2c->adap.algo_data = i2c;
i2c->adap.dev.parent = &pdev->dev;
sunxi_i2c_hw_init(i2c, pdata) //硬件初始化i2c
ret = i2c_add_numbered_adapter(&i2c->adap); //i2c总线注册adapter device和client device,
platform_set_drvdata(pdev, i2c);
return 0;
……
}
~~~
硬件初始化过程
~~~
static int sunxi_i2c_hw_init(struct sunxi_i2c *i2c, struct sunxi_i2c_platform_data *pdata)
{
……
ret = twi_request_gpio(i2c);
if (ret < 0) {
I2C_ERR("[i2c%d] request i2c gpio failed!\n", i2c->bus_num);
return -1;
}
if (sunxi_i2c_clk_init(i2c)) {
I2C_ERR("[i2c%d] init i2c clock failed!\n", i2c->bus_num);
return -1;
}
twi_soft_reset(i2c->base_addr);
return ret;
}
~~~
申请GPIO
~~~
static int twi_request_gpio(struct sunxi_i2c *i2c)
{
I2C_DBG("Pinctrl init %d ... [%s]\n", i2c->bus_num, i2c->adap.dev.parent->init_name);
if (!twi_chan_is_enable(i2c->bus_num))
return -1;
i2c->pctrl = devm_pinctrl_get(i2c->adap.dev.parent);
if (IS_ERR(i2c->pctrl)) {
I2C_ERR("TWI%d devm_pinctrl_get() failed! return %ld\n", i2c->bus_num, PTR_ERR(i2c->pctrl));
return -1;
}
return twi_select_gpio_state(i2c->pctrl, PINCTRL_STATE_DEFAULT, i2c->bus_num);
}
~~~
- 前言
- 荔枝派TODO任务领取
- linux使用小贴士
- 入门篇
- 板卡介绍
- 开箱指南
- 烧录启动系统
- 联网方法
- 镜像使用
- 镜像说明
- buildroot系统使用
- debian系统使用
- 外设操作
- 外设操作概览
- 低速外设
- GPIO
- GPIO模拟低速接口
- UART
- PWM
- I2C
- SPI
- 高速接口
- SDIO
- USB
- EtherNet
- DVP CSI
- MIPI CSI
- 模拟外设
- CODEC
- LRADC
- 常见设备驱动
- USB摄像头
- USB 3G/4G 网卡
- 舵机
- 开发篇
- UBOOT适配
- UBOOT编译
- UBOOT配置
- UBOOT配置屏幕分辨率
- UBOOT配置SPI启动
- Linux内核开发
- Linux内核编译
- BSP Linux内核编译.md
- Linux内核选项
- 外设驱动与设备树
- RTL8723BS驱动
- 根文件系统定制
- buildroot定制系统
- buildroot添加软件包
- openwrt定制系统
- emdebian定制系统
- camdriod开发
- camdriod编译
- 主线Uboot引导Camdriod
- 系统镜像打包
- XBOOT适配
- 荔枝运行XBOOT
- 应用篇
- 游戏机-基于EmulationStation
- 游戏机-gnuboy
- 语音识别-科大讯飞云
- GUI-QT5
- 语音识别-离线关键词识别
- 路由器-Lichee Zero
- 投稿文章
- 荔枝派Zero开箱指南
- Zero i2c oled使用指南
- zero SPI LCD使用指南
- Zero u-boot编译和使用指南
- TF WiFi使用方法
- Zero Ethernet使用指南
- Zero 移植Qt5.4.1
- ZeroSpiNorFlash启动系统制作指南
- Visio-uboot-sunxi流程
- lichee 编译踩坑记录(ilichee ZERO)
- lichee_zero_外设GPIO接口
- TF WIFI 小白编
- 从零开始LicheePi Zero的开发
- 认识Zero的硬件
- 搭建Zero的开发环境
- 主线Uboot
- 主线kernel
- BSP kernel
- BSP内核启动
- bsp内核的摄像头使用
- BSP内核中的保留内存
- uboot启动BSP内核常见错误
- BSP内核 FBTFT移植
- BSP内核启动错误及警告解决
- buildroot 根文件系统
- emdebian 根文件系统
- SPI Flash 系统编译
- sunxi-fel增加对16M 以上flash的支持
- overlayfs的使用
- jffs2系统挂载不上的常见原因
- JFFS2 文件系统简介
- uboot对spi flash的识别
- bsp内核的SPI flash启动
- Docker开发环境
- Docker 命令速查
- 基础ubuntu系统配置
- docker离线镜像
- Zero系统烧录
- dd镜像烧录
- 分区镜像烧录
- SPI Flash系统烧录
- 一键镜像烧录
- Zero外设把玩
- I2C操作
- PWM输出
- CODEC的使用
- 以太网使用指南
- GPIO操作
- 文件IO方式
- C语言接口(mmap)
- Python操作GPIO
- pinctrl-sunxi介绍
- UART操作
- 点屏
- 点屏之RGB屏
- 点屏之SPI屏 ili9341
- 点屏之SPI OLED
- 点屏之I2C OLED
- 点屏之SPI屏 ili9488
- 点屏之MCU屏
- 点屏之触摸屏驱动
- 点屏之simple-framebuffer
- 点屏之屏幕时序
- 时钟控制器CCM
- 摄像头
- BSP DVP摄像头
- BSP MIPI 摄像头
- 主线DVP摄像头
- 主线 MIPI摄像头
- SPI 操作
- 应用层开发
- 开机自启动
- Segment Fault调试
- Zero通过OTG共享PC网络
- USB摄像头使用
- 基于QT的GUI开发
- 移植tslib
- 移植QT5.9.1
- 移植QT4.8.7
- QtCreator使用
- Qt5.x移植到Qt4.8
- Qt字体相关
- Qt移植总结
- Qt裁剪
- Qt去除鼠标指针显示
- zero_imager使用
- 驱动开发
- 设备树简介
- GPU/DRM 显示驱动
- sys下设备树查看
- atmel触摸屏驱动分析
- atmel触摸屏中断改轮询
- uboot下gpio操作
- helloworld驱动编译演示
- FBTFT分析
- 内核模块静态加载的顺序
- SPI驱动分析
- SPI 驱动编写
- Uboot开发
- 开机logo
- 看门狗的使用
- 关于系统reboot
- 内核printk等级设置