您的位置:首页 > 运维架构 > Linux

让vdsp与uclinux共舞(7):在内核为驱动预留空间

2009-11-02 22:33 465 查看
快乐虾 http://blog.csdn.net/lights_joy/ lights@hb165.com


本文适用于
ADSP-BF561
Visual DSP++ 5.0(update 6)
Bfin-uclinux-2009r1.6


欢迎转载,但请保留作者信息


我们在内核的bss段预留一段1M的空间,同时规定此空间的前面64个字节用于内核与驱动通信之用。之所以选用bss段是因为我们希望在内核初始化时将之清0。
为了预留空间,我们修改vmlinux.lds.s:
.bss :
{
. = ALIGN(4);
___bss_start = .;

__vdsp_driver_start = .;
. += 1024 * 1024;
__vdsp_driver_end = .;
………
}
然后定义一个结构体:
typedef struct _vdsp_comm
{
int driver_loaded;
void (*driver_load)();
int driver_exited;
void (*driver_exit)();
}vdsp_comm;
extern char _vdsp_driver_start[];
当内核线程检测到driver_loaded时它将调用driver_load进行初始化,当检测到dirver_exited时它将调用driver_exit。
咱直接使用idle线程来检测,在(arch/blackfin/kernel/process.c中):
void cpu_idle(void)
{
/* endless idle loop with no priority at all */
while (1) {
void (*idle)(void) = pm_idle;
vdsp_comm* pcomm = (vdsp_comm*)_vdsp_driver_start;
if(pcomm->driver_loaded)
{
printk("driver loaded detect!");
if(pcomm->driver_load)
{
printk("prepare to init driver");
pcomm->driver_load();
}
else
printk("no init function setup");
pcomm->driver_loaded = 0;
}
if(pcomm->driver_exited)
{
printk("driver exited detect!");
if(pcomm->driver_exit)
{
printk("prepare to exit driver");
pcomm->driver_exit();
}
else
printk("no exit function setup");
pcomm->driver_exited = 0;
}
…………….
}
现在我们需要记下几个地址给vdsp使用,这些地址来自于System.map.initramfs:
00139000 B __vdsp_driver_start
00239000 B __vdsp_driver_end
00129190 R ___start___ksymtab
在VDSP下加载内核,此时a核上运行的是uclinux内核,b核跑的是一段空闲代码,我们保持a核运行,让b核中断,打开b核的Memory窗口,找到__vdsp_driver_start的位置,即0x00139000,将第一个字节改为1,此时内核的idle线程将检测到数据变化,但因为没有配置回调函数,因此我们将在命令行看到其输出:
driver loaded detect!和no init function setup。
刷新一下b核的Memory窗口,可以看到刚刚修改的值又改回了0。
这说明我们对内核的修改已经起作用了!


1 参考资料

让vdsp与uclinux共舞(6):用vdsp开发驱动的设想(2009-11-2)
让vdsp与uclinux共舞(5):加入dwarf调试信息(2009-11-2)
让vdsp与uclinux共舞(4):加载uclinux(2009-11-2)
让vdsp与uclinux共舞(3):boot kernel(2009-10-31)
让vdsp与uclinux共舞(2):vdsp的影响(2009-10-31)
让VDSP与uclinux共舞(1):开篇(2009-10-30)
关于uClinux-2.6(bf561) for VDSP的移植(2008/3/11)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: