# 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等級設置