每个无线设备和每个无线虚拟接口都要提供一组配置操作和功能操作,这些操作都由用户空间激发,进而调用驱动操作,每一个操作的执行都是在操作结构体重分开描述和关联。

结构体struct cfg80211_ops描述了无线的配置操作,它通过fullmac或者无线协议注册来关联相应的接口请求操作。

/*** struct cfg80211_ops - backend description for wireless configuration** This struct is registered by fullmac card drivers and/or wireless stacks* in order to handle configuration requests on their interfaces.** All callbacks except where otherwise noted should return 0* on success or a negative error code.** All operations are currently invoked under rtnl for consistency with the* wireless extensions but this is subject to reevaluation as soon as this* code is used more widely and we have a first user without wext.**/
struct cfg80211_ops {int    (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);int    (*resume)(struct wiphy *wiphy);void (*set_wakeup)(struct wiphy *wiphy, bool enabled);struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy,const char *name,unsigned char name_assign_type,enum nl80211_iftype type,u32 *flags,struct vif_params *params);int   (*del_virtual_intf)(struct wiphy *wiphy,struct wireless_dev *wdev);int  (*change_virtual_intf)(struct wiphy *wiphy,struct net_device *dev,enum nl80211_iftype type, u32 *flags,struct vif_params *params);int   (*add_key)(struct wiphy *wiphy, struct net_device *netdev,u8 key_index, bool pairwise, const u8 *mac_addr,struct key_params *params);int    (*get_key)(struct wiphy *wiphy, struct net_device *netdev,u8 key_index, bool pairwise, const u8 *mac_addr,void *cookie,void (*callback)(void *cookie, struct key_params*));int  (*del_key)(struct wiphy *wiphy, struct net_device *netdev,u8 key_index, bool pairwise, const u8 *mac_addr);int  (*set_default_key)(struct wiphy *wiphy,struct net_device *netdev,u8 key_index, bool unicast, bool multicast);int    (*set_default_mgmt_key)(struct wiphy *wiphy,struct net_device *netdev,u8 key_index);int (*start_ap)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_ap_settings *settings);int  (*change_beacon)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_beacon_data *info);int (*stop_ap)(struct wiphy *wiphy, struct net_device *dev);int (*add_station)(struct wiphy *wiphy, struct net_device *dev,const u8 *mac,struct station_parameters *params);int (*del_station)(struct wiphy *wiphy, struct net_device *dev,struct station_del_parameters *params);int   (*change_station)(struct wiphy *wiphy, struct net_device *dev,const u8 *mac,struct station_parameters *params);int  (*get_station)(struct wiphy *wiphy, struct net_device *dev,const u8 *mac, struct station_info *sinfo);int   (*dump_station)(struct wiphy *wiphy, struct net_device *dev,int idx, u8 *mac, struct station_info *sinfo);int   (*add_mpath)(struct wiphy *wiphy, struct net_device *dev,const u8 *dst, const u8 *next_hop);int (*del_mpath)(struct wiphy *wiphy, struct net_device *dev,const u8 *dst);int (*change_mpath)(struct wiphy *wiphy, struct net_device *dev,const u8 *dst, const u8 *next_hop);int  (*get_mpath)(struct wiphy *wiphy, struct net_device *dev,u8 *dst, u8 *next_hop, struct mpath_info *pinfo);int   (*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,int idx, u8 *dst, u8 *next_hop,struct mpath_info *pinfo);int  (*get_mpp)(struct wiphy *wiphy, struct net_device *dev,u8 *dst, u8 *mpp, struct mpath_info *pinfo);int  (*dump_mpp)(struct wiphy *wiphy, struct net_device *dev,int idx, u8 *dst, u8 *mpp,struct mpath_info *pinfo);int (*get_mesh_config)(struct wiphy *wiphy,struct net_device *dev,struct mesh_config *conf);int (*update_mesh_config)(struct wiphy *wiphy,struct net_device *dev, u32 mask,const struct mesh_config *nconf);int (*join_mesh)(struct wiphy *wiphy, struct net_device *dev,const struct mesh_config *conf,const struct mesh_setup *setup);int (*leave_mesh)(struct wiphy *wiphy, struct net_device *dev);int  (*join_ocb)(struct wiphy *wiphy, struct net_device *dev,struct ocb_setup *setup);int    (*leave_ocb)(struct wiphy *wiphy, struct net_device *dev);int   (*change_bss)(struct wiphy *wiphy, struct net_device *dev,struct bss_parameters *params);int    (*set_txq_params)(struct wiphy *wiphy, struct net_device *dev,struct ieee80211_txq_params *params);int  (*libertas_set_mesh_channel)(struct wiphy *wiphy,struct net_device *dev,struct ieee80211_channel *chan);int (*set_monitor_channel)(struct wiphy *wiphy,struct cfg80211_chan_def *chandef);int   (*scan)(struct wiphy *wiphy,struct cfg80211_scan_request *request);void (*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev);int   (*auth)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_auth_request *req);int  (*assoc)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_assoc_request *req);int    (*deauth)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_deauth_request *req);int  (*disassoc)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_disassoc_request *req);int  (*connect)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_connect_params *sme);int (*disconnect)(struct wiphy *wiphy, struct net_device *dev,u16 reason_code);int  (*join_ibss)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_ibss_params *params);int   (*leave_ibss)(struct wiphy *wiphy, struct net_device *dev);int  (*set_mcast_rate)(struct wiphy *wiphy, struct net_device *dev,int rate[NUM_NL80211_BANDS]);int  (*set_wiphy_params)(struct wiphy *wiphy, u32 changed);int   (*set_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,enum nl80211_tx_power_setting type, int mbm);int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,int *dbm);int    (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,const u8 *addr);void    (*rfkill_poll)(struct wiphy *wiphy);#ifdef CONFIG_NL80211_TESTMODEint   (*testmode_cmd)(struct wiphy *wiphy, struct wireless_dev *wdev,void *data, int len);int (*testmode_dump)(struct wiphy *wiphy, struct sk_buff *skb,struct netlink_callback *cb,void *data, int len);
#endifint   (*set_bitrate_mask)(struct wiphy *wiphy,struct net_device *dev,const u8 *peer,const struct cfg80211_bitrate_mask *mask);int (*dump_survey)(struct wiphy *wiphy, struct net_device *netdev,int idx, struct survey_info *info);int    (*set_pmksa)(struct wiphy *wiphy, struct net_device *netdev,struct cfg80211_pmksa *pmksa);int   (*del_pmksa)(struct wiphy *wiphy, struct net_device *netdev,struct cfg80211_pmksa *pmksa);int   (*flush_pmksa)(struct wiphy *wiphy, struct net_device *netdev);int  (*remain_on_channel)(struct wiphy *wiphy,struct wireless_dev *wdev,struct ieee80211_channel *chan,unsigned int duration,u64 *cookie);int    (*cancel_remain_on_channel)(struct wiphy *wiphy,struct wireless_dev *wdev,u64 cookie);int   (*mgmt_tx)(struct wiphy *wiphy, struct wireless_dev *wdev,struct cfg80211_mgmt_tx_params *params,u64 *cookie);int   (*mgmt_tx_cancel_wait)(struct wiphy *wiphy,struct wireless_dev *wdev,u64 cookie);int    (*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev,bool enabled, int timeout);int    (*set_cqm_rssi_config)(struct wiphy *wiphy,struct net_device *dev,s32 rssi_thold, u32 rssi_hyst);int    (*set_cqm_txe_config)(struct wiphy *wiphy,struct net_device *dev,u32 rate, u32 pkts, u32 intvl);void    (*mgmt_frame_register)(struct wiphy *wiphy,struct wireless_dev *wdev,u16 frame_type, bool reg);int  (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant);int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant);int   (*sched_scan_start)(struct wiphy *wiphy,struct net_device *dev,struct cfg80211_sched_scan_request *request);int (*sched_scan_stop)(struct wiphy *wiphy, struct net_device *dev);int (*set_rekey_data)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_gtk_rekey_data *data);int (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev,const u8 *peer, u8 action_code,  u8 dialog_token,u16 status_code, u32 peer_capability,bool initiator, const u8 *buf, size_t len);int   (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev,const u8 *peer, enum nl80211_tdls_operation oper);int  (*probe_client)(struct wiphy *wiphy, struct net_device *dev,const u8 *peer, u64 *cookie);int    (*set_noack_map)(struct wiphy *wiphy,struct net_device *dev,u16 noack_map);int  (*get_channel)(struct wiphy *wiphy,struct wireless_dev *wdev,struct cfg80211_chan_def *chandef);int (*start_p2p_device)(struct wiphy *wiphy,struct wireless_dev *wdev);void (*stop_p2p_device)(struct wiphy *wiphy,struct wireless_dev *wdev);int   (*set_mac_acl)(struct wiphy *wiphy, struct net_device *dev,const struct cfg80211_acl_data *params);int  (*start_radar_detection)(struct wiphy *wiphy,struct net_device *dev,struct cfg80211_chan_def *chandef,u32 cac_time_ms);int  (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_update_ft_ies_params *ftie);int    (*crit_proto_start)(struct wiphy *wiphy,struct wireless_dev *wdev,enum nl80211_crit_proto_id protocol,u16 duration);void    (*crit_proto_stop)(struct wiphy *wiphy,struct wireless_dev *wdev);int   (*set_coalesce)(struct wiphy *wiphy,struct cfg80211_coalesce *coalesce);int (*channel_switch)(struct wiphy *wiphy,struct net_device *dev,struct cfg80211_csa_settings *params);int     (*set_qos_map)(struct wiphy *wiphy,struct net_device *dev,struct cfg80211_qos_map *qos_map);int  (*set_ap_chanwidth)(struct wiphy *wiphy, struct net_device *dev,struct cfg80211_chan_def *chandef);int  (*add_tx_ts)(struct wiphy *wiphy, struct net_device *dev,u8 tsid, const u8 *peer, u8 user_prio,u16 admitted_time);int   (*del_tx_ts)(struct wiphy *wiphy, struct net_device *dev,u8 tsid, const u8 *peer);int   (*tdls_channel_switch)(struct wiphy *wiphy,struct net_device *dev,const u8 *addr, u8 oper_class,struct cfg80211_chan_def *chandef);void (*tdls_cancel_channel_switch)(struct wiphy *wiphy,struct net_device *dev,const u8 *addr);
};

