update new sdk

This commit is contained in:
August 2020-07-15 19:27:51 +08:00
parent f33907443a
commit 744c72c133
1643 changed files with 83006 additions and 28021 deletions

View file

@ -15,7 +15,7 @@
*/
#define LOG_TAG "audio_hw_primary"
#define LOG_NDEBUG 0
//#define LOG_NDEBUG 0
#include <errno.h>
#include <pthread.h>
@ -303,6 +303,7 @@ static inline void print_sunxi_stream_in(const struct sunxi_stream_in *in)
static uint32_t out_get_sample_rate(const struct audio_stream *stream)
{
struct sunxi_stream_out *out = (struct sunxi_stream_out *)stream;
ALOGV("out_set_sample_rate: %d", out->sample_rate);
return out->sample_rate;
}
@ -326,7 +327,7 @@ static size_t out_get_buffer_size(const struct audio_stream *stream)
static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
{
struct sunxi_stream_out *out = (struct sunxi_stream_out *)stream;
//ALOGV("out_get_channels: return %d", out->channel_mask);
ALOGV("out_get_channels: %#x", out->channel_mask);
char val[PROPERTY_VALUE_MAX];
property_get("vts.native_server.on", val, "0");
if (strcmp(val, "0") == 0) {
@ -338,8 +339,8 @@ static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
static audio_format_t out_get_format(const struct audio_stream *stream)
{
//ALOGV("out_get_format");
struct sunxi_stream_out *out = (struct sunxi_stream_out *)stream;
ALOGV("out_get_format: %#x", out->format);
return out->format;
}
@ -347,7 +348,7 @@ static audio_format_t out_get_format(const struct audio_stream *stream)
static int out_set_format(struct audio_stream *stream, audio_format_t format)
{
UNUSED(stream);
ALOGV("out_set_format: %d",format);
ALOGV("out_set_format: %#x",format);
return -ENOSYS;
}
@ -454,7 +455,7 @@ static void select_devices(struct sunxi_audio_device *adev)
int out_pdev = 0;
int in_pdev = 0;
ALOGD("select_devices:mode(%#x),out_devices(%#x),in_devices(%#x),"
ADLOG("select_devices:mode(%#x),out_devices(%#x),in_devices(%#x),"
"active_output(%p),active_input(%p).",
adev->mode, adev->out_devices, adev->in_devices,
adev->active_output, adev->active_input);
@ -519,7 +520,6 @@ static void select_devices(struct sunxi_audio_device *adev)
static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
{
ALOGV("out_set_parameters");
struct sunxi_stream_out *out = (struct sunxi_stream_out *)stream;
struct sunxi_audio_device *adev = out->dev;
struct str_parms *parms;
@ -586,7 +586,7 @@ static int out_set_volume(struct audio_stream_out *stream, float left,
int start_output_stream(struct sunxi_stream_out *out)
{
ALOGV("start_output_stream");
ALOGD("start_output_stream");
int ret = 0;
struct sunxi_audio_device *adev = out->dev;
int platform_device;
@ -640,6 +640,8 @@ int start_output_stream(struct sunxi_stream_out *out)
platform_plugins_process_start_stream(adev->platform,
ON_START_OUTPUT_STREAM,
out->config);
ADLOG("+++++++++++++++ start_output_stream: pcm sample_rate: %d,pcm fmt: 0x%08x,pcm channels: %d",
out->config.rate, out->config.format, out->config.channels);
out->pcm = pcm_open(out->card, out->port, PCM_OUT | PCM_MONOTONIC,
&out->config);
@ -662,6 +664,7 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
size_t frame_size = audio_stream_out_frame_size(stream);
size_t out_frames = bytes / frame_size;
ssize_t ret = 0;
ALOGV("out_write");
pthread_mutex_lock(&out->lock);
if (out->standby) {
@ -787,8 +790,8 @@ static int out_get_presentation_position(const struct audio_stream_out *stream,
/** audio_stream_in implementation **/
static uint32_t in_get_sample_rate(const struct audio_stream *stream)
{
ALOGV("in_get_sample_rate");
struct sunxi_stream_in *in = (struct sunxi_stream_in *)stream;
ALOGV("in_get_sample_rate: %d", in->sample_rate);
return in->sample_rate;
}
@ -819,7 +822,7 @@ static size_t in_get_buffer_size(const struct audio_stream *stream)
static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
{
//ALOGV("in_get_channels");
ALOGV("in_get_channels");
struct sunxi_stream_in *in = (struct sunxi_stream_in *)stream;
return in->channel_mask;
@ -828,7 +831,7 @@ static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
static audio_format_t in_get_format(const struct audio_stream *stream)
{
UNUSED(stream);
//ALOGV("in_get_format");
ALOGV("in_get_format");
return AUDIO_FORMAT_PCM_16_BIT;
}
@ -836,6 +839,7 @@ static audio_format_t in_get_format(const struct audio_stream *stream)
static int in_set_format(struct audio_stream *stream, audio_format_t format)
{
UNUSED(stream); UNUSED(format);
ALOGV("in_set_format");
return -ENOSYS;
}
@ -860,7 +864,7 @@ static int in_standby(struct audio_stream *stream)
struct sunxi_stream_in *in = (struct sunxi_stream_in *)stream;
struct sunxi_audio_device *adev = in->dev;
int status = 0;
ALOGV("%s: enter", __func__);
ALOGD("%s: enter", __func__);
pthread_mutex_lock(&in->lock);
pthread_mutex_lock(&adev->lock);
@ -941,7 +945,7 @@ static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
int ret, val = 0;
int status = 0;
ALOGV("%s: enter: kvpairs=%s", __func__, kvpairs);
ALOGD("%s: enter: kvpairs=%s", __func__, kvpairs);
parms = str_parms_create_str(kvpairs);
/* in stream routing */
@ -970,6 +974,7 @@ static char * in_get_parameters(const struct audio_stream *stream,
const char *keys)
{
UNUSED(stream); UNUSED(keys);
ALOGV("start_input_stream");
return strdup("");
}
@ -977,13 +982,14 @@ static char * in_get_parameters(const struct audio_stream *stream,
static int in_set_gain(struct audio_stream_in *stream, float gain)
{
UNUSED(stream); UNUSED(gain);
ALOGV("in_set_gain");
return 0;
}
int start_input_stream(struct sunxi_stream_in *in)
{
ALOGV("start_input_stream");
ALOGD("start_input_stream");
int ret = 0;
struct sunxi_audio_device *adev = in->dev;
int platform_device;
@ -1002,6 +1008,8 @@ int start_input_stream(struct sunxi_stream_in *in)
update_debug_flag();
print_sunxi_stream_in(in);
ADLOG("+++++++++++++++ start_input_stream: pcm sample_rate: %d,pcm fmt: 0x%08x,pcm channels: %d",
in->config.rate, in->config.format, in->config.channels);
in->pcm = pcm_open(in->card, in->port, PCM_IN | PCM_MONOTONIC, &in->config);
if (!pcm_is_ready(in->pcm)) {
@ -1069,6 +1077,7 @@ static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
size_t frames = bytes / audio_stream_in_frame_size(stream);
int i;
int ret = -1;
ALOGV("in_read");
pthread_mutex_lock(&in->lock);
@ -1155,6 +1164,8 @@ static int in_add_audio_effect(const struct audio_stream *stream,
effect_handle_t effect)
{
UNUSED(stream); UNUSED(effect);
ALOGV("in_add_audio_effect");
return 0;
}
@ -1162,6 +1173,8 @@ static int in_remove_audio_effect(const struct audio_stream *stream,
effect_handle_t effect)
{
UNUSED(stream); UNUSED(effect);
ALOGV("in_remove_audio_effect");
return 0;
}
@ -1174,7 +1187,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
const char *address __unused)
{
UNUSED(handle);
ALOGV("adev_open_output_stream");
ALOGD("adev_open_output_stream");
struct sunxi_audio_device *adev = (struct sunxi_audio_device *)dev;
struct sunxi_stream_out *out;
@ -1229,7 +1242,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
} else {
out->format = config->format;
out->sample_rate = config->sample_rate;
ALOGD("+++++++++++++++ channel_mask: add out-get-channel_mask for vts!!");
ALOGV("+++++++++++++++ channel_mask: add out-get-channel_mask for vts!!");
out->channel_mask_vts = config->channel_mask;
out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
}
@ -1245,7 +1258,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
config->channel_mask = out_get_channels(&out->stream.common);
config->sample_rate = out_get_sample_rate(&out->stream.common);
ALOGV("+++++++++++++++ adev_open_output_stream: req_sample_rate: %d, fmt: %x, channel_mask: %d",
ADLOG("+++++++++++++++ adev_open_output_stream: req_sample_rate: %d, fmt: 0x%08x, channel_mask: 0x%08x",
config->sample_rate, config->format, config->channel_mask);
platform_plugins_process(adev->platform, ON_OPEN_OUTPUT_STREAM);
@ -1275,7 +1288,7 @@ static void adev_close_output_stream(struct audio_hw_device *dev,
static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
{
ALOGV("adev_set_parameters, %s", kvpairs);
ALOGD("adev_set_parameters, %s", kvpairs);
struct sunxi_audio_device *adev = (struct sunxi_audio_device *)dev;
struct sunxi_stream_out *out = adev->active_output;
@ -1386,7 +1399,7 @@ static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
{
ALOGD("%s: state %d\n", __func__, state);
ALOGV("%s: state %d\n", __func__, state);
struct sunxi_audio_device *adev = (struct sunxi_audio_device *)dev;
pthread_mutex_lock(&adev->lock);
@ -1480,11 +1493,11 @@ static int adev_open_input_stream(struct audio_hw_device *dev,
audio_source_t source __unused)
{
UNUSED(handle);
ALOGV("adev_open_input_stream...");
ALOGD("adev_open_input_stream...");
struct sunxi_audio_device *adev = (struct sunxi_audio_device *)dev;
struct sunxi_stream_in *in;
int channel_count = popcount(config->channel_mask);
int channel_count = audio_channel_count_from_in_mask(config->channel_mask);
int ret;
in = (struct sunxi_stream_in *)calloc(1, sizeof(struct sunxi_stream_in));
@ -1524,6 +1537,8 @@ static int adev_open_input_stream(struct audio_hw_device *dev,
memcpy(&in->config, &in_pcm_config, sizeof(struct pcm_config));
in->config.channels = channel_count;
ADLOG("+++++++++++++++ adev_open_input_stream: req_sample_rate: %d, fmt: 0x%08x, channel_mask: 0x%08x",
config->sample_rate, config->format, config->channel_mask);
*stream_in = &in->stream;
@ -1607,7 +1622,7 @@ static int adev_close(hw_device_t *device)
static int adev_open(const hw_module_t* module, const char* name,
hw_device_t** device)
{
ALOGV("adev_open: %s", name);
ALOGD("adev_open: %s", name);
struct sunxi_audio_device *adev;
int ret;

View file

@ -1,6 +1,6 @@
mali400: r8p1-00rel0 um android oreo_mr1 arm64 003
mali400: r8p1-00rel0 um android oreo_mr1 arm64 008
Fix mali-utgard prerotate issue on Android O;
Fix Dajing platform failed on CtsThemeHostTestCases issue;
Build parameters:
VARIANT=mali400-r1p1-gles-linux-android-oreo-prerotate-no_profiling-dma_buf-rgb_is_xrgb-no_Werror-egl_wait_sync
@ -10,5 +10,5 @@ CONFIG=release
CROSS_COMPILE=aarch64-linux-
MD5 Info:
5e47d50472785b632c0835cb36836196 lib/libGLES_mali.so
955a65789eb92586d356385c1714b4d6 lib64/libGLES_mali.so
49c90f5da5373fb7f4b7751e5ef6cfa8 lib/libGLES_mali.so
63de2088e7437fbb9f2aa627a4baa81e lib64/libGLES_mali.so

Binary file not shown.

Binary file not shown.

View file

@ -64,6 +64,7 @@ typedef struct eventThreadContext {
}eventThreadContext_t;
int hdmifd = -1;
static int hdmihotplug=0;
eventThreadContext_t eventContext;
#define EPOLL_COUNT 6
static void *eventThreadLoop(void *user);
@ -302,6 +303,7 @@ hotplugUeventParse(eventThreadContext_t *context, const char *msg)
read(hdmifd, &state, 1);
ALOGD("Receive %s hotplug state[%d]", switch_name, state-48);
callHotplug(context, display, state == '1'? 1 : 0);
hdmihotplug= (state == '1'? 1 : 0);
}
}
while (*msg++);
@ -336,8 +338,10 @@ static void *eventThreadLoop(void *user)
for (int i = 0; i < context->numberDisplay; i++) {
display = context->display[i];
if (strcmp(context->display[0]->displayName, "hdmi")) {
if (!strcmp(display->displayName, "hdmi"))
if (!strcmp(display->displayName, "hdmi")){
callHotplug(context, display, state == '1'? 1 : 0);
hdmihotplug=1;
}
}
}
}
@ -388,14 +392,14 @@ init_epoll:
== sizeof(cmd_esg)) {
switch(cmd_esg.cmd) {
case 1:// switch hdmi mode
ALOGD("chang hdmi[%d] mode[%d] from user",cmd_esg.disp, cmd_esg.data);
ALOGD("chang hdmi[%d] mode[%d] hdmihotplug[%d] from user",cmd_esg.disp, cmd_esg.data,hdmihotplug);
if (cmd_esg.disp != 1 ||
context->display[cmd_esg.disp]->default_mode == cmd_esg.data)
context->display[cmd_esg.disp]->default_mode == cmd_esg.data ||(hdmihotplug==0))
break;
callHotplug(context, context->display[cmd_esg.disp], 0);
context->display[cmd_esg.disp]->default_mode = cmd_esg.data;
callHotplug(context, context->display[cmd_esg.disp], 1);
// if(hdmihotplug==1)
callHotplug(context, context->display[cmd_esg.disp], 1);
break;
case 2://3D
if (((enum display_3d_mode)cmd_esg.data != DISPLAY_3D_LEFT_RIGHT_HDMI) &&
@ -411,7 +415,9 @@ init_epoll:
default:
ALOGD("not a right mesg");
break;
}
break;
}
}
}

View file

@ -1513,7 +1513,11 @@ KeyMaster_V2_Update(const keymaster_device_t* dev,
keymaster_error_t err_type = KM_ERROR_OK;
uint32_t in_params_size;
in_params_size = compute_param_set_length(in_params);
if(in_params) {
in_params_size = compute_param_set_length(in_params);
} else {
in_params_size = 0;
}
uint32_t paramsize;
paramsize = sizeof(TEE_params_expand) +

View file

@ -75,7 +75,7 @@ static size_t tee_fs_get_absolute_filename(char *file, char *out,
/* Safe to cast since we have checked that sizes are OK */
return (size_t)s;
}
#ifdef CREATE_TEE_DIR
static int do_mkdir(const char *path, mode_t mode)
{
struct stat st;
@ -113,19 +113,20 @@ static int mkpath(const char *path, mode_t mode)
free(subpath);
return status;
}
#endif
int tee_supp_fs_init(void)
{
size_t n;
#ifdef CREATE_TEE_DIR
mode_t mode = 0700;
#endif
n = snprintf(tee_fs_root, sizeof(tee_fs_root), "%s/tee/", TEE_FS_PARENT_PATH);
if (n >= sizeof(tee_fs_root))
return -1;
#ifdef CREATE_TEE_DIR
if (mkpath(tee_fs_root, mode) != 0)
return -1;
#endif
return 0;
}

44
android/hardware/aw/sensors/aw_sensors/AccelSensor.cpp Normal file → Executable file
View file

@ -262,13 +262,18 @@ int AccelSensor::readEvents(sensors_event_t* data, int count) {
return -EINVAL;
ssize_t n = mInputReader.fill(data_fd);
if (n < 0)
return n;
if (n < 0) {
ALOGE(" sensor AceelSensor readEvents fill buffer failed\n");
return n;
}
int numEventReceived = 0;
input_event const* event;
ssize_t dataAvailable = 0;
dataAvailable = mInputReader.readEvent(&event);
if (dataAvailable <= 0)
ALOGE("sensor no sensor data available\n");
while (count && mInputReader.readEvent(&event)) {
while (count && dataAvailable) {
int type = event->type;
if ((type == EV_ABS) || (type == EV_REL) || (type == EV_KEY)) {
@ -276,28 +281,26 @@ int AccelSensor::readEvents(sensors_event_t* data, int count) {
mInputReader.next();
} else if (type == EV_SYN) {
int64_t time = timevalToNano(event->time);
if (mPendingMask) {
mPendingMask = 0;
mPendingEvent.timestamp = time;
if (mEnabled) {
*data++ = mPendingEvent;
mAccData = mPendingEvent;
count--;
numEventReceived++;
}
}
if (mPendingMask) {
mPendingMask = 0;
mPendingEvent.timestamp = time;
*data++ = mPendingEvent;
mAccData = mPendingEvent;
count--;
numEventReceived++;
} else
ALOGE("AccelSensor error no data but sync event\n");
if (!mPendingMask) {
mInputReader.next();
}
} else {
ALOGE("AccelSensor: unknown event (type=%d, code=%d)",
type, event->code);
mInputReader.next();
}
}
dataAvailable = mInputReader.readEvent(&event);
}
return numEventReceived;
@ -332,6 +335,11 @@ void AccelSensor::processEvent(int code, int value) {
mPendingMask = 1;
mPendingEvent.acceleration.z = value * direct_z ;
break;
default:
ALOGE("AccelSensor: unknown code (value=%d, code=%d)\n",
value, code);
break;
}
#ifdef DEBUG_SENSOR

View file

@ -50,11 +50,12 @@ InputEventCircularReader::~InputEventCircularReader()
ssize_t InputEventCircularReader::fill(int fd)
{
size_t numEventsRead = 0;
if (mFreeSpace) {
if (mFreeSpace > 0) {
const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event));
if (nread<0 || nread % sizeof(input_event)) {
if (nread <= 0 || nread % sizeof(input_event)) {
// we got a partial event!!
return nread<0 ? -errno : -EINVAL;
ALOGE("sensor InputEventCircular read data frome fd fail\n");
return nread < 0 ? -errno : -EINVAL;
}
numEventsRead = nread / sizeof(input_event);
@ -68,7 +69,9 @@ ssize_t InputEventCircularReader::fill(int fd)
mHead = mBuffer + s;
}
}
}
} else {
ALOGE("sensor InputEventCircular no free space for data\n");
}
return numEventsRead;
}

View file

@ -126,25 +126,23 @@ int ProximitySensor::readEvents(sensors_event_t* data, int count)
processEvent(event->code, event->value);
mInputReader.next();
} else if (type == EV_SYN) {
int64_t time = timevalToNano(event->time);
int64_t time = timevalToNano(event->time);
if (mPendingMask) {
mPendingMask = 0;
mPendingEvent.timestamp = time;
if (mPendingMask) {
mPendingMask = 0;
mPendingEvent.timestamp = time;
*data++ = mPendingEvent;
count--;
numEventReceived++;
} else
ALOGE("ProximitySensor sensor error no data but sync event\n");
if (mEnabled) {
*data++ = mPendingEvent;
count--;
numEventReceived++;
}
}
if (!mPendingMask) {
if (!mPendingMask) {
mInputReader.next();
}
} else {
ALOGE("AccelSensor: unknown event (type=%d, code=%d)",
ALOGE("ProximitySensor: unknown event (type=%d, code=%d)",
type, event->code);
mInputReader.next();
}

10
android/hardware/aw/sensors/aw_sensors/sensorDetect.cpp Normal file → Executable file
View file

@ -119,9 +119,9 @@ struct sensor_extend_t proSensorList[] = {
SENSORS_PROXIMITY_HANDLE,
SENSOR_TYPE_PROXIMITY,
1.0f, 0.1f,
0.873f, 0,
0.873f, 50000,
0,0,SENSOR_STRING_TYPE_PROXIMITY,
0,0,SENSOR_FLAG_WAKE_UP,
0,1000000,(SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE),
{ },
},
}
@ -154,9 +154,9 @@ struct sensor_extend_t ligSensorList[] = {
SENSORS_LIGHT_HANDLE,
SENSOR_TYPE_LIGHT,
4096.0f, 1.0f,
0.09f, 0,
0.09f, 50000,
0,0,SENSOR_STRING_TYPE_LIGHT,
0,0,SENSOR_FLAG_ON_CHANGE_MODE,
0,1000000,SENSOR_FLAG_ON_CHANGE_MODE,
{ },
},
},
@ -243,7 +243,7 @@ struct sensor_extend_t gsensorList[] = {
SENSOR_TYPE_ACCELEROMETER,
4.0f*9.81f,
(4.0f*9.81f)/1024.0f,
0.2f, 8100,
0.2f, 10000,
0,0,SENSOR_STRING_TYPE_ACCELEROMETER,
0,1000000,SENSOR_FLAG_CONTINUOUS_MODE,
{ },

11
android/hardware/aw/sensors/aw_sensors/sensors.cpp Normal file → Executable file
View file

@ -285,6 +285,7 @@ int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
{
int nbEvents = 0;
int n = 0;
int noInCnt = 0;
// check flush pending
for (int i = 0; i < 10; i++) {
if(getFlushPending(i)) {
@ -301,7 +302,7 @@ int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
n = poll(mPollFds, sNumber, -1);
if (n<0) {
ALOGE(" AW poll() failed (%s)", strerror(errno));
ALOGE(" AW sensor poll() failed (%s)", strerror(errno));
return 0;
}
if (mPollFds[wake].revents & POLLIN) {
@ -314,7 +315,6 @@ int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
// read sensor event
for (int i = 0 ; (count >= 0) && (i < sNumber) ; i++) {
SensorBase* const sensor(mSensors[i]);
#ifdef DEBUG_SENSOR
ALOGE("AW count:%d, mPollFds[%d].revents:%d, hasPendingEvents():%d,sNumber:%d\n",
count, i, mPollFds[i].revents, sensor->hasPendingEvents(),sNumber);
@ -324,10 +324,15 @@ int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count)
if (nb < count) {
mPollFds[i].revents = 0;
}
if (nb <= 0)
ALOGE("AW sensor: %d error readEvents return %d\n", i, nb);
count -= nb;
nbEvents += nb;
data += nb;
}
} else
noInCnt++;
if (noInCnt == sNumber)
ALOGE("AW sensor error no data pollin\n");
}
return nbEvents;
}

View file

@ -14,10 +14,11 @@
# limitations under the License.
#
include hardware/aw/wlan/config/config.mk
include hardware/aw/wlan/firmware/broadcom/ap6212/device-bcm.mk
#include hardware/aw/wlan/firmware/broadcom/ap6356s/device-bcm.mk
#include hardware/aw/wlan/firmware/broadcom/ap6255/device-bcm.mk
#include hardware/aw/wlan/firmware/broadcom/ap6210/device-bcm.mk
#include hardware/aw/wlan/firmware/broadcom/ap6330/device-bcm.mk
#include hardware/aw/wlan/firmware/broadcom/ap6335/device-bcm.mk
include hardware/aw/wlan/firmware/broadcom/ap6356s/device-bcm.mk
include hardware/aw/wlan/firmware/broadcom/ap6255/device-bcm.mk
include hardware/aw/wlan/firmware/broadcom/ap6210/device-bcm.mk
include hardware/aw/wlan/firmware/broadcom/ap6330/device-bcm.mk
include hardware/aw/wlan/firmware/broadcom/ap6335/device-bcm.mk