您好Gary,
谢谢您的回复,我基本理解,但是我还有几个问题,想知道答案。
1. DTS里,怎么设,可以让GPMC的owner 让给DSP?我目前就是ARM可以读写GPMC,但是DSP不行。
我只看到omap-gpmc.c里有如下代码,
static int gpmc_gpio_init(struct gpmc_device *gpmc)
{
int ret;
gpmc->gpio_chip.parent = gpmc->dev;
gpmc->gpio_chip.owner = THIS_MODULE;
gpmc->gpio_chip.label = DEVICE_NAME;
gpmc->gpio_chip.ngpio = gpmc_nr_waitpins;
gpmc->gpio_chip.get_direction = gpmc_gpio_get_direction;
gpmc->gpio_chip.direction_input = gpmc_gpio_direction_input;
gpmc->gpio_chip.direction_output = gpmc_gpio_direction_output;
gpmc->gpio_chip.set = gpmc_gpio_set;
gpmc->gpio_chip.get = gpmc_gpio_get;
gpmc->gpio_chip.base = -1;
DTS:黑体是我增加的。另外,GPMC的config那七个寄存器的,我没有变化,映射到0x01000000空间。
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
cmem_block_mem_0: cmem_block_mem@a0000000 {
reg = <0x0 0xa0000000 0x0 0x0c000000>;
no-map;
status = "okay";
};
cmem_block_mem_1_ocmc3: cmem_block_mem@40500000 {
reg = <0x0 0x40500000 0x0 0x100000>;
no-map;
status = "okay";
};
cmem_block_mem_2_gpmc: cmem_block_mem@01000000 {
reg = <0x0 0x01000000 0x0 0x100000>;
no-map;
status = "okay";
};
};
2. CMEM分配时,好像不是每次都成功的,即便我每次都是重新上电。如下只显示Pool 0,没有Pool1,此时Pool1 能不能work?
root@xivi:/lib/firmware# modprobe cmemk phys_start=0xa0000000 phys_end=0xac000000 pools=24x8388608 phys_start_1=0x01000000 phys_end_1=0x01000500 pools_1=1x1024,1x256
root@xivi:/lib/firmware# cat /proc/cmem
Block 0: Pool 0: 1 bufs size 0xc000000 (0xc000000 requested)
Pool 0 busy bufs:
id 0: phys addr 0xa0000000 (cached)
Pool 0 free bufs:
root@xivi:/lib/firmware#
3. 你说的共享内存,区别于CMEM,是指的ARM上,Linux里的如下API吗?那DSP等其他的处理器,是直接访问物理地址,还是有对应的虚拟地址, 怎么映射虚拟地址?有没有相关的例程可以参考?
int shmid = shmget((key_t)1234, sizeof(struct stuShareMemory), 0666|IPC_CREAT);
shm = shmat(shmid, (void*)0, 0);
4. 在ARM与DSP之间,共享CMEM内存,或者使用shmem,DSP写入数据后,ARM这端可以直接读吗?还是需要Cache_Invalidate之类的,我不是很清楚,最好有相关操作例程,帮助理解一下,谢谢!