amlogic ap6210 wifi bt驱动移植

外设配置 - wifi

SDIO wifi: AP6210

1 配置 kernel

配置 deconfig 文件
AP6210

kernel 的配置主要是修改 common/customer 目录下对应的 deconfig 文件和 BSP 文件。
CONFIG_AM_WIFI=y
CONFIG_AM_WIFI_SD_MMC=y
CONFIG_SDIO_DHD_CDC_WIFI_40181_MODULE=m
CONFIG_BCM40181_WIFI=y
CONFIG_SDIO_HARD_IRQ=n
CONFIG_BCM40181_HW_OOB=y
CONFIG_BCM40181_OOB_INTR_ONLY=y
 

配置 BSP 文件
 SDIO wifi

static struct aml_card_info meson_card_info[] = {
[0] = {
.name = "sd_card",
.work_mode = CARD_HW_MODE,
.io_pad_type = SDHC_CARD_0_5,
.card_ins_en_reg = CARD_GPIO_ENABLE,
.card_ins_en_mask = PREG_IO_29_MASK,
.card_ins_input_reg = CARD_GPIO_INPUT,
.card_ins_input_mask = PREG_IO_29_MASK,
.card_power_en_reg = CARD_GPIO_ENABLE,
.card_power_en_mask = PREG_IO_31_MASK,
.card_power_output_reg = CARD_GPIO_OUTPUT,
.card_power_output_mask = PREG_IO_31_MASK,
.card_power_en_lev = 0,
.card_wp_en_reg = 0,
.card_wp_en_mask = 0,
.card_wp_input_reg = 0,
.card_wp_input_mask = 0,
.card_extern_init = 0,
},
#if 1
[1] = {
.name = "sdio_card",
.work_mode = CARD_HW_MODE,
.io_pad_type = SDHC_GPIOX_0_9,
.card_ins_en_reg = 0,
.card_ins_en_mask = 0,
.card_ins_input_reg = 0,
.card_ins_input_mask = 0,
.card_power_en_reg = 0,
.card_power_en_mask = 0,
.card_power_output_reg = 0,
.card_power_output_mask = 0,
.card_power_en_lev = 0,
.card_wp_en_reg = 0,
.card_wp_en_mask = 0,
.card_wp_input_reg = 0,
.card_wp_input_mask = 0,
.card_extern_init = sdio_extern_init,
},

#endif
};
(具体的 io 口要根据平台原理图来配置,下面只是示例)
wifi 32K 时钟设置:
static void wifi_clock_enable(int is_on)
{
//set clk 32k for wifi
//GPIOX_12 (CLK_OUT3) //reg: 108b sr_sl:22-25 div:13-19 enable:21
gpio_set_status(PAD_GPIOX_12,gpio_status_out);//set GPIOX_12 out
aml_set_reg32_mask(P_HHI_GEN_CLK_CNTL2,1<<22);//set clk source
aml_clr_reg32_mask(P_HHI_GEN_CLK_CNTL2,0x3f<<13);//set div ==1
aml_set_reg32_mask(P_HHI_GEN_CLK_CNTL2,1<<21);//set enable clk
aml_set_reg32_mask(P_PERIPHS_PIN_MUX_3,0x1<<21);//set mode GPIOX_12-->CLK_OUT3
}
(WIFI 上电引脚,中断引脚 gpio 设置,以及 sdio 接口的内部上拉设置)

static void wifi_gpio_init(void)
{
//set status
//WIFI_EN WIFI_PWREN WLAN_RST --->out :0
gpio_set_status(PAD_GPIOC_8,gpio_status_out);
//WIFI_WAKE -->1GPIOX_11 in :
gpio_set_status(PAD_GPIOX_11,gpio_status_in);
//set pull-up
aml_clr_reg32_mask(P_PAD_PULL_UP_REG4,0xf|1<<8|1<<9|1<<11|1<<12);
aml_clr_reg32_mask(P_PAD_PULL_UP_REG2,1<<7|1<<8|1<<9);
}
(WIFI 上电函数)
void extern_wifi_set_enable(int is_on)
{
DBG_LINE_INFO();
gpio_set_status(PAD_GPIOC_8,gpio_status_out);//set wifi_en gpio mode out
if(is_on){
gpio_out(PAD_GPIOC_8,1);
printk("WIFI Enable! \n");
}
else{
gpio_out(PAD_GPIOC_8,0);
printk("WIFI Disenable! \n");
}
}
(WIFI wake 中断设置)
(在 sdio_extern_init 函数中添加)

gpio_set_status(PAD_GPIOX_11,gpio_status_in);
gpio_irq_set(PAD_GPIOX_11,GPIO_IRQ(4,GPIO_IRQ_HIGH));

<注>:WIFI 中断设置必须配置正确,否则会引起 CPU 占用率过高的问题。如果移植出现整
个系统响应变慢,则重点查这个配置是否正确。

2 配置 rootfs(Android4.2)
Android 4.2 中很多 wifi 公共性的配置已经放在 device/amlogic/common/wifi.mk 中了,所以我
们只需要配置两个文件:init.rc 和 xxx.mk。
配置 init.rc 文件
 SDIO wifi