cfg80211_ops结构体成员:

suspend
wiphy device needs to be suspended. The variable wow will be NULL or contain the enabled Wake-on-Wireless triggers that are configured for the device.

resume
wiphy device needs to be resumed

set_wakeup
Called when WoWLAN is enabled/disabled, use this callback to call device_set_wakeup_enable() to enable/disable wakeup from the device.

add_virtual_intf
create a new virtual interface with the given name, must set the struct wireless_dev’s iftype. Beware: You must create the new netdev in the wiphy’s network namespace! Returns the struct wireless_dev, or an ERR_PTR. For P2P device wdevs, the driver must also set the address member in the wdev.

del_virtual_intf
remove the virtual interface

change_virtual_intf
change type/configuration of virtual interface, keep the struct wireless_dev’s iftype updated.

add_key
add a key with the given parameters. mac_addr will be NULL when adding a group key.

get_key
get information about the key with the given parameters. mac_addr will be NULL when requesting information for a group key. All pointers given to the callback function need not be valid after it returns. This function should return an error if it is not possible to retrieve the key, -ENOENT if it doesn’t exist.

del_key
remove a key given the mac_addr (NULL for a group key) and key_index, return -ENOENT if the key doesn’t exist.

set_default_key
set the default key on an interface

set_default_mgmt_key
set the default management frame key on an interface

