привет всем

решил попробовать с поработать с DMA использую самописанные утилитки для записи по адресу: write.sh <адрес> <значение> и чтения по адресу read.sh <адрес> возвращает значение. Делал по мануалу пункт 17.8.1.3. По сути из памяти перегоняю в PIOB.

#=======Configure PIO
#PER
./write.sh 0xffe02c00 0x7fffffff
#OER
./write.sh 0xffe02c10 0x7fffffff

#Set register(SODR)
./write.sh 0xffe02c30 0x7fffffff

#clear register (CODR)

./write.sh 0xffe02c34 0x7fffffff
./write.sh 0xffe02c30 0x7fffffff

#=======cONFIGURE DMA for channel 0

#---1 Read DMA channel
#Read DMA channel
./read.sh 0xff2003a0 ; результат 0


#---2 Interrupt Clear Registers

#Clear ClearTfr
./write.sh 0xff200338 0

#Clear ClearBlock
./write.sh 0xff200340 0

#Clear ClearSrcTran
./write.sh 0xff200348 0

#Clear ClearDstTran
./write.sh 0xff200350 0

#Clear ClearErr
./write.sh 0xff200358 0

#Read Interrupt Raw Status
#RawTfr
./read.sh 0xff2002c0
# результат 0

#RawBlock
./read.sh 0xff2002c8
# результат 1

#RawSrcTran
./read.sh 0xff2002d0
# результат 1

#RawDstTran
./read.sh 0xff2002d8
# результат 1

#RawErr
./read.sh 0xff2002e0
# результат 0

#Read Interrupt Status

#StatusTfr
./read.sh 0xff2002e8
# результат 0

#StatusBlock
./read.sh 0xff2002f0
# результат 0

#StatusSrcTran
./read.sh 0xff2002f8
# результат 0

#StatusDstTran
./read.sh 0xff200300
# результат 0

#StatusErr
./read.sh 0xff200308
# результат 0


#---3 Program Channel registers

#a
#SAR0 (Channel 0 Source Address Register)
./write.sh 0xff200000 0xffe02c38

#b
#DAR0 to PIOB (Channel 0 Destination Address Register)
./write.sh 0xff200008 0xffe02c30

#c
#Configure CTL0, CFG0 from Row 4,LLP0=0

#CTL0L LLP_S_EN=0, LLPD_EN=0
./write.sh 0xff200018 0x00000000

#CFG0 RELOAD_SR=1, RELOAD_DS=1
./write.sh 0xff200040 0xC0000000

#LLP0=0
./write.sh 0xff200010 0x00000000

#d
#Control information for DMA transfer in CTL0

#i transfer type
#CTL0L
./write.sh 0xff200018 0x00004924

#CTL0H
./write.sh 0xff20001c 0x00000008

#ii transfer characteristics

#CFG0L
./write.sh 0xff200040 0xc000a200

#CFG0H
./write.sh 0xff200044 0x0

#4
./write.sh 0xff2003a0 0x101
./read.sh 0xff2003a0
#результат 0

# DMA Configuration Register
./write.sh 0xff200398 0x1

./read.sh 0xff200398
#результат 1

не пойму где я на грабли наступаю, результат хочу увидеть на осцилографе, хотя бы вроде какого нибудь всплеска, а результат нулевой.


на всякий случай

write.sh:

#!/bin/sh
insmod /home/mods/wraddr.ko addr=$1 val=$2
rmmod wraddr

read.sh
#!/bin/sh
insmod /home/mods/readaddr.ko addr=$1
rmmod readaddr

Readaddr.c:

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/config.h>
#include <linux/init.h>

static ulong addr = 0;
module_param(addr, ulong, S_IRUGO);

static int __init mymodule_init(void)
{
printk (KERN_ALERT "[%#x] = %#x\n", addr, *((ulong*)addr));
return 0;
}


static void __exit mymodule_exit(void)
{
return;
}


module_init(mymodule_init);
module_exit(mymodule_exit);

MODULE_LICENSE("GPL");

wraddr.c

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/config.h>
#include <linux/init.h>

static uint addr = 0;
static uint val = 0;
static uint showbef = 0;
static uint showaft = 0;

module_param(addr, uint, S_IRUGO);
module_param(val, uint, S_IRUGO);
module_param(showbef, uint, S_IRUGO);
module_param(showaft, uint, S_IRUGO);

static int __init mymodule_init(void)
{
if (showbef) printk (KERN_ALERT "Before writing [%#x] = %#x\n", addr, *((uint*)addr));

*((uint*)addr) = val;

if (showaft) printk (KERN_ALERT "After writing [%#x] = %#x\n", addr, *((uint*)addr));

return 0;
}


static void __exit mymodule_exit(void)
{
return;
}


module_init(mymodule_init);
module_exit(mymodule_exit);

MODULE_LICENSE("GPL");