(创建一些 wifi 使用的配置目录)

 
on post-fs-data
mkdir /data/misc/wifi 0770 wifi wifi
mkdir /data/misc/wifi/sockets 0770 wifi wifi
chmod 0770 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
chown wifi wifi /data/misc/wifi
chown wifi wifi /data/misc/wifi/sockets
chown wifi wifi /data/misc/wifi/wpa_supplicant.conf
on boot
setprop wifi.interface wlan0
mkdir /data/misc/dhcp 0770 dhcp dhcp
chmod 0770 /data/misc/dhcp

(添加 wifi 相关的 service)
service wpa_supplicant /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -
e/data/misc/wifi/entropy.bin
# user wifi
# group wifi inet keystore
class main
socket wpa_wlan0 dgram 0660 wifi wifi
disabled
oneshot
service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL
class main
group dhcp system
disabled
oneshot
(需要支持 p2p 的话则需添加)
service p2p_supplicant /system/bin/wpa_supplicant \
-iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
-N -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -
e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1
# user wifi
# group wifi inet keystore

class main
socket wpa_wlan0 dgram 0660 wifi wifi
disabled
oneshot
service dhcpcd_p2p /system/bin/dhcpcd -ABKL
class main
group dhcp system
disabled
oneshot


(hostap 服务添加)
service hostapd /system/bin/hostapd_wps /data/misc/wifi/hostapd.conf
class main
disabled
Oneshot

配置 xxx.mk(如 g18ref.mk)文件
 AP6210(芯片是 40181)
WIFI_MODULE := bcm40181
include device/amlogic/common/wifi.mk
WIFI_AP6xxx_MODULE := AP6210




外设配置 - 蓝牙
目前公版支持蓝牙模组,以 WL212和 AP6210为例。
1 配置 kernel
kernel 的配置主要是修改 common/customer 目录下对应的 deconfig 文件和 BSP 文件。

配置 deconfig 文件
CONFIG_BT=y
CONFIG_BT_L2CAP=y
CONFIG_BT_SCO=y
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=y
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=y
CONFIG_BT_HCIUART=y
CONFIG_BT_HCIUART_H4=y
CONFIG_RFKILL=y
CONFIG_RFKILL_INPUT=y
CONFIG_BT_DEVICE=y

配置 BSP 文件
(根据硬件原理图,在软件上把相应的串口打开,下面是串口 A 示例样例)

static pinmux_item_t uart_pins[] = {
{
.reg = PINMUX_REG(AO),
.setmask = 3 << 11
},
{
.reg = PINMUX_REG(4),
.setmask = 0xf << 10
},
PINMUX_END_ITEM
};
static pinmux_set_t aml_uart_a = {
.chip_select = NULL,
.pinmux = &uart_pins[1]
};
static struct aml_uart_platform __initdata aml_uart_plat = {
.uart_line[0] = UART_AO,
.uart_line[1] = UART_A,
.uart_line[2] = UART_B,
.uart_line[3] = UART_C,
.uart_line[4] = UART_D,
.pinmux_uart[0] = (void*)&aml_uart_ao,
.pinmux_uart[1] = (void*)&aml_uart_a,
.pinmux_uart[2] = NULL,
.pinmux_uart[3] = NULL,
.pinmux_uart[4] = NULL
};
(BT PCM 接口以及上电引脚的添加)
static pinmux_item_t pcm_pins[] = {
{
.reg = PINMUX_REG(3),
.setmask = 0xf << 27
},
PINMUX_END_ITEM
};
static pinmux_set_t pcm_pinmux_set = {
.chip_select = NULL,
.pinmux = &pcm_pins[0],
};
static void bt_device_init(void)

{


/* BT_RST_N */
gpio_set_status(PAD_GPIOC_9,gpio_status_out);
/* BT_REG_ON */
gpio_set_status(PAD_GPIOC_7,gpio_status_out);
pinmux_set(&pcm_pinmux_set);
/* BT_WAKE */
gpio_set_status(PAD_GPIOX_10,gpio_status_out);
gpio_out(PAD_GPIOX_10,1);

}
static void bt_device_on(void)
{
gpio_out(PAD_GPIOC_9,0);
gpio_out(PAD_GPIOC_7,0);
msleep(20);
/* BT_RST_N */
gpio_out(PAD_GPIOC_9,1);
/* BT_REG_ON */
gpio_out(PAD_GPIOC_7,1);
msleep(20);
}
static void bt_device_off(void)
{
/* BT_RST_N */
gpio_out(PAD_GPIOC_9,0);
/* BT_REG_ON */
gpio_out(PAD_GPIOC_7,0);
msleep(20);
}
<注>
BT EN 以及 BT RST 脚,需要查看硬件原理图,分别对应哪个 GPIO 脚,然后修改以下三个
函数
bt_device_init
bt_device_on
bt_device_off

最新的 AP6xxxx 系列的 BT 模块并没有 BT_EN 脚,所以该引脚操作可以不添加

2 配置 rootfs
只需要配置 xxx.mk 文件。

配置 xxx.mk 文件



AP6210

BOARD_HAVE_BLUETOOTH := true
BLUETOOTH_MODULE := AP6210
include device/amlogic/common/bluetooth.mk

你可能感兴趣的:(amlogic,anroid,bt,anroid,ap6210,移植,adroid,wifi,驱动移植)