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

来源:互联网 发布:网页美工实例教程 编辑:程序博客网 时间:2024/05/05 15:21

快乐虾

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       参考资料

vdspuclinux共舞(6):用vdsp开发驱动的设想(2009-11-2)

vdspuclinux共舞(5):加入dwarf调试信息(2009-11-2)

vdspuclinux共舞(4):加载uclinux(2009-11-2)

vdspuclinux共舞(3):boot kernel(2009-10-31)

vdspuclinux共舞(2):vdsp的影响(2009-10-31)

VDSPuclinux共舞(1):开篇(2009-10-30)

关于uClinux-2.6(bf561) for VDSP的移植2008/3/11

 

 

 

 

 

 

 

原创粉丝点击