start_ap
Start acting in AP mode defined by the parameters.

change_beacon
Change the beacon parameters for an access point mode interface. This should reject the call when AP mode wasn’t started.

stop_ap

Stop being an AP, including stopping beaconing.

add_station
Add a new station.

del_station
Remove a station

change_station
Modify a given station. Note that flags changes are not much validated in cfg80211, in particular the auth/assoc/authorized flags might come to the driver in invalid combinations – make sure to check them, also against the existing state! Drivers must call cfg80211_check_station_change() to validate the information.

get_station
get station information for the station identified by mac

dump_station
dump station callback – resume dump at index idx

add_mpath
add a fixed mesh path

del_mpath
delete a given mesh path

change_mpath
change a given mesh path

get_mpath
get a mesh path for the given parameters

dump_mpath
dump mesh path callback – resume dump at index idx

get_mpp
get a mesh proxy path for the given parameters

dump_mpp
dump mesh proxy path callback – resume dump at index idx


get_mesh_config

Get the current mesh configuration

update_mesh_config
Update mesh parameters on a running mesh. The mask is a bitfield which tells us which parameters to set, and which to leave alone.

join_mesh
join the mesh network with the specified parameters (invoked with the wireless_dev mutex held)

leave_mesh
leave the current mesh network (invoked with the wireless_dev mutex held)

