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