原创 【博客大赛】为AM335x+Linux移植SGX+OpenGL+Qt5之完全开发笔记(4.1)

2016-6-1 17:15 1145 12 12 分类: MCU/ 嵌入式 文集: Qt和Cpp

Step 4: Make the Kernel

 
内核需要修改,是因为Graphics SDK会调用内核的公共函数地址入口,有一些函数是TI提供的内核里面存在,而mainline的内核里面没有的。看起来貌似要修改的地方很多,其实关键只有两个内容:reset_controllerregister_vsync_cb
 
A. 修改memuconfig中有关reset的内容:
使用make menuconfig命令,使能RESET_CONTROLLER
CONFIG_RESET_CONTROLLER=y
这一步是必须的,因为PVR服务的pvrsrvkm模块用到了很多reset_control_*函数。
 
B. drivers/reset/core.c文件添加如下内容:
int reset_control_is_reset(struct reset_control *rstc)
{
if (rstc->rcdev->ops->is_reset)
return rstc->rcdev->ops->is_reset(rstc->rcdev, rstc->id);
return -ENOSYS;
}
EXPORT_SYMBOL_GPL(reset_control_is_reset);
 
int reset_control_clear_reset(struct reset_control *rstc)
{
if (rstc->rcdev->ops->clear_reset)
return rstc->rcdev->ops->clear_reset(rstc->rcdev, rstc->id);
return -ENOSYS;
}
EXPORT_SYMBOL_GPL(reset_control_clear_reset);
这两个函数会给Graphics SDK调用,因此需要定义它们。重新编译之后,函数名会内核源代码根目录下的System.map文件中出现。
 
C. include/linux/reset-controller.h文件添加如下内容:
struct reset_control_ops {
int (*reset)(struct reset_controller_dev *rcdev, unsigned long id);
int (*assert)(struct reset_controller_dev *rcdev, unsigned long id);
int (*deassert)(struct reset_controller_dev *rcdev, unsigned long id);
int (*is_reset)(struct reset_controller_dev *rcdev, unsigned long id);
int (*clear_reset)(struct reset_controller_dev *rcdev, unsigned long id);
};
相应的为 reset_control_ops结构体增加成员变量。
 
D. include/linux/reset.h文件添加如下内容:
int reset_control_reset(struct reset_control *rstc);
int reset_control_assert(struct reset_control *rstc);
int reset_control_deassert(struct reset_control *rstc);
int reset_control_is_reset(struct reset_control *rstc);
int reset_control_clear_reset(struct reset_control *rstc);
相应的为头文件做声明。
 
E. arch/arm/boot/dts/am33xx.dtsi文件添加如下内容:
prcm: prcm@44e00000 {
compatible = "ti,am3-prcm";
reg = <0x44e00000 0x4000>;
#reset-cells = <1>;
prcm_clocks: clocks {
#address-cells = <1>;
#size-cells = <0>;
};
prcm_clockdomains: clockdomains {
};
};
sgx@0x56000000 {
compatible = "ti,sgx";
ti,hwmods = "gfx";
reg = <0x56000000 0x1000000>;
interrupts = <37>;
resets = <&prcm 0>;
};
这是devicetree的内容。
如果看不懂dts文件的格式,可以阅读内核文档Documentation/devicetree/booting-without-of.txt
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
12
关闭 站长推荐上一条 /3 下一条