join_ocb
join the OCB network with the specified parameters (invoked with the wireless_dev mutex held)

leave_ocb
leave the current OCB network (invoked with the wireless_dev mutex held)

change_bss
Modify parameters for a given BSS.

set_txq_params
Set TX queue parameters

libertas_set_mesh_channel
Only for backward compatibility for libertas, as it doesn’t implement join_mesh and needs to set the channel to join the mesh instead.

set_monitor_channel
Set the monitor mode channel for the device. If other interfaces are active this callback should reject the configuration. If no interfaces are active or the device is down, the channel should be stored for when a monitor interface becomes active.

scan
Request to do a scan. If returning zero, the scan request is given the driver, and will be valid until passed to cfg80211_scan_done(). For scan results, call cfg80211_inform_bss(); you can call this outside the scan/scan_done bracket too.

abort_scan
Tell the driver to abort an ongoing scan. The driver shall indicate the status of the scan through cfg80211_scan_done().

auth
Request to authenticate with the specified peer (invoked with the wireless_dev mutex held)

assoc
Request to (re)associate with the specified peer (invoked with the wireless_dev mutex held)

deauth
Request to deauthenticate from the specified peer (invoked with the wireless_dev mutex held)

disassoc
Request to disassociate from the specified peer (invoked with the wireless_dev mutex held)

connect
Connect to the ESS with the specified parameters. When connected, call cfg80211_connect_result()/cfg80211_connect_bss() with status code WLAN_STATUS_SUCCESS. If the connection fails for some reason, call cfg80211_connect_result()/cfg80211_connect_bss() with the status code from the AP or cfg80211_connect_timeout() if no frame with status code was received. The driver is allowed to roam to other BSSes within the ESS when the other BSS matches the connect parameters. When such roaming is initiated by the driver, the driver is expected to verify that the target matches the configured security parameters and to use Reassociation Request frame instead of Association Request frame. The connect function can also be used to request the driver to perform a specific roam when connected to an ESS. In that case, the prev_bssid parameter is set to the BSSID of the currently associated BSS as an indication of requesting reassociation. In both the driver-initiated and new connect() call initiated roaming cases, the result of roaming is indicated with a call to cfg80211_roamed() or cfg80211_roamed_bss(). (invoked with the wireless_dev mutex held)


update_connect_params

