电话+V:192606-48052 ,欢迎咨询rk3568编译内核源码,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]
欲手动编译瑞芯微RK3568的SDK,需先查询建制root的帮助,操作命令为配置buildroot对应的默认配置(defconfig),然后进行编译。只需留在SDK根目录下,不必进入buildroot文件夹。
对应平台的默认配置文件由./build.shlunch操作中选择的mk文件决定。配置完成后,查看device/rockchip/rk356x/BoardConfig-rk3568-evb1-ddr4-v10.mk文件,由RK_CFG_BUILDROOT决定。
导入指定的默认配置,操作命令为sourceenvsetup.shrockchip_rk3568,进入menuconfig修改buildroot配置。进入配置界面,输入“/”进行搜索功能查找所需目标配置。使用空格键修改配置,按ESC键退出menuconfig。
在修改默认配置前,备份旧的配置。输入命令cpconfigs/rockchip_rk3568_defconfigconfigs/rockchip_rk3568_defconfig_bak和cpconfigs/rockchip_rk356x_recovery_defconfigconfigs/rockchip_rk356x_recovery_defconfig_bak进行备份。若需修改busybox配置,如添加depmod,可使用makebusybox-menuconfig进入配置界面,按y勾选并保存退出。
备份并更新原先的busybox.config。执行cpboard/rockchip/common/base/busybox.configboard/rockchip/common/base/busybox.config.bak和cpoutput/build/busybox-1.27.2/.configboard/rockchip/common/base/busybox.config操作。重新编译busybox,命令为makebusybox-rebuild。
内核定时器是内核用来控制在未来某个时间点调度执行某个函数的一种机制,它在kernel/linux/timer.h和kernel/timer.c文件中实现。被调度的函数是异步执行的,类似于一种“软件中断”,在非进程的上下文中运行,因此调度函数必须满足以下规则:没有current指针、不允许访问用户空间、不能执行休眠(或可能引起休眠的函数)和调度,任何被访问的数据结构都应该针对并发访问进行保护以防止竞争条件。在SMP系统中,调度函数总是在注册它的同一CPU上运行,以尽可能获得缓存的局域性。
以下是一个RK3568蜂鸣器定时鸣叫的驱动示例代码,包括了必要的头文件引用和定义,以及具体的代码实现:
c
#includekernel.h>
#includeinit.h>
#includemodule.h>
#includetimer.h>
#includegpio.h>
#includeslab.h>
#includedelay.h>
#defineGPIO_PIN15//替换为你的GPIO引脚
staticstructtimer_listtimer;
intgpio_status=1;
staticvoidtimer_callback(structtimer_list*t){
gpio_set_value(GPIO_PIN,gpio_status);
gpio_status=!gpio_status;
mod_timer(timer,jiffies+msecs_to_jiffies(1000));//1秒后再次触发定时器
}
staticint__initmymodule_init(void){
intret;
ret=gpio_request(GPIO_PIN,"my_gpio");
if(ret){
printk("无法请求GPIO%d",GPIO_PIN);
returnret;
}
gpio_direction_output(GPIO_PIN,0);
timer_setup(timer,timer_callback,0);
mod_timer(timer,jiffies+msecs_to_jiffies(2000));//2秒后触发定时器
return0;
}
staticvoid__exitmymodule_exit(void){
del_timer_sync(timer);
gpio_free(GPIO_PIN);
}
module_init(mymodule_init);
module_exit(mymodule_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zou");
MODULE_DESCRIPTION("SampleGPIOandTimerInterruptKernelModule");
1.问题提出
2.操作步骤
step1C/C++交叉编译环境配置
1)下载交叉编译工具
地址:
https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/
下载后的文件,可以拷贝到虚拟机下你的sdk下(不知道如何从windows拷贝到虚拟机,可以查看,我之前分享的一篇文章:VMware虚拟机竟然会吃掉这么多磁盘空间?-今日头条(toutiao.com)中的第二节《建立Vmware虚拟机与windows文件共享》)
2)解压
tar-xvfgcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar解压结构如下
在该目录的bin下面会看到交叉编译工具
3)用交叉编译工具,编译测试应用程序
编写完应用程序代码,使用如下指令编译:
$aarch64-linux-gnu-gccpwm-testAPP-opwm-test提示需要安装交叉编译工具,按照提示安装
编译后查看文件格式如下
4)通过ADB把编译后的应用程序拷贝到开发板运行(可以参考我的另一篇文章如何使用adb调试工具,与linux设备互传文件-今日头条(toutiao.com)
由于我们的开发板,没有wifi和ethnet,不能通过NFS来传输,只能通过ADB传输,或用U盘拷贝,这个方法太low了。
根据打印信息,调试代码,直到验证正确
分享是一种美德,希希望能帮助到Linux嵌入式开发的朋友们,喜欢的动动你发财的小手,帮忙点赞转发,谢谢~
电话+V:192606-48052
机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。