让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。
这说明我们对内核的修改已经起作用了!
让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)
本文适用于
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)
相关文章推荐
- 让vdsp与uclinux共舞(8):vdsp驱动框架
- 让vdsp与uclinux共舞(10):加载SMP内核
- 让vdsp与uclinux共舞(6):用vdsp开发驱动的设想
- 让vdsp与uclinux共舞(14):驱动发布
- uclinux内核中的I2C驱动学习
- 让vdsp与uclinux共舞(2):vdsp的影响
- uclinux内核驱动的初始化顺序
- linux驱动之内核空间几种长延时的实现策略的优劣评估
- 让VDSP与uclinux共舞(1):开篇
- 让vdsp与uclinux共舞(12):应用程序开发
- 用户空间与内核驱动的交互过程 — ioctl
- uclinux内核中的I2C驱动
- 用户空间的设备与内核空间的设备、驱动关系
- uclinux内核中的I2C驱动学习
- uclinux内核的console(3):console驱动初始化
- 让vdsp与uclinux共舞(3):boot kernel
- 让vdsp与uclinux共舞(4):加载uclinux
- 对于内核输入系统驱动(例如keypad, sensor, touch panel),内核如何发送事件给用户空间
- 【从零开始,从内核驱动驱动到用户空间调用】编写第一个linux驱动,通过端口访问I/O寄存器。
- 【从零开始,从内核驱动驱动到用户空间调用】编写第一个linux驱动,通过端口访问I/O寄存器。