привет всем
решил попробовать с поработать с 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");
|