Update the connect parameters while connected to a BSS. The updated parameters can be used by driver/firmware for subsequent BSS selection (roaming) decisions and to form the Authentication/(Re)Association Request frames. This call does not request an immediate disassociation or reassociation with the current BSS, i.e., this impacts only subsequent (re)associations. The bits in changed are defined in enum cfg80211_connect_params_changed. (invoked with the wireless_dev mutex held)

disconnect
Disconnect from the BSS/ESS or stop connection attempts if connection is in progress. Once done, call cfg80211_disconnected() in case connection was already established (invoked with the wireless_dev mutex held), otherwise call cfg80211_connect_timeout().

join_ibss
Join the specified IBSS (or create if necessary). Once done, call cfg80211_ibss_joined(), also call that function when changing BSSID due to a merge. (invoked with the wireless_dev mutex held)

leave_ibss
Leave the IBSS. (invoked with the wireless_dev mutex held)


set_mcast_rate

Set the specified multicast rate (only if vif is in ADHOC or MESH mode)

set_wiphy_params
Notify that wiphy parameters have changed; changed bitfield (see enum wiphy_params_flags) describes which values have changed. The actual parameter values are available in struct wiphy. If returning an error, no value should be changed.

set_tx_power
set the transmit power according to the parameters, the power passed is in mBm, to get dBm use MBM_TO_DBM(). The wdev may be NULL if power was set for the wiphy, and will always be NULL unless the driver supports per-vif TX power (as advertised by the nl80211 feature flag.)

get_tx_power
store the current TX power into the dbm variable; return 0 if successful

set_wds_peer
set the WDS peer for a WDS interface

rfkill_poll
polls the hw rfkill line, use cfg80211 reporting functions to adjust rfkill hw state

testmode_cmd
run a test mode command; wdev may be NULL


testmode_dump

Implement a test mode dump. The cb->args[2] and up may be used by the function, but 0 and 1 must not be touched. Additionally, return error codes other than -ENOBUFS and -ENOENT will terminate the dump and return to userspace with an error, so be careful. If any data was passed in from userspace then the data/len arguments will be present and point to the data contained in NL80211_ATTR_TESTDATA.

set_bitrate_mask
set the bitrate mask configuration

dump_survey
get site survey information.

set_pmksa
Cache a PMKID for a BSSID. This is mostly useful for fullmac devices running firmwares capable of generating the (re) association RSN IE. It allows for faster roaming between WPA2 BSSIDs.

del_pmksa
Delete a cached PMKID.

flush_pmksa
Flush all cached PMKIDs.

remain_on_channel
Request the driver to remain awake on the specified channel for the specified duration to complete an off-channel operation (e.g., public action frame exchange). When the driver is ready on the requested channel, it must indicate this with an event notification by calling cfg80211_ready_on_channel().


cancel_remain_on_channel

Cancel an on-going remain-on-channel operation. This allows the operation to be terminated prior to timeout based on the duration value.

mgmt_tx
Transmit a management frame.

mgmt_tx_cancel_wait
Cancel the wait time from transmitting a management frame on another channel

set_power_mgmt
Configure WLAN power management. A timeout value of -1 allows the driver to adjust the dynamic ps timeout value.

set_cqm_rssi_config
Configure connection quality monitor RSSI threshold. After configuration, the driver should (soon) send an event indicating the current level is above/below the configured threshold; this may need some care when the configuration is changed (without first being disabled.)

set_cqm_txe_config
Configure connection quality monitor TX error thresholds.


mgmt_frame_register

Notify driver that a management frame type was registered. The callback is allowed to sleep.

set_antenna
Set antenna configuration (tx_ant, rx_ant) on the device. Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may reject TX/RX mask combinations they cannot support by returning -EINVAL (also see nl80211.h NL80211_ATTR_WIPHY_ANTENNA_TX).

get_antenna
Get current antenna configuration from device (tx_ant, rx_ant).

sched_scan_start
Tell the driver to start a scheduled scan.

sched_scan_stop
Tell the driver to stop an ongoing scheduled scan. This call must stop the scheduled scan and be ready for starting a new one before it returns, i.e. sched_scan_start may be called immediately after that again and should not fail in that case. The driver should not call cfg80211_sched_scan_stopped() for a requested stop (when this method returns 0.)

set_rekey_data
give the data necessary for GTK rekeying to the driver

tdls_mgmt
Transmit a TDLS management frame.

tdls_oper
Perform a high-level TDLS operation (e.g. TDLS link setup).


probe_client

probe an associated client, must return a cookie that it later passes to cfg80211_probe_status().

set_noack_map
Set the NoAck Map for the TIDs.

get_channel
Get the current operating channel for the virtual interface. For monitor interfaces, it should return NULL unless there’s a single current monitoring channel.

start_p2p_device
Start the given P2P device.

stop_p2p_device
Stop the given P2P device.

set_mac_acl
Sets MAC address control list in AP and P2P GO mode. Parameters include ACL policy, an array of MAC address of stations and the number of MAC addresses. If there is already a list in driver this new list replaces the existing one. Driver has to clear its ACL when number of MAC addresses entries is passed as 0. Drivers which advertise the support for MAC based ACL have to implement this callback.

start_radar_detection
Start radar detection in the driver.

update_ft_ies
Provide updated Fast BSS Transition information to the driver. If the SME is in the driver/firmware, this information can be used in building Authentication and Reassociation Request frames.

crit_proto_start
Indicates a critical protocol needs more link reliability for a given duration (milliseconds). The protocol is provided so the driver can take the most appropriate actions.

crit_proto_stop
Indicates critical protocol no longer needs increased link reliability. This operation can not fail.

set_coalesce
Set coalesce parameters.

channel_switch
initiate channel-switch procedure (with CSA). Driver is responsible for veryfing if the switch is possible. Since this is inherently tricky driver may decide to disconnect an interface later with cfg80211_stop_iface(). This doesn’t mean driver can accept everything. It should do it’s best to verify requests and reject them as soon as possible.

set_qos_map
Set QoS mapping information to the driver

set_ap_chanwidth
Set the AP (including P2P GO) mode channel width for the given interface This is used e.g. for dynamic HT 20/40 MHz channel width changes during the lifetime of the BSS.

add_tx_ts
validate (if admitted_time is 0) or add a TX TS to the device with the given parameters; action frame exchange has been handled by userspace so this just has to modify the TX path to take the TS into account. If the admitted time is 0 just validate the parameters to make sure the session can be created at all; it is valid to just always return success for that but that may result in inefficient behaviour (handshake with the peer followed by immediate teardown when the addition is later rejected)

del_tx_ts
remove an existing TX TS

tdls_channel_switch
Start channel-switching with a TDLS peer. The driver is responsible for continually initiating channel-switching operations and returning to the base channel for communication with the AP.


tdls_cancel_channel_switch

Stop channel-switching with a TDLS peer. Both peers must be on the base channel when the call completes.

start_nan
Start the NAN interface.

stop_nan
Stop the NAN interface.

add_nan_func
Add a NAN function. Returns negative value on failure. On success nan_func ownership is transferred to the driver and it may access it outside of the scope of this function. The driver should free the nan_func when no longer needed by calling cfg80211_free_nan_func(). On success the driver should assign an instance_id in the provided nan_func.

del_nan_func
Delete a NAN function.

nan_change_conf
changes NAN configuration. The changed parameters must be specified in changes (using enum cfg80211_nan_conf_changes); All other parameters must be ignored.

set_multicast_to_unicast
configure multicast to unicast conversion for BSS

cfg80211 subsystem中的cfg80211_ops相关推荐

  1. cfg80211 subsystem中的wiphy

    无线网络设备驱动使用cfg80211需要硬件设备在cfg80211中实现注册.实现注册就要定义一系列的硬件功能描述的结构体. 每个设备的基础性结构体是wiphy,设备连接到系统时,都要使用.每个wip ...

  2. linux内核中的GPIO系统之(2):pin control subsystem

    一.前言 在linux2.6内核上工作的嵌入式软件工程师在pin control上都会遇到这样的状况: (1)启动一个新的项目后,需要根据硬件平台的设定进行pin control相关的编码.例如:在b ...

  3. Linux内核中的GPIO系统之(3):pin controller driver代码分析

    一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...

  4. linux内核中的GPIO系统之(1):软件框架

    一.前言 作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务.对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非常简单的任务,例如GPIO driver.LED d ...

  5. linux内核中的GPIO系统之(4):pinctrl驱动的理解和总结

    1. 前言 本站之前的三篇文章[1][2][3]介绍了pin controller(对应的pin controller subsystem).gpio controller(对应的GPIO subsy ...

  6. simulink中from与goto模块的使用

    转载:http://blog.sina.com.cn/s/blog_62fb88190100xe5o.html 首先,介绍goto/from的用法: 1.在一个subsystem中放置一个goto,g ...

  7. Linux内核中的GPIO系统

    一.前言 作为一个工作多年的系统工程师,免不了做两件事情:培训新员工和给新员工分配任务.对于那些刚刚从学校出来的学生,一般在开始的时候总是分配一些非常简单的任务,例如GPIO driver.LED d ...

  8. 【NVMe2.0b 10】Controller Shutdown 与 NVM Subsystem Shutdown

    Controller Shutdown 与 NVM Subsystem Shutdown 3.6Shutdown处理 3.6.1基于内存传输的Controller Shutdown 3.6.2基于消息 ...

  9. [RK3288][Android6.0] WiFi之cfg80211知识点小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 概念: cfg80211是Linux 802.11用于管理配置的一套API,它是用户和驱动之间的桥 ...

最新文章

  1. 日本漫画巨匠力作,看漫画就能学会Python,简直不要太轻松
  2. bash for循环_Bash 中的 For 循环
  3. Kalibr 标定双目内外参数以及 IMU 外参数
  4. Flex与.NET互操作:基于WebService的数据访问
  5. latex 目录层次设置
  6. con 元器件符号_protues的元件符号名称
  7. 【广义S变换】一维广义S变换对非平稳信号处理的matlab仿真
  8. 熟悉java的写什么毕业设计_计算机专业Java相关的毕业论文该如何写?
  9. java 杨辉三角_Java语言杨辉三角
  10. python 操作excel 的包 函数
  11. 鸡得呼吸道病会易发啥病 鸡喂什么药预防打喷嚏
  12. 解线性方程组的python实现(1)——高斯主元消去法
  13. 高德地图猎鹰sdk服务service Id的创建
  14. iCloud备份失败怎么办?iCloud无法备份解决办法分享!
  15. 2021年“全球乳业20强”榜单发布;全新版希尔顿花园酒店计划2025前在中国开业超200家 | 美通社头条...
  16. Vue.extend构造器
  17. Uboot中的MIPI DSI clk分析
  18. 01 - Empire Lupin One
  19. android用来管理通知,Android 中通知的基本使用
  20. 对于母版页的一些修改

热门文章

  1. 网络知识基础篇(网络分层和IP地址)
  2. css字体倾斜角度_css怎么设置倾斜的字体样式?(代码详解)
  3. 破解mariadb数据库密码
  4. 龙芯2k开发板Debian系统安装教程
  5. 建博第一天。。。希望每天都有进步,,加油!!!如你的昵称!!!
  6. MySQL配置参数大全
  7. C#获取微信打卡数据
  8. PWM(脉冲宽度调制)的工作原理、分类及其应用
  9. PDPS软件虚拟仿真:Lock TCPF功能介绍与使用方法
  10. 常用DOS命令之通俗易懂篇