[components][drivers]legacy fdt (#9062)

* legacy fdt

* update fdt
This commit is contained in:
zms123456 2024-06-19 19:48:35 +08:00 committed by GitHub
parent 7250301d3e
commit 3b1ce1e4b6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 379 additions and 217 deletions

View File

@ -30,6 +30,5 @@ rsource "ktime/Kconfig"
rsource "clk/Kconfig" rsource "clk/Kconfig"
rsource "hwtimer/Kconfig" rsource "hwtimer/Kconfig"
rsource "usb/Kconfig" rsource "usb/Kconfig"
rsource "fdt/Kconfig"
endmenu endmenu

View File

@ -1,200 +1,2 @@
menu "Using USB legacy version" rsource "usb/Kconfig"
config RT_USING_USB rsource "fdt/Kconfig"
bool
default n
config RT_USING_USB_HOST
bool "Using USB host"
default n
select RT_USING_USB
if RT_USING_USB_HOST
config RT_USBH_MSTORAGE
bool "Enable Udisk Drivers"
default n
if RT_USBH_MSTORAGE
config UDISK_MOUNTPOINT
string "Udisk mount dir"
default "/"
endif
config RT_USBH_HID
bool "Enable HID Drivers"
default n
if RT_USBH_HID
config RT_USBH_HID_MOUSE
bool "Enable HID mouse protocol"
default n
config RT_USBH_HID_KEYBOARD
bool "Enable HID keyboard protocol"
default n
endif
endif
config RT_USING_USB_DEVICE
bool "Using USB device"
default n
select RT_USING_USB
if RT_USING_USB_DEVICE || RT_USING_USB_HOST
config RT_USBD_THREAD_STACK_SZ
int "usb thread stack size"
default 4096
endif
if RT_USING_USB_DEVICE
config USB_VENDOR_ID
hex "USB Vendor ID"
default 0x0FFE
config USB_PRODUCT_ID
hex "USB Product ID"
default 0x0001
config RT_USB_DEVICE_COMPOSITE
bool "Enable composite device"
default n
choice
prompt "Device type"
default _RT_USB_DEVICE_NONE
depends on !RT_USB_DEVICE_COMPOSITE
config _RT_USB_DEVICE_NONE
bool "Using custom class by register interface"
select RT_USB_DEVICE_NONE
config _RT_USB_DEVICE_CDC
bool "Enable to use device as CDC device"
select RT_USB_DEVICE_CDC
config _RT_USB_DEVICE_MSTORAGE
bool "Enable to use device as Mass Storage device"
select RT_USB_DEVICE_MSTORAGE
config _RT_USB_DEVICE_HID
bool "Enable to use device as HID device"
select RT_USB_DEVICE_HID
config _RT_USB_DEVICE_RNDIS
bool "Enable to use device as rndis device"
select RT_USB_DEVICE_RNDIS
depends on RT_USING_LWIP
config _RT_USB_DEVICE_ECM
bool "Enable to use device as ecm device"
select RT_USB_DEVICE_ECM
depends on RT_USING_LWIP
config _RT_USB_DEVICE_WINUSB
bool "Enable to use device as winusb device"
select RT_USB_DEVICE_WINUSB
config _RT_USB_DEVICE_AUDIO
bool "Enable to use device as audio device"
select RT_USB_DEVICE_AUDIO
endchoice
if RT_USB_DEVICE_COMPOSITE
config RT_USB_DEVICE_CDC
bool "Enable to use device as CDC device"
default n
config RT_USB_DEVICE_NONE
bool
default y
config RT_USB_DEVICE_MSTORAGE
bool "Enable to use device as Mass Storage device"
default n
config RT_USB_DEVICE_HID
bool "Enable to use device as HID device"
default n
config RT_USB_DEVICE_RNDIS
bool "Enable to use device as rndis device"
default n
depends on RT_USING_LWIP
config RT_USB_DEVICE_ECM
bool "Enable to use device as ecm device"
default n
depends on RT_USING_LWIP
config RT_USB_DEVICE_WINUSB
bool "Enable to use device as winusb device"
default n
config RT_USB_DEVICE_AUDIO
bool "Enable to use device as audio device"
default n
endif
if RT_USB_DEVICE_CDC
config RT_VCOM_TASK_STK_SIZE
int "virtual com thread stack size"
default 512
config RT_CDC_RX_BUFSIZE
int "virtual com rx buffer size"
default 128
config RT_VCOM_TX_USE_DMA
bool "Enable to use dma for vcom tx"
default n
config RT_VCOM_SERNO
string "serial number of virtual com"
default "32021919830108"
config RT_VCOM_SER_LEN
int "serial number length of virtual com"
default 14
config RT_VCOM_TX_TIMEOUT
int "tx timeout(ticks) of virtual com"
default 1000
endif
if RT_USB_DEVICE_WINUSB
config RT_WINUSB_GUID
string "Guid for winusb"
default "{6860DC3C-C05F-4807-8807-1CA861CC1D66}"
endif
if RT_USB_DEVICE_MSTORAGE
config RT_USB_MSTORAGE_DISK_NAME
string "msc class disk name"
default "flash0"
endif
if RT_USB_DEVICE_RNDIS
config RNDIS_DELAY_LINK_UP
bool "Delay linkup media connection"
select RT_USING_TIMER_SOFT
default n
endif
if RT_USB_DEVICE_HID
config RT_USB_DEVICE_HID_KEYBOARD
bool "Use to HID device as Keyboard"
default n
if RT_USB_DEVICE_HID_KEYBOARD
config RT_USB_DEVICE_HID_KEYBOARD_NUMBER
int "Number of Keyboard(max 3)"
default 1
range 1 3
endif
config RT_USB_DEVICE_HID_MOUSE
bool "Use to HID device as Mouse"
default n
config RT_USB_DEVICE_HID_GENERAL
bool "Use to HID device as General HID device"
default y
if RT_USB_DEVICE_HID_GENERAL
config RT_USB_DEVICE_HID_GENERAL_OUT_REPORT_LENGTH
int "General HID device out report length"
default 63
range 0 63
config RT_USB_DEVICE_HID_GENERAL_IN_REPORT_LENGTH
int "General HID device in report length"
default 63
range 0 63
endif
config RT_USB_DEVICE_HID_MEDIA
bool "Use to HID device as media keyboard"
default y
endif
if RT_USB_DEVICE_AUDIO
config RT_USB_DEVICE_AUDIO_MIC
bool "Use usb mic device as audio device"
default n
if RT_USB_DEVICE_AUDIO_MIC
config RT_USBD_MIC_DEVICE_NAME
string "audio mic device name"
default "mic0"
endif
config RT_USB_DEVICE_AUDIO_SPEAKER
bool "Use usb speaker device as audio device"
default n
if RT_USB_DEVICE_AUDIO_SPEAKER
config RT_USBD_SPEAKER_DEVICE_NAME
string "audio speaker device name"
default "sound0"
endif
endif
endif
endmenu

View File

@ -0,0 +1,15 @@
config RT_USING_FDT
bool "Using fdt legacy version"
default n
if RT_USING_FDT
config RT_USING_FDTLIB
bool "Using fdt lib for device drivers"
default y
config RT_USING_FDT_FWNODE
bool "Using fdt fwnode for device drivers"
default n
config FDT_USING_DEBUG
bool "Using fdt debug function "
default n
endif

View File

@ -0,0 +1,125 @@
#ifndef __DTB_FWNODE_H__
#define __DTB_FWNODE_H__
#include "libfdt_env.h"
#include <rtthread.h>
#include <stdint.h>
#include <stdbool.h>
struct fwnode_operations;
struct rt_device;
#define FWNODE_FLAG_LINKS_ADDED 0x01
#define FWNODE_FLAG_NOT_DEVICE 0x02
#define FWNODE_FLAG_INITIALIZED 0x04
#define NR_FWNODE_REFERENCE_ARGS 8
struct fwnode_handle
{
struct fwnode_handle *secondary;
const struct fwnode_operations *ops;
struct rt_device *dev;
struct rt_list_node suppliers;
struct rt_list_node consumers;
uint8_t flags;
};
struct fwnode_link
{
struct fwnode_handle *supplier;
struct rt_list_node s_hook;
struct fwnode_handle *consumer;
struct rt_list_node c_hook;
};
struct fwnode_endpoint
{
unsigned int port;
unsigned int id;
const struct fwnode_handle *local_fwnode;
};
struct fwnode_reference_args
{
struct fwnode_handle *fwnode;
unsigned int nargs;
uint64_t args[NR_FWNODE_REFERENCE_ARGS];
};
struct fwnode_operations
{
struct fwnode_handle *(*get)(struct fwnode_handle *fwnode);
void (*put)(struct fwnode_handle *fwnode);
bool (*device_is_available)(const struct fwnode_handle *fwnode);
const void *(*device_get_match_data)(const struct fwnode_handle *fwnode,
const struct rt_device *dev);
bool (*property_present)(const struct fwnode_handle *fwnode,
const char *propname);
int (*property_read_int_array)(const struct fwnode_handle *fwnode,
const char *propname,
unsigned int elem_size, void *val,
size_t nval);
int (*property_read_string_array)(const struct fwnode_handle *fwnode_handle,
const char *propname, const char **val,
size_t nval);
const char *(*get_name)(const struct fwnode_handle *fwnode);
const char *(*get_name_prefix)(const struct fwnode_handle *fwnode);
struct fwnode_handle *(*get_parent)(const struct fwnode_handle *fwnode);
struct fwnode_handle *(*get_next_child_node)(const struct fwnode_handle *fwnode,
struct fwnode_handle *child);
struct fwnode_handle *(*get_named_child_node)(const struct fwnode_handle *fwnode,
const char *name);
int (*get_reference_args)(const struct fwnode_handle *fwnode,
const char *prop, const char *nargs_prop,
unsigned int nargs, unsigned int index,
struct fwnode_reference_args *args);
struct fwnode_handle *(*graph_get_next_endpoint)(const struct fwnode_handle *fwnode,
struct fwnode_handle *prev);
struct fwnode_handle *(*graph_get_remote_endpoint)(const struct fwnode_handle *fwnode);
struct fwnode_handle *(*graph_get_port_parent)(struct fwnode_handle *fwnode);
int (*graph_parse_endpoint)(const struct fwnode_handle *fwnode,
struct fwnode_endpoint *endpoint);
int (*add_links)(struct fwnode_handle *fwnode);
};
#define fwnode_has_op(fwnode, op) \
((fwnode) && (fwnode)->ops && (fwnode)->ops->op)
#define fwnode_call_int_op(fwnode, op, ...) \
(fwnode ? (fwnode_has_op(fwnode, op) ? (fwnode)->ops->op(fwnode, ##__VA_ARGS__) : -ENXIO) : -EINVAL)
#define fwnode_call_bool_op(fwnode, op, ...) \
(fwnode_has_op(fwnode, op) ? (fwnode)->ops->op(fwnode, ##__VA_ARGS__) : false)
#define fwnode_call_ptr_op(fwnode, op, ...) \
(fwnode_has_op(fwnode, op) ? (fwnode)->ops->op(fwnode, ##__VA_ARGS__) : NULL)
#define fwnode_call_void_op(fwnode, op, ...) \
do \
{ \
if (fwnode_has_op(fwnode, op)) \
(fwnode)->ops->op(fwnode, ##__VA_ARGS__); \
} while (false)
#define get_dev_from_fwnode(fwnode) ((fwnode)->dev)
static inline void fwnode_init(struct fwnode_handle *fwnode,
const struct fwnode_operations *ops)
{
fwnode->ops = ops;
rt_list_init(&fwnode->consumers);
rt_list_init(&fwnode->suppliers);
}
static inline void fwnode_dev_initialized(struct fwnode_handle *fwnode,
bool initialized)
{
if (!fwnode)
return;
if (initialized)
fwnode->flags |= FWNODE_FLAG_INITIALIZED;
else
fwnode->flags &= ~FWNODE_FLAG_INITIALIZED;
}
#endif //__DTB_FWNODE_H__

View File

@ -10,6 +10,10 @@
#include <rtthread.h> #include <rtthread.h>
#include <stdint.h> #include <stdint.h>
#ifdef RT_USING_FDT_FWNODE
#include "dtb_fwnode.h"
#endif
//#define RT_DTB_DEBUG //#define RT_DTB_DEBUG
#ifdef RT_DTB_DEBUG #ifdef RT_DTB_DEBUG
#define debug(fmt, args...) rt_kprintf(fmt, ##args) #define debug(fmt, args...) rt_kprintf(fmt, ##args)
@ -17,9 +21,9 @@
#define debug(fmt, args...) #define debug(fmt, args...)
#endif #endif
#define ERR_PTR(err) ((void *)((long)(err))) #define DTB_ERR_PTR(err) ((void *)((long)(err)))
#define PTR_ERR(ptr) ((long)(ptr)) #define DTB_PTR_ERR(ptr) ((long)(ptr))
#define IS_ERR(ptr) ((unsigned long)(ptr) > (unsigned long)(-1000)) #define DTB_IS_ERR(ptr) ((unsigned long)(ptr) > (unsigned long)(-1000))
#define DEV_ROOT_NODE_ADDR_CELLS_DEFAULT 2 #define DEV_ROOT_NODE_ADDR_CELLS_DEFAULT 2
#define DEV_ROOT_NODE_SIZE_CELLS_DEFAULT 1 #define DEV_ROOT_NODE_SIZE_CELLS_DEFAULT 1
@ -71,7 +75,10 @@ struct dtb_node
const char *path; const char *path;
phandle handle; phandle handle;
int level; int level;
#ifdef RT_USING_FDT_FWNODE
struct fwnode_handle fwnode;
unsigned long _flags;
#endif
struct dtb_property *properties; struct dtb_property *properties;
struct dtb_node *parent; struct dtb_node *parent;
struct dtb_node *child; struct dtb_node *child;
@ -382,4 +389,12 @@ int dtb_node_irq_count(struct dtb_node *dev);
dtb_node_valid(node); \ dtb_node_valid(node); \
node = dtb_node_next_subnode(node)) node = dtb_node_next_subnode(node))
#ifdef RT_USING_FDT_FWNODE
extern const struct fwnode_operations of_fwnode_ops;
static inline void dtb_fwnode_init(struct dtb_node *node)
{
fwnode_init(&node->fwnode, &of_fwnode_ops);
}
#endif
#endif /* RT_FDT_H__ */ #endif /* RT_FDT_H__ */

View File

@ -28,11 +28,11 @@ static void *dtb_node_find_property_value_of_size(const struct dtb_node *dn,
struct dtb_property *prop = dtb_node_get_dtb_node_property(dn, propname, NULL); struct dtb_property *prop = dtb_node_get_dtb_node_property(dn, propname, NULL);
if (!prop) if (!prop)
return ERR_PTR(-EINVAL); return DTB_ERR_PTR(-EINVAL);
if (!prop->value) if (!prop->value)
return ERR_PTR(-ENODATA); return DTB_ERR_PTR(-ENODATA);
if (len > prop->size) if (len > prop->size)
return ERR_PTR(-EOVERFLOW); return DTB_ERR_PTR(-EOVERFLOW);
return prop->value; return prop->value;
} }
@ -44,10 +44,10 @@ int dtb_node_read_u32(const struct dtb_node *dn, const char *propname, uint32_t
if (!dn) if (!dn)
return -EINVAL; return -EINVAL;
val = dtb_node_find_property_value_of_size(dn, propname, sizeof(*outp)); val = dtb_node_find_property_value_of_size(dn, propname, sizeof(*outp));
if (IS_ERR(val)) if (DTB_IS_ERR(val))
{ {
debug("(not found)\n"); debug("(not found)\n");
return PTR_ERR(val); return DTB_PTR_ERR(val);
} }
*outp = fdt32_to_cpu(*val); *outp = fdt32_to_cpu(*val);
@ -72,8 +72,8 @@ int dtb_node_read_u32_array(const struct dtb_node *dn, const char *propname,
val = dtb_node_find_property_value_of_size(dn, propname, val = dtb_node_find_property_value_of_size(dn, propname,
sz * sizeof(*out_values)); sz * sizeof(*out_values));
if (IS_ERR(val)) if (DTB_IS_ERR(val))
return PTR_ERR(val); return DTB_PTR_ERR(val);
debug("size %zd, val:%d\n", sz, *val); debug("size %zd, val:%d\n", sz, *val);
while (sz--) while (sz--)
@ -110,10 +110,10 @@ int dtb_node_read_u32_index(const struct dtb_node *dn, const char *propname,
val = dtb_node_find_property_value_of_size(dn, propname, val = dtb_node_find_property_value_of_size(dn, propname,
sizeof(*outp) * (index + 1)); sizeof(*outp) * (index + 1));
if (IS_ERR(val)) if (DTB_IS_ERR(val))
{ {
debug("(not found)\n"); debug("(not found)\n");
return PTR_ERR(val); return DTB_PTR_ERR(val);
} }
*outp = fdt32_to_cpu(val[index]); *outp = fdt32_to_cpu(val[index]);
@ -130,10 +130,10 @@ int dtb_node_read_u64(const struct dtb_node *dn, const char *propname, uint64_t
if (!dn) if (!dn)
return -EINVAL; return -EINVAL;
val = dtb_node_find_property_value_of_size(dn, propname, sizeof(*outp)); val = dtb_node_find_property_value_of_size(dn, propname, sizeof(*outp));
if (IS_ERR(val)) if (DTB_IS_ERR(val))
{ {
debug("(not found)\n"); debug("(not found)\n");
return PTR_ERR(val); return DTB_PTR_ERR(val);
} }
*outp = fdt64_to_cpu(*val); *outp = fdt64_to_cpu(*val);

View File

@ -69,6 +69,10 @@ static int _dtb_node_get_dtb_nodes_list(struct dtb_node *dtb_node_head, struct d
int pathname_sz; int pathname_sz;
int node_name_sz; int node_name_sz;
#ifdef RT_USING_FDT_FWNODE
dtb_fwnode_init(dtb_node_head);
#endif
/* caller alrealy checked current_fdt */ /* caller alrealy checked current_fdt */
if ((root_off = fdt_path_offset(current_fdt, pathname)) >= 0) if ((root_off = fdt_path_offset(current_fdt, pathname)) >= 0)
{ {
@ -113,7 +117,9 @@ static int _dtb_node_get_dtb_nodes_list(struct dtb_node *dtb_node_head, struct d
{ {
return FDT_RET_NO_MEMORY; return FDT_RET_NO_MEMORY;
} }
#ifdef RT_USING_FDT_FWNODE
dtb_fwnode_init(dtb_node);
#endif
fdt_exec_status = _dtb_node_get_dtb_properties_list(dtb_node->properties, node_off); fdt_exec_status = _dtb_node_get_dtb_properties_list(dtb_node->properties, node_off);
if (fdt_exec_status == FDT_RET_GET_EMPTY) if (fdt_exec_status == FDT_RET_GET_EMPTY)
{ {

View File

@ -0,0 +1,200 @@
menu "Using USB legacy version"
config RT_USING_USB
bool
default n
config RT_USING_USB_HOST
bool "Using USB host"
default n
select RT_USING_USB
if RT_USING_USB_HOST
config RT_USBH_MSTORAGE
bool "Enable Udisk Drivers"
default n
if RT_USBH_MSTORAGE
config UDISK_MOUNTPOINT
string "Udisk mount dir"
default "/"
endif
config RT_USBH_HID
bool "Enable HID Drivers"
default n
if RT_USBH_HID
config RT_USBH_HID_MOUSE
bool "Enable HID mouse protocol"
default n
config RT_USBH_HID_KEYBOARD
bool "Enable HID keyboard protocol"
default n
endif
endif
config RT_USING_USB_DEVICE
bool "Using USB device"
default n
select RT_USING_USB
if RT_USING_USB_DEVICE || RT_USING_USB_HOST
config RT_USBD_THREAD_STACK_SZ
int "usb thread stack size"
default 4096
endif
if RT_USING_USB_DEVICE
config USB_VENDOR_ID
hex "USB Vendor ID"
default 0x0FFE
config USB_PRODUCT_ID
hex "USB Product ID"
default 0x0001
config RT_USB_DEVICE_COMPOSITE
bool "Enable composite device"
default n
choice
prompt "Device type"
default _RT_USB_DEVICE_NONE
depends on !RT_USB_DEVICE_COMPOSITE
config _RT_USB_DEVICE_NONE
bool "Using custom class by register interface"
select RT_USB_DEVICE_NONE
config _RT_USB_DEVICE_CDC
bool "Enable to use device as CDC device"
select RT_USB_DEVICE_CDC
config _RT_USB_DEVICE_MSTORAGE
bool "Enable to use device as Mass Storage device"
select RT_USB_DEVICE_MSTORAGE
config _RT_USB_DEVICE_HID
bool "Enable to use device as HID device"
select RT_USB_DEVICE_HID
config _RT_USB_DEVICE_RNDIS
bool "Enable to use device as rndis device"
select RT_USB_DEVICE_RNDIS
depends on RT_USING_LWIP
config _RT_USB_DEVICE_ECM
bool "Enable to use device as ecm device"
select RT_USB_DEVICE_ECM
depends on RT_USING_LWIP
config _RT_USB_DEVICE_WINUSB
bool "Enable to use device as winusb device"
select RT_USB_DEVICE_WINUSB
config _RT_USB_DEVICE_AUDIO
bool "Enable to use device as audio device"
select RT_USB_DEVICE_AUDIO
endchoice
if RT_USB_DEVICE_COMPOSITE
config RT_USB_DEVICE_CDC
bool "Enable to use device as CDC device"
default n
config RT_USB_DEVICE_NONE
bool
default y
config RT_USB_DEVICE_MSTORAGE
bool "Enable to use device as Mass Storage device"
default n
config RT_USB_DEVICE_HID
bool "Enable to use device as HID device"
default n
config RT_USB_DEVICE_RNDIS
bool "Enable to use device as rndis device"
default n
depends on RT_USING_LWIP
config RT_USB_DEVICE_ECM
bool "Enable to use device as ecm device"
default n
depends on RT_USING_LWIP
config RT_USB_DEVICE_WINUSB
bool "Enable to use device as winusb device"
default n
config RT_USB_DEVICE_AUDIO
bool "Enable to use device as audio device"
default n
endif
if RT_USB_DEVICE_CDC
config RT_VCOM_TASK_STK_SIZE
int "virtual com thread stack size"
default 512
config RT_CDC_RX_BUFSIZE
int "virtual com rx buffer size"
default 128
config RT_VCOM_TX_USE_DMA
bool "Enable to use dma for vcom tx"
default n
config RT_VCOM_SERNO
string "serial number of virtual com"
default "32021919830108"
config RT_VCOM_SER_LEN
int "serial number length of virtual com"
default 14
config RT_VCOM_TX_TIMEOUT
int "tx timeout(ticks) of virtual com"
default 1000
endif
if RT_USB_DEVICE_WINUSB
config RT_WINUSB_GUID
string "Guid for winusb"
default "{6860DC3C-C05F-4807-8807-1CA861CC1D66}"
endif
if RT_USB_DEVICE_MSTORAGE
config RT_USB_MSTORAGE_DISK_NAME
string "msc class disk name"
default "flash0"
endif
if RT_USB_DEVICE_RNDIS
config RNDIS_DELAY_LINK_UP
bool "Delay linkup media connection"
select RT_USING_TIMER_SOFT
default n
endif
if RT_USB_DEVICE_HID
config RT_USB_DEVICE_HID_KEYBOARD
bool "Use to HID device as Keyboard"
default n
if RT_USB_DEVICE_HID_KEYBOARD
config RT_USB_DEVICE_HID_KEYBOARD_NUMBER
int "Number of Keyboard(max 3)"
default 1
range 1 3
endif
config RT_USB_DEVICE_HID_MOUSE
bool "Use to HID device as Mouse"
default n
config RT_USB_DEVICE_HID_GENERAL
bool "Use to HID device as General HID device"
default y
if RT_USB_DEVICE_HID_GENERAL
config RT_USB_DEVICE_HID_GENERAL_OUT_REPORT_LENGTH
int "General HID device out report length"
default 63
range 0 63
config RT_USB_DEVICE_HID_GENERAL_IN_REPORT_LENGTH
int "General HID device in report length"
default 63
range 0 63
endif
config RT_USB_DEVICE_HID_MEDIA
bool "Use to HID device as media keyboard"
default y
endif
if RT_USB_DEVICE_AUDIO
config RT_USB_DEVICE_AUDIO_MIC
bool "Use usb mic device as audio device"
default n
if RT_USB_DEVICE_AUDIO_MIC
config RT_USBD_MIC_DEVICE_NAME
string "audio mic device name"
default "mic0"
endif
config RT_USB_DEVICE_AUDIO_SPEAKER
bool "Use usb speaker device as audio device"
default n
if RT_USB_DEVICE_AUDIO_SPEAKER
config RT_USBD_SPEAKER_DEVICE_NAME
string "audio speaker device name"
default "sound0"
endif
endif
endif
endmenu