*: поддержка SD/MMC контроллера
This commit is contained in:
parent
d2f38fbc86
commit
febcb59c13
@ -12,8 +12,8 @@
|
||||
|
||||
## Руководство пользователя и бинарная сборка
|
||||
|
||||
- [Бинарный релиз](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/tag/release-2021)
|
||||
- [Руководство пользователя](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/download/release-2021/UserManual.pdf)
|
||||
- [Бинарный релиз](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/tag/release-2021-v2)
|
||||
- [Руководство пользователя](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/download/release-2021-v2/UserManual.pdf)
|
||||
|
||||
## Поддерживаемые редакции Нейтрино
|
||||
|
||||
@ -94,3 +94,5 @@ echo "tftpboot 0x41000000 $image; go 0x41000000" > $TFTP_SERIAL
|
||||
| UART | + | + | |
|
||||
| USB | + | + | |
|
||||
| NET | + | + | |
|
||||
| SD | + | + | Версия исходного кода драйвера - 57d005663e |
|
||||
| MMC | + | + | Версия исходного кода драйвера - 57d005663e |
|
||||
|
@ -7,7 +7,8 @@
|
||||
@hide @arch{armv7} @endhide
|
||||
|
||||
Поддерживаемые устройства:
|
||||
- Одноплатный компьютер @link{http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC.html}OrangePi-PC@endlink
|
||||
- Одноплатный компьютер @link{http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC.html}OrangePi-PC(v1.3)@endlink
|
||||
- Одноплатный компьютер @link{http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC-Plus.html}OrangePi-PC-Plus(v1.1)@endlink
|
||||
|
||||
Документ включает следующие разделы:
|
||||
@ul
|
||||
|
@ -20,6 +20,7 @@
|
||||
@item UART
|
||||
@item USB (EHCI/OHCI)
|
||||
@item Ethernet
|
||||
@item SD/eMMC
|
||||
@endul
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||2}
|
||||
|
@ -106,6 +106,8 @@ coproc_attach(11): attach fe099c78 (fe09b750)
|
||||
Welcome to KPDA Neutrino on the OrangePi PC Allwinner H3 (ARMv7 Cortex-A7 QuadCore) - Board
|
||||
Starting common servers...
|
||||
Starting UART serial driver...
|
||||
Starting USB host driver...
|
||||
Starting SD/eMMC driver...
|
||||
Starting Network driver...
|
||||
#
|
||||
@endoutput
|
||||
|
@ -22,6 +22,7 @@
|
||||
@tr @center @l{devc-ser8250} @endcenter @| Менеджер последовательных 8250-совместимых каналов связи
|
||||
@tr @center @l{devu-ehci.so} @endcenter @| Драйвер для USB-контроллеров с усовершенствованным интерфейсом хост-контроллера (EHCI)
|
||||
@tr @center @l{devu-ohci.so} @endcenter @| Драйвер для USB-контроллеров с открытым интерфейсом хост-контроллера (Open Host Controller Interface, OHCI)
|
||||
@tr @center @l{devb-sdmmc} @endcenter @| Драйвер для SD/eMMC контроллеров
|
||||
@endtable
|
||||
|
||||
@hint
|
||||
|
@ -16,6 +16,7 @@
|
||||
@@@item Проверка драйвера контроллера UART
|
||||
@@@item Проверка драйвера контроллера Gigabit Ethernet
|
||||
@@@item Проверка драйвера контроллера USB
|
||||
@@@item Проверка драйвера контроллера SD/MMC
|
||||
|
||||
|
||||
|
||||
@ -344,4 +345,55 @@ USB 4 (EHCI) v1.10, v1.01 DDK, v1.01 HCD
|
||||
USB 5 (OHCI) v1.10, v1.01 DDK, v1.01 HCD
|
||||
@endoutput
|
||||
|
||||
|
||||
|
||||
@group bsp_sdmmc
|
||||
|
||||
Для работы с контроллером SD/MMC используется драйвер @l{devb-sdmmc}. В составе загрузочного образа драйвер запускается автоматически. В случае успешного запуска драйвера в директории `/dev/` будет создано устройство `sd0`, соответствующее SD-карте, а также устройства, соответствующие разделам. Для управления устройствами могут быть использованы стандартные утилиты для управления и чтения/записи блочных устройств. Проверка считается выполненной успешно, если при выполнении команды @l{ls|ls /dev/sd0*} отображаются устройства, соответствующие SD-карте и разделам, например:
|
||||
|
||||
@output{shell}
|
||||
# ls /dev/sd0*
|
||||
/dev/sd0 /dev/sd0t131 /dev/sd0t177
|
||||
@endoutput
|
||||
|
||||
В выводе утилиты @l{mount} увидеть точку монтирования одного из разделов SD-карты, например:
|
||||
|
||||
@output{shell}
|
||||
# mount
|
||||
/dev/sd0t177 on /fs/qnx6 type qnx6
|
||||
@endoutput
|
||||
|
||||
Для измерения производительности операции записи и чтения необходимо создать файл и заполнить его случайными значениями с помощью утилиты @l{dd}, при этом измеряя время данной операции через @l{time}:
|
||||
|
||||
@output{shell}
|
||||
# dd if=/dev/urandom of=/dev/shmem/test_file bs=1000 count=256
|
||||
# time dd if=/dev/shmem/test_file of=<точка монтирования>/test_file \
|
||||
bs=1000 count=256
|
||||
@endoutput
|
||||
|
||||
Выводом данной команды будет является время и скорость записи:
|
||||
|
||||
@output{shell}
|
||||
256+0 records in
|
||||
256+0 records out
|
||||
256000 bytes transferred in 0.038 secs (6736842 bytes/sec)
|
||||
0m00.04s real 0m00.00s user 0m00.00s system
|
||||
@endoutput
|
||||
|
||||
Для измерения скорости чтения необходимо скопировать созданный тестовый файл в `/dev/null` с помощью утилиты @l{dd}:
|
||||
|
||||
@output{shell}
|
||||
# time dd if=<точка монтирования>/test_file of=/dev/null bs=1000 count=256
|
||||
@endoutput
|
||||
|
||||
Выводом данной команды будет является время и скорость чтения:
|
||||
|
||||
@output{shell}
|
||||
256+0 records in
|
||||
256+0 records out
|
||||
256000 bytes transferred in 0.010 secs (25600000 bytes/sec)
|
||||
0m00.01s real 0m00.00s user 0m00.00s system
|
||||
@endoutput
|
||||
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||11}
|
||||
|
@ -8,6 +8,8 @@
|
||||
##
|
||||
## UART_SERIAL: devc-ser8250
|
||||
## NETWORK: devnp-sun8i
|
||||
## SD/eMMC: devb-sdmmc
|
||||
## USB: devu-ehci/devu-ohci
|
||||
##
|
||||
###########################################################################
|
||||
##
|
||||
@ -57,6 +59,15 @@
|
||||
waitfor /dev/io-usb/devu-ehci.so 4
|
||||
waitfor /dev/io-usb/devu-ohci.so 4
|
||||
|
||||
#######################################################################
|
||||
## SD/eMMC driver
|
||||
#######################################################################
|
||||
display_msg Starting SD/eMMC driver...
|
||||
devb-sdmmc mem name=/below4G blk memory=/below4G,cache=8m sdio hc=sunxi,addr=0x01C0F000,irq=92 disk name=sd cam pnp,quiet
|
||||
waitfor /dev/sd0
|
||||
devb-sdmmc mem name=/below4G blk memory=/below4G,cache=8m sdio hc=sunxi,addr=0x01C11000,irq=94,emmc disk name=emmc cam pnp,quiet
|
||||
waitfor /dev/emmc0
|
||||
|
||||
#######################################################################
|
||||
## These env variables are inherited by all the programs which follow
|
||||
#######################################################################
|
||||
@ -142,6 +153,12 @@ devc-ser8250
|
||||
/bin/stty=stty
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Драйверы SD/eMMC
|
||||
###########################################################################
|
||||
devb-sdmmc
|
||||
|
||||
|
||||
#######################################################################
|
||||
## Драйверы ввода
|
||||
#######################################################################
|
||||
@ -189,6 +206,7 @@ waitfor
|
||||
sloginfo
|
||||
sleep
|
||||
date
|
||||
df
|
||||
|
||||
|
||||
###########################################################################
|
||||
|
BIN
prebuilt/armle-v7/bin/devb-sdmmc
Executable file
BIN
prebuilt/armle-v7/bin/devb-sdmmc
Executable file
Binary file not shown.
@ -141,6 +141,7 @@ void (*smp_hook_rtn)(void) = hook_dummy;
|
||||
void (*mdriver_check)(void) = hook_dummy;
|
||||
void (*mdriver_hook)(void) = hook_dummy;
|
||||
|
||||
void (*reboot_func)(void) = hook_dummy;
|
||||
|
||||
// Replacement for some C library stuff to minimize startup size
|
||||
int errno;
|
||||
|
@ -29,7 +29,6 @@
|
||||
|
||||
#include "startup.h"
|
||||
|
||||
int in_hvc;
|
||||
static char *debug_opt[2];
|
||||
|
||||
static void
|
||||
@ -107,8 +106,10 @@ handle_common_option(int opt) {
|
||||
case 'v':
|
||||
debug_flag++;
|
||||
break;
|
||||
case 'F':
|
||||
case 'A':
|
||||
// Reboot on startup crash instead of waiting forever
|
||||
misc_flags |= MISC_FLAG_REBOOT_ON_CRASH_REBOOT;
|
||||
case 'F':
|
||||
case 'M':
|
||||
case 'r':
|
||||
case 'j':
|
||||
@ -158,9 +159,6 @@ handle_common_option(int opt) {
|
||||
hwi_add_nanospin(hundred_loop_time, overhead);
|
||||
}
|
||||
break;
|
||||
case 'H':
|
||||
in_hvc = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -32,6 +32,10 @@
|
||||
void
|
||||
crash_done(void)
|
||||
{
|
||||
// Reboot instead of waiting forever
|
||||
if (misc_flags & MISC_FLAG_REBOOT_ON_CRASH_REBOOT)
|
||||
reboot_func();
|
||||
|
||||
/* hang forever */
|
||||
for( ;; ) {}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* (c) 2010-2014, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
* (c) 2010-2023, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -23,17 +23,13 @@
|
||||
* $
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
char *optarg;
|
||||
int optind = 0;
|
||||
|
||||
int getopt (int argc, char **argv, char *opts) {
|
||||
static char *cp;
|
||||
static int last_optind;
|
||||
int opt;
|
||||
static char *cp;
|
||||
static int last_optind;
|
||||
int opt;
|
||||
|
||||
if (optind == 0) {
|
||||
optind = 1;
|
||||
@ -45,6 +41,11 @@ int getopt (int argc, char **argv, char *opts) {
|
||||
if (last_optind != optind) {
|
||||
cp = argv [optind];
|
||||
last_optind = optind;
|
||||
if (*cp != '-' && *cp != 0) {
|
||||
++optind;
|
||||
/* Mark non-optional parameter as undefined optional parameter */
|
||||
return '?';
|
||||
}
|
||||
if (*cp++ != '-' || *cp == 0) {
|
||||
return -1;
|
||||
}
|
||||
@ -82,5 +83,3 @@ int getopt (int argc, char **argv, char *opts) {
|
||||
}
|
||||
return opt;
|
||||
}
|
||||
|
||||
#include <sys/platform.h>
|
||||
|
@ -189,7 +189,7 @@
|
||||
#define AW_H3_SD0_BASE 0x01C0F000
|
||||
#define AW_H3_SD1_BASE 0x01C10000
|
||||
#define AW_H3_SD2_BASE 0x01C11000
|
||||
|
||||
#define AW_H3_SD_SIZE 0x1000
|
||||
#define SD_GCTL 0x00 // Control register
|
||||
#define SD_CKCR 0x04 // Clock Control register
|
||||
#define SD_TMOR 0x08 // Time out register
|
||||
@ -344,6 +344,7 @@
|
||||
* CCU
|
||||
*/
|
||||
#define AW_H3_CCU_BASE 0x01C20000
|
||||
#define AW_H3_CCU_SIZE 0x400
|
||||
|
||||
#define PLL_CPUX_CTRL_REG 0x0000 // PLL_CPUX Control Register
|
||||
#define PLL_AUDIO_CTRL_REG 0x0008 // PLL_AUDIO Control Register
|
||||
@ -1059,4 +1060,4 @@
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
@ -73,6 +73,13 @@ struct callout_rtn {
|
||||
unsigned rtn_size;
|
||||
uint8_t rtn_code[1];
|
||||
};
|
||||
#elif defined(__E2K__)
|
||||
struct callout_rtn {
|
||||
unsigned long *rw_size;
|
||||
void (*patcher)(paddr32_t paddr, uintptr_t vaddr, unsigned rtn_offset, unsigned rw_offset, void *data, const struct callout_rtn *src);
|
||||
unsigned long rtn_size;
|
||||
uint8_t rtn_code[1];
|
||||
};
|
||||
#endif
|
||||
|
||||
struct callout_slot {
|
||||
@ -465,6 +472,7 @@ ptrdiff_t cpu_mdriver_map(void);
|
||||
void *cpu_mdriver_prepare(struct mdriver_entry *md);
|
||||
int mini_data(int state, void *data);
|
||||
|
||||
extern void (*reboot_func)(void);
|
||||
|
||||
//#define SUPPORT_CMP_ZLIB
|
||||
//#define SUPPORT_CMP_LZO
|
||||
@ -516,7 +524,8 @@ void *callout_memory_map64(unsigned size, paddr64_t phys, unsigned prot_flags);
|
||||
uintptr_t callout_io_map_indirect(unsigned size, paddr_t *phys);
|
||||
void *callout_memory_map_indirect(unsigned size, paddr_t *phys, unsigned prot_flags);
|
||||
|
||||
#define MISC_FLAG_SUPPRESS_BOOTTIME 0x0001
|
||||
#define MISC_FLAG_SUPPRESS_BOOTTIME (1<<0)
|
||||
#define MISC_FLAG_REBOOT_ON_CRASH_REBOOT (1<<1)
|
||||
|
||||
void fdt_init(paddr_t);
|
||||
void fdt_update(void);
|
||||
@ -524,14 +533,6 @@ void fdt_raminfo(void);
|
||||
int fdt_qtime(struct qtime_entry *);
|
||||
|
||||
|
||||
/*
|
||||
* ------------------------------------------------------------------
|
||||
* QVM Hypervisor Support
|
||||
* ------------------------------------------------------------------
|
||||
*/
|
||||
extern int in_hvc;
|
||||
void qvm_init(void);
|
||||
void qvm_update(void);
|
||||
//
|
||||
// Variable prototypes
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user