初接触RK新平台,记录一下,省去后面反复查找的时间:
1、首先知道文档和工具目录:RKDocs RKTools
2、根据文档熟悉编译命令:基本各大平台都是一样,但是和mtk稍有不一样,mtk完全的编译命令,make -j8包含所有的模块;而rk的make -j8 只是android模块,如果修改驱动需要进入到kernel目录下编译。
3、熟悉各工具的使用,这一步有朋友做过的话,稍微问一下,问题不大,不需要浪费太多的时间折腾。
4、重点,代码平台的熟悉,由于上层通用,主要说下驱动:
A、找到平台启动入口目录:kernelarcharmmach-rk3188 也有很大一部分是公用rk30的 kernelarcharmmach-rk30
B、入口文件:board-rk3188-sdk.c 从下往上看:
MACHINE_START(RK30, "RK30board")
.boot_params = PLAT_PHYS_OFFSET + 0x800,
.fixup = rk30_fixup,
.reserve = &rk30_reserve,
.map_io = rk30_map_io,
.init_irq = rk30_init_irq,
.timer = &rk30_timer,
.init_machine = machine_rk30_board_init,
MACHINE_END
fixup,reserve, map_io,irq,timer等初级阶段暂时可以不用了解,个人感觉二次开发很少需要改动到这些的东西,都是地址分配,映射,中断分配等。直接从machine_rk30_board_init进入rk的世界。
================================================================================================================================================================
问题点:调试gsensor、陀螺仪。
和很多其他平台一样,rk为了减少自己也为了减少客户的工作量,把sensor增加了一个类似中间层的驱动,主要文件sensor-dev.c sensor-i2c.c,其他依葫芦画瓢。有几点值得注意的地方:
1、很多人认为gsensor、陀螺仪必须使用polling的方式,其实在新的内核上,request_threaded_irq线程中断很好用,并且节省资源。rk采用的这种方式,但是中断方式,感觉老有中断不出来的情况。调试又无从下手,比较郁闷。
2、线程中断函数中如果是电平中断必须添加IRQF_ONESHOT,原理自己百度。
3、gsensor和陀螺仪有不同的地方,在默认的hal或者上层,有自动打开gsensor的方式,所以驱动调试通,马上就有数据出来。但是陀螺仪不同,上层没有打开的地方,必须自己打开,通过ioctl接口操作,来让数据输出。(其实道理很简单,但是卡了我小半天)。
========================================================================================================================================================================================
RK3288 查看打log的串口:
config中:#define CONFIG_RK_DEBUG_UART 2
初接触RK新平台,记录一下,省去后面反复查找的时间:
1、首先知道文档和工具目录:RKDocs RKTools
2、根据文档熟悉编译命令:基本各大平台都是一样,但是和mtk稍有不一样,mtk完全的编译命令,make -j8包含所有的模块;而rk的make -j8 只是android模块,如果修改驱动需要进入到kernel目录下编译。
3、熟悉各工具的使用,这一步有朋友做过的话,稍微问一下,问题不大,不需要浪费太多的时间折腾。
4、重点,代码平台的熟悉,由于上层通用,主要说下驱动:
A、找到平台启动入口目录:kernelarcharmmach-rk3188 也有很大一部分是公用rk30的 kernelarcharmmach-rk30
B、入口文件:board-rk3188-sdk.c 从下往上看:
MACHINE_START(RK30, "RK30board")
.boot_params = PLAT_PHYS_OFFSET + 0x800,
.fixup = rk30_fixup,
.reserve = &rk30_reserve,
.map_io = rk30_map_io,
.init_irq = rk30_init_irq,
.timer = &rk30_timer,
.init_machine = machine_rk30_board_init,
MACHINE_END
fixup,reserve, map_io,irq,timer等初级阶段暂时可以不用了解,个人感觉二次开发很少需要改动到这些的东西,都是地址分配,映射,中断分配等。直接从machine_rk30_board_init进入rk的世界。
================================================================================================================================================================
问题点:调试gsensor、陀螺仪。
和很多其他平台一样,rk为了减少自己也为了减少客户的工作量,把sensor增加了一个类似中间层的驱动,主要文件sensor-dev.c sensor-i2c.c,其他依葫芦画瓢。有几点值得注意的地方:
1、很多人认为gsensor、陀螺仪必须使用polling的方式,其实在新的内核上,request_threaded_irq线程中断很好用,并且节省资源。rk采用的这种方式,但是中断方式,感觉老有中断不出来的情况。调试又无从下手,比较郁闷。
2、线程中断函数中如果是电平中断必须添加IRQF_ONESHOT,原理自己百度。
3、gsensor和陀螺仪有不同的地方,在默认的hal或者上层,有自动打开gsensor的方式,所以驱动调试通,马上就有数据出来。但是陀螺仪不同,上层没有打开的地方,必须自己打开,通过ioctl接口操作,来让数据输出。(其实道理很简单,但是卡了我小半天)。
========================================================================================================================================================================================
RK3288 查看打log的串口:
config中:#define CONFIG_RK_DEBUG_UART 